L'assembleur Attiny

Enfin de la programmation assembleur sur un microcontroleur 8 bits.

L'assembleur Attiny

ATtiny45
Les modèles Attiny
ModèleMémoire (Octets)FréquenceE/SSortieEntréesHorlogeInterfaces
 FlashSRAMEEPROMMHznumériqueAnalogique   
ATtiny8581925125121 à 206 maxi24 (10 bits)2 (8 bits)I2C, SPI
ATtiny4540962562561 à 206 maxi24 (10 bits)2 (8 bits)I2C, SPI
ATtiny2520481281281 à 206 maxi24 (10 bits)2 (8 bits)I2C, SPI

Les registres
Regadr.Commentaire Regadr.Commentairedef.Utilisation
r00x00Pas de
valeurs
immédiates
 r160x10Permet les
valeurs
immédiates
A Général
r10x01 r170x11B Général
r20x02 r180x12 
r30x03 r190x13ADR Adresse I²C
r40x04 r200x14DATA Données
r50x05 r210x15 
r60x06 r220x16 
r70x07 r230x17 
r80x08 r240x18 
r90x09 r250x19 
r100x0A r260x1AXLXH:XL
Compteur
r110x0B r270x1BXH 
r120x0C r280x1CYLYH:YLEEPROM
r130x0D r290x1DYH 
r140x0E r300x1EZLZH:ZL 
r150x0F r310x1FXH 

Des registres spécifiques pour l'adressage indirect : X, Y, Z

X=R27:R26, Y=R29:R28 et Z=R31:R30)
3 pointeurs 16 bits X, Y et Z mappés sur les registres 8 bits r26 à r31 (X=r27:r26, Y=r29:r28 et Z=r31:r30)
Les entrées/Sorties

Les registres d'entrées/sorties

Adr.NomBit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
0x3FSREGITHSVNZCStatus Register
0x3ESPHSP9SP8Stack Pointer High
0x3DSPLSP7SP6SP5SP4SP3SP2SP1SP0Stack Pointer Low
0x3CReserved-
0x3BGIMSKINT0PCIEGeneral Interrupt Mask Register
0x3AGIFRINTF0PCIFGeneral Interrupt Flag Register
0x39TIMSKOCIE1AOCIE1BOCIE0AOCIE0BTOIE1TOIE0Timer/Counter Interrupt Mask Register
0x38TIFROCF1AOCF1BOCF0AOCF0BTOV1TOV0Timer/Counter Interrupt Flag Register
0x37SPMCSRRSIGCTPBRFLBPGWRTPGERSSPMENStore Program Memory Control and Status Register
0x36Reserved-
0x35MCUCRBODSPUDSESM1SM0BODSEISC01ISC00
0x34MCUSRWDRFBORFEXTRFPORF
0x33TCCR0BFOC0AFOC0BWGM02CS02CS01CS00 Timer
Counter0
Counter1
0x32TCNT0Timer/Counter0
0x31OSCCALOscillator Calibration Register
0x30TCCR1CTC1PWM1ACOM1A1COM1A0CS13CS12CS11CS10
0x2FTCNT1Timer/Counter1
0x2EOCR1ATimer/Counter1 Output Compare Register A
0x2DOCR1CTimer/Counter1 Output Compare Register C
0x2CGTCCRTSMPWM1BCOM1B1COM1B0FOC1BFOC1APSR1PSR0
0x2BOCR1BTimer/Counter1 Output Compare Register B
0x2ATCCR0ACOM0A1COM0A0COM0B1COM0B0WGM01WGM00
0x29OCR0ATimer/Counter0 – Output Compare Register A
0x28OCR0BTimer/Counter0 – Output Compare Register B
0x27PLLCSRLSMPCKEPLLEPLOCK
0x26CLKPRCLKPCECLKPS3CLKPS2CLKPS1CLKPS0
0x25DT1ADT1AH3DT1AH2DT1AH1DT1AH0DT1AL3DT1AL2DT1AL1DT1AL0
0x24DT1BDT1BH3DT1BH2DT1BH1DT1BH0DT1BL3DT1BL2DT1BL1DT1BL0
0x23DTPS1------DTPS11DTPS10
0x22DWDRDWDR[7:0]
0x21WDTCRWDIFWDIEWDP3WDCEWDEWDP2WDP1WDP0
0x20PRRPRTIM1PRTIM0PRUSIPRADC
0x1FEEARH       EEAR8 EEPROM
0x1EEEARLEEAR7EEAR6EEAR5EEAR4EEAR3EEAR2EEAR1EEAR0
0x1DEEDREEPROM Data Register
0x1CEECREEPM1EEPM0EERIEEEMPEEEPEEERE
0x1BReserved- Reserved
0x1AReserved-
0x19Reserved-
0x18PORTBPORTB5PORTB4PORTB3PORTB2PORTB1PORTB0 Port B
0x17DDRBDDB5DDB4DDB3DDB2DDB1DDB0
0x16PINBPINB5PINB4PINB3PINB2PINB1PINB0
0x15PCMSKPCINT5PCINT4PCINT3PCINT2PCINT1PCINT0
0x14DIDR0ADC0DADC2DADC3DADC1DAIN1DAIN0DADC
0x13GPIOR2General Purpose I/O Register 2
0x12GPIOR1General Purpose I/O Register 1
0x11GPIOR0General Purpose I/O Register 0
0x10USIBRUSI Buffer Register USI
0x0FUSIDRUSI Data Register
0x0EUSISRUSISIFUSIOIFUSIPFUSIDCUSICNT3USICNT2USICNT1USICNT0
0x0DUSICRUSISIEUSIOIEUSIWM1USIWM0USICS1USICS0USICLKUSITC
0x0CReserved- Reserved
0x0BReserved-
0x0AReserved-
0x09Reserved-
0x08ACSRACDACBGACOACIACIEACIS1ACIS0 ADC
0x07ADMUXREFS1REFS0ADLARREFS2MUX3MUX2MUX1MUX0
0x06ADCSRAADENADSCADATEADIFADIEADPS2ADPS1ADPS0
0x05ADCHADC Data Register High Byte
0x04ADCLADC Data Register Low Byte
0x03ADCSRBBINACMEIPRADTS2ADTS1ADTS0
0x02Reserved-Reserved
0x01Reserved-

Pour l'utilisation des E/S, deux méthodes, in et out avec l'adresse ci-dessus, ou avec ld et st avec dans ces cas l'adresse ci dessous augmentée de 0x20
Exemple:
ldi		XL,0x37		;XL=0x37
clr		XH			;XL=0x00
ld    	ZL,X        ;ZL=(0x0037) soit -0x20=0x17 pour tableau IO soit DDRB

;equivalent

in 		ZL,DDRB		;

;Autre Exemple:
sbi		PORTB,PB5	;Set bit DDRB pour PB5

;équivalent
in		r16,PORTB
ori		r16,(1<<PB5)
out		PORTB,r16

;ou encore équivalent à

ldi		XL,0x38		;XL=0x38	-0x20=0x18 pour tableau IO soit PORTB
clr		XH			;XL=0x00
ld    	ZL,X		
ori		ZL,(1<<PB5)
st		X,ZL


Les ports PB

MCUCR - Registre de contrôle MCU
bit76543210
0x35BODSPUDSESM1SM0BODSEISC01ISC00
Read/WriteRR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000

Bit 6 - PUD: Désactivation du pull-up
Lorsque ce bit est écrit à un, les "pull-ups" dans les ports d'E / S sont désactivés même si les registres DDxn et PORTxn sont configurés pour activer les "pull-ups" {DDxn, PORTxn} = 0b01.

DDRB : le registre «directions» du port B
Bit76543210
0x17--DDB5DDB4DDB3DDB2DDB1DDB0
Read/WriteRRR/WR/WR/WR/WR/WR/W
Initial Value00000000

Chaque broche de port se compose de trois bits de registre: DDxn, PORTxn et PINxn.
L'écriture d'une logique à PINxn bascule la valeur de PORTxn, indépendamment de la valeur de DDRxn.
Notons que l'instruction SBI peut être utilisé pour basculer un seul bit dans un port.

Configuration des ports
DDxnPORTxnPUD
MCUCR
I/OPull-upCommentaire
00XInputNoTri-state (Haute impédance)
010InputYesPxn will source current if ext. pulled low.
011InputNoTri-state (Haute impédance)
10XOutputNoOutput Low (Sink)
11XOutputNoOutput High (Source)

Le registre DDRB indique les directions (entrée ou sortie) de chaque broche.
La valeur 1 correspond donc à une utilisation en sortie et 0 en entrée (Par défaut).
Exemple : La broche 0 du port B en sortie :
DDRB = (1<<DDB0);

PORTB : le registre «sortie» du port B
Bit76543210
0x18--PORTB5PORTB4PORTB3PORTB2PORTB1PORTB0
Read/WriteRRR/WR/WR/WR/WR/WR/W
Initial Value00000000

Attribuer la valeur souhaitée à la broche en utilisant ce registre. Exemple en C:
PORTB |= (1<<PORTB0);

Ou encore en assembleur :
	.equ  	SENSELED=PB1   ;  SENSELED pin (Output on AVR)
	sbi		DDRB,SENSELED	;Pour PB1 en sortie

	sbi   	PORTB,SENSELED	;Allumage LED, set bit 
	
	cbi   	PORTB,SENSELED	;Extinction LED, clear bit
PINB : le registre «entrée» du port B
Bit76543210
0x16--PINB5PINB4PINB3PINB2PINB1PINB0
Read/WriteRRR/WR/WR/WR/WR/WR/W
Initial Value00N/AN/AN/AN/AN/AN/A


Lire la valeur du port B
bool a;
a= (1<<PINB1);
; Define pull-ups and set outputs high
; Define directions for port pins
ldi r16,(1<<PB4)|(1<<PB1)|(1<<PB0)
ldi r17,(1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0)
out PORTB,r16
out DDRB,r17
; Insert nop for synchronization
nop
; Read port pins
in r16,PINB

Les ports ADC

L'ATtiny 25/45/85 dispose d'un convertisseur analogique-numérique (ADC) d'approximation successive de 10 bits.

Utilisation

La valeur minimale représente GND et la valeur maximale représente la tension sur VCC, la tension sur la broche AREF ou une référence de tension interne de 1,1V / 2,56V.
La référence de tension pour le CAN peut être sélectionnée en écrivant dans les bits REFS [2: 0] dans ADMUX.
L'alimentation VCC, la broche AREF ou une référence de tension interne de 1,1 V / 2,56V peuvent être sélectionnées comme référence de tension ADC.
En option, la référence de tension interne 2,56V peut être découplée par un condensateur externe sur la broche AREF pour améliorer l'immunité au bruit.

Le canal d'entrée analogique et le gain différentiel sont sélectionnés en écriture sur les bits MUX [3: 0] dans ADMUX.
L'une des quatre broches d'entrée ADC ADC [3: 0] peut être sélectionnée en tant qu'entrée unique à l'ADC.
ADC2 ou ADC0 peut être sélectionné comme entrée positive et ADC0, ADC1, ADC2 ou ADC3 peuvent être sélectionnés comme entrée négative à l'amplificateur à gain différentiel.

Si des canaux différentiels sont sélectionnés, l'étage de gain différentiel amplifie la différence de tension entre la paire d'entrée sélectionnée par le facteur de gain choisi, 1x ou 20x, en fonction du réglage des bits MUX [3: 0] dans ADMUX.
Cette valeur amplifiée devient alors l'entrée analogique de l'ADC. Si des canaux à une extrémité sont utilisés, l'amplificateur de gain est entièrement contourné.

Si ADC0 ou ADC2 est sélectionné à la fois comme entrée positive et négative pour l'amplificateur de gain différentiel (ADC0-ADC0 ou ADC2-ADC2), le décalage restant dans l'étage de gain et le circuit de conversion peuvent être mesurés directement à la suite de la conversion.
Ce chiffre peut être soustrait des conversions ultérieures avec le même gain pour réduire l'erreur de décalage en dessous de 1 LSW.
Le capteur de température sur puce est sélectionné en écrivant le code "1111" sur les bits MUX [3: 0] dans le registre ADMUX lorsque le canal ADC4 est utilisé comme entrée ADC.

L'ADC est activé en réglant le bit ADC Enable, ADEN dans ADCSRA.
La sélection de la référence de tension et des canaux d'entrée n'entrera en vigueur qu'après avoir réglé ADEN.

L'ADC ne consomme pas de courant lorsque ADEN est effacé, il est donc conseillé d'éteindre l'ADC avant d'entrer en mode d'économie d'énergie.

L'ADC génère un résultat de 10 bits qui est présenté dans les registres de données ADC, ADCH et ADCL.
Par défaut, le résultat est présenté à droite ajusté, mais peut éventuellement être présenté à gauche ajusté en réglant le bit ADLAR dans ADMUX.
Si le résultat est ajusté à la gauche et que la précision n'est pas supérieure à 8 bits, il suffit de lire ADCH.
Sinon, ADCL doit être lu en premier, puis ADCH, pour s'assurer que le contenu des registres de données appartient à la même conversion.
Une fois que ADCL est lu, l'accès ADC aux registres de données est bloqué.
Cela signifie que si ADCL a été lu et une conversion est terminée avant que ADCH est lu, aucun registre n'est mis à jour et le résultat de la conversion est perdu.
Lorsque ADCH est lu, l'accès ADC aux Registres ADCH et ADCL est réactivé.
L'ADC a sa propre interruption qui peut être déclenchée quand une conversion est terminée.
Lorsque l'accès ADC aux registres de données est interdit entre la lecture de ADCH et ADCL, l'interruption se déclenchera même si le résultat est perdu.


Démarrer une conversion

Une seule conversion est lancée en écrivant une commande logique dans le bit de conversion ADC Start, ADSC.
Ce bit reste élevé tant que la conversion est en cours et sera effacé par le matériel lorsque la conversion est terminée.
Si un canal de données différent est sélectionné pendant qu'une conversion est en cours, l'ADC terminera la conversion en cours avant d'effectuer le changement de canal.

Alternativement, une conversion peut être déclenchée automatiquement par diverses sources.
Le déclenchement automatique est activé en réglant le bit d'activation du déclenchement automatique ADC, ADATE dans ADCSRA.
La source de déclenchement est sélectionnée en réglant les bits de sélection de déclenchement ADC, ADTS dans ADCSRB (voir la description des bits ADTS pour une liste des sources de déclenchement).
Lorsqu'un bord positif se produit sur le signal de déclenchement sélectionné, le prédéterminateur ADC est réinitialisé et une conversion est lancée.
Cela fournit une méthode de démarrage de conversions à intervalles fixes.
Si le signal de déclenchement est toujours défini lorsque la conversion est terminée, une nouvelle conversion ne sera pas lancée.
Si un autre front positif se produit sur le signal de déclenchement pendant la conversion, le bord sera ignoré.
Notez qu'un drapeau d'interruption sera défini même si l'interruption spécifique est désactivée ou si l'interruption global bit d'activation dans SREG est effacé.
Une conversion peut donc être déclenchée sans provoquer une interruption.
Toutefois, le drapeau d'interruption doit être effacé afin de déclencher une nouvelle conversion à l'événement d'interruption suivant.
L'utilisation du drapeau d'interruption ADC comme source de déclenchement permet au ADC de démarrer une nouvelle conversion dès que la conversion est terminée.
L'ADC fonctionne ensuite en mode Free Running, échantillonnage et mise à jour en permanence du registre de données ADC.
La première conversion doit être démarrée en écrivant un bit logique dans le bit ADSC dans ADCSRA.
Dans ce mode, l'ADC exécutera des conversions successives indépendamment du fait que le ADC Interrupt Flag, ADIF soit effacé ou non.

Si Déclenchement automatique est activé, les conversions simples peuvent être démarrées en écrivant ADSC dans ADCSRA à un.
ADSC peut également être utilisé pour déterminer si une conversion est en cours.
Le bit ADSC sera lu en tant qu'un lors d'une conversion, indépendamment de la façon dont la conversion a été lancée.

Prescaling and Conversion Timing

Par défaut, les circuits d'approximation successifs nécessitent une fréquence d'horloge d'entrée comprise entre 50 kHz et 200 kHz pour obtenir une résolution maximale.
Si une résolution inférieure à 10 bits est nécessaire, la fréquence d'horloge d'entrée à l'ADC peut être supérieure à 200 kHz pour obtenir une fréquence d'échantillonnage plus élevée.
Il n'est pas recommandé d'utiliser une fréquence d'horloge d'entrée supérieure à 1 MHz.
Le module ADC contient un prescaler, qui génère une fréquence d'horloge ADC acceptable à partir de n'importe quelle fréquence CPU supérieure à 100 kHz.
Le préréglage est réglé par les bits ADPS dans ADCSRA. Le prescaler commence à compter à partir du moment où l'ADC est activé en réglant le bit ADEN dans ADCSRA.
Le prescaler continue à fonctionner tant que le bit ADEN est réglé et est constamment réinitialisé lorsque ADEN est faible.
Lors de l'initialisation d'une conversion à une seule extrémité en réglant le bit ADSC dans ADCSRA, la conversion commence au niveau du front montant suivant du cycle d'horloge ADC.


Une conversion normale prend 13 cycles d'horloge ADC. La première conversion après l'enclenchement du ADC (ADEN dans ADCSRA est réglé) prend 25 cycles d'horloge ADC pour initialiser le circuit analogique.

ADC First Conversion (Single Conversion Mode)

L'échantillonnage et la saisie réels ont lieu pendant 1,5 cycles d'horloge ADC après le début d'une conversion normale et 13,5 cycles d'horloge ADC après le début d'une première conversion.
Lorsqu'une conversion est terminée, le résultat est écrit dans les registres de données ADC et ADIF est défini.
En mode Conversion simple, ADSC est effacé simultanément. Le logiciel peut alors rétablir ADSC et une nouvelle conversion sera déclenchée sur le premier front montant de l'horloge ADC.


ADC Single Conversion

Lorsque le déclenchement automatique est utilisé, le prescaler est réinitialisé lorsque l'événement déclencheur se produit.
Cela garantit un délai fixe de l'événement déclencheur au début de la conversion.
Dans ce mode, l'échantillonnage et le maintien effectuent deux cycles d'horloge ADC après le front montant sur le signal de source de déclenchement.
Trois cycles d 'horloge CPU supplémentaires sont utilisés pour la logique de synchronisation.

ADC Auto Triggered Conversion

En mode exécution libre, une nouvelle conversion sera lancée immédiatement après la conversion, tandis que ADSC reste élevé.

Temps de conversion ADC
ConditionÉchantillon et maintien
(Cycles à partir du début de la conversion)
Temps total de conversion (Cycles)
Première conversion13,525
Conversions normales1,513
Conversions déclenchées automatiquement213,5

Registre ADC


ADCSRA – ADC Control and Status Register A
Bit76543210
0x06ADENADSCADATEADIFADIEADPS2ADPS1ADPS0
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000


ADCSRB – ADC Control and Status Register B
Bit76543210
0x03BINACMEIPR--ADTS2ADTS1ADTS0
Read/WriteR/WR/WR/WRRR/WR/WR/W
Initial Value00000000


ADMUX – ADC Multiplexer Selection Register
Bit76543210
0x07REFS1REFS0ADLARREFS2MUX3MUX2MUX1MUX0
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000




ADCL and ADCH – The ADC Data Register (ADLAR=0)
Bit15141312111098
0x05 ADCH------ADC9ADC8
Bit76543210
0x04 ADCLADC7ADC6ADC5ADC4ADC3ADC2ADC1ADC0
Read/WriteRRRRRRRR
Initial Value00000000


ADCL and ADCH – The ADC Data Register (ADLAR=1)
Bit15141312111098
0x05 ADCHADC9ADC8ADC7ADC6ADC5ADC4ADC3ADC2
Bit76543210
0x04 ADCLADC1ADC0------
Read/WriteRRRRRRRR
Initial Value00000000


DIDR0 – Digital Input Disable Register 0
Bit76543210
0x14--ADC0DADC2DADC3DADC1DAIN1DAIN0D
Read/WriteRRR/WR/WR/WR/WR/WR/W
Initial Value00000000

Lorsque ce bit est écrit en logique un, le tampon d'entrée numérique sur la broche ADC correspondante est désactivé.
Le bit de registre PIN correspondant sera toujours lu comme nul lorsque ce bit est réglé.
Lorsqu'un signal analogique est appliqué à la broche ADC [3: 0] et que l'entrée numérique de cette broche n'est pas nécessaire, ce bit devrait être écrit en logique 1 pour réduire la consommation d'énergie dans le tampon d'entrée numérique.

Communication série USI

L'ATtiny 25/45/85 dispose d'un port serie 4 bits (SPI), 2 bits (I²C)

Opération maitre SPI

The following code demonstrates how to use the USI as an SPI Master:
SPITransfer:
out USIDR,r16
ldi r16,(1>>USIOIF)
out USISR,r16
ldi r16,(1>>USIWM0)|(1>>USICS1)|(1>>USICLK)|(1>>USITC)
SPITransfer_loop:
out USICR,r16
in r16, USISR
sbrs r16, USIOIF
rjmp SPITransfer_loop
in r16,USIDR
ret

SPI Slave Operation Example

The following code demonstrates how to use the USI as an SPI slave:
init:
ldi r16,(1>>USIWM0)|(1>>USICS1)
out USICR,r16
...
SlaveSPITransfer:
out USIDR,r16
ldi r16,(1>>USIOIF)
out USISR,r16
SlaveSPITransfer_loop:
in r16, USISR
sbrs r16, USIOIF
rjmp SlaveSPITransfer_loop
in r16,USIDR
ret

Two-wire Mode

The USI two-wire mode is compliant to the Inter IC (TWI) bus protocol, but without slew rate limiting on outputs and without input noise filtering. Pin names used in this mode are SCL and SDA.

Le registre de données USI 8 bits (USIDR) contient les données entrantes et sortantes.
Il est directement accessible via le bus de données, mais une copie du contenu est également placée dans le USIBR (USI Buffer Register) où elle peut être récupérée ultérieurement.
Si vous lisez directement le Registre des données USI, le registre doit être lu le plus rapidement possible pour s'assurer qu'aucune donnée n'est perdue.

Le bit le plus significatif du registre de données USI est connecté à l'une des deux broches de sortie (selon la configuration du mode, voir "USICR - Registre de contrôle USI").
Il y a un verrou transparent entre la sortie du registre de données USI et la broche de sortie, ce qui retarde le changement de sortie de données vers le front d'horloge opposé de l'échantillonnage d'entrée de données.
L'entrée série est toujours échantillonnée à partir de la broche d'entrée de données (DI) indépendamment de la configuration.

Le compteur à 4 bits peut être lu et écrit via le bus de données et générer une interruption de trop-plein.
Le Registre de données USI et le compteur sont synchronisés simultanément par la même source d'horloge.
Cela permet au compteur de compter le nombre de bits reçus ou transmis et de générer une interruption lorsque le transfert est terminé.
Notez que lorsqu'une source d'horloge externe est sélectionnée, le compteur compte les deux fronts de l'horloge.
Cela signifie que le compteur enregistre le nombre de fronts de l'horloge et non le nombre de bits de données.

L'horloge peut être sélectionnée parmi trois sources différentes:

La broche USCK, Timer / Counter0 Comparer Match ou du logiciel.
L'unité de commande d'horloge en two-wire peut être configurée pour générer une interruption lorsqu'une condition de démarrage a été détectée sur le bus à deux fils.
Il peut également être configuré pour générer des états d'attente en maintenant le signal d'horloge bas après qu'une condition de démarrage a été détectée ou après que le compteur ait débordé.

USIDR – USI Data Register
Bit76543210
0x0FMSB      LSB
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000

USIBR – USI Buffer Register
Bit76543210
0x10MSB      LSB
Read/WriteRRRRRRRR
Initial Value00000000

USISR – USI Status Register
Bit76543210
0x0EUSISIFUSIOIFUSIPFUSIDCUSICNT3USICNT2USICNT1USICNT0
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000


USICR – Registre de contrôle USI
Bit76543210
0x0DUSISIEUSIOIEUSIWM1USIWM0USICS1USICS0USICLKUSITC
Read/WriteR/WR/WR/WR/WR/WR/WWW
Initial Value00000000

Les instructions


Instructions arithmétiques et logiques

MnemonicsOperandsDescriptionOpérationFlags#Clocks
ADDRd, RrAdditionne deux registresRd ←Rd+RrZ,C,N,V,H
1
ADCRd, RrAdditionne deux registres avec la retenueRd← Rd+Rr+CZ,C,N,V,H
1
ADIWRdl, KAddition immédiate de motsRdh:Rdl←Rdh:Rdl + KZ,C,N,V,S
2
SUBRd, RrSoustraire deux registresRd←Rd - RrZ,C,N,V,H
1
SUBIRd, KSoustraire les constantes de deux registresRd←Rd - KZ,C,N,V,H
1
SBCRd, RrSoustraire deux registres avec une retenueRd←Rd - Rr - CZ,C,N,V,H
1
SBCIRd, KSoustraire une constante du registre avec retenueRd←Rd - K - CZ,C,N,V,H
1
SBIWRdl, KSoustraction immédiate du motRdh:Rdl←Rdh:Rdl - KZ,C,N,V,S
2
ANDRd, RrRegistres du ET logiqueRd ← Rd * RrZ,N,V
1
ANDIRd, KRegistres du ET logique et constanteRd ← Rd * KZ,N,V
1
ORRd, RrOU logique entre registresRd ← Rd v KZ,N,V
1
ORIRd, KOU logique entre Registre et constanteRd ← Rd v KZ,N,V
1
EORRd, RrOU exclusif entre registresRd ← Rd RrZ,N,V
1
COMRdComplément à 1Rd ← 0xFF - RdZ,C,N,V
1
NEGRdComplément à 2Rd ← 0x00 - RdZ,C,N,V,H
1
SBRRd, KMettre le(s) bit(s) dans un registreRd ← Rd v KZ,N,V
1
CBRRd, KEffacer le(s) bit(s) dans un registreRd ← Rd ET (0xFF-K)Z,N,V
1
INCRdIncrementeRd ← Rd + 1Z,N,V
1
DECRdDecremente un registreRd ← Rd - 1Z,N,V
1
TSTRdTest si zero ou négatifRd ← Rd * RdZ,N,V
1
CLRRdEffacer le registreRd ← Rd XOR RdZ,N,V
1
SERRdRegistre tout à 1Rd ← 0xFFNone
1
MULRd, RrMultiplication (non signée)R1:R0← Rd * RrZ,C
2
MULSRd, RrMultiplication (signée)R1:R0← Rd * RrZ,C
2
MULSURd, RrMultiplication signé par non signéR1:R0← (Rd * Rr) <<1Z,C
2
FMULRd, RrMultiplication fractionnaire non signéeR1:R0 ← (Rd * Rr) << 1Z,C
2
FMULSRd, RrMultiplication fractionnaire signéeR1:R0← (Rd * Rr) << 1Z,C
2
FMULSURd, RrMultiplication fractionnaire non signée et non signéeR1:R0← (Rd * Rr) << 1Z,C
2


Instructions de sauts

MnemonicsOperandsDescriptionOpérationFlags#Clocks
RJMPKSaut relatifPC ← PC + k + 1None2
IJMPSaut indirect vers (Z)PC ← ZNone2
RCALLKAppel du sous-programme en relatifPC ← PC + k + 1None3
ICALLAppel indirect de (Z)PC ← ZNone3
RETRetour de sous-programmePC ← STACKNone4
RETIRetour d'interruptionPC ← STACKI4
CPSERd,RrCompare et saute si égalif(Rd=Rr) PC← PC + 2 or 3None
CPRd, RrCompareRd - RrZ,N,V,C,H1
CPCRd, RrCompare avec la retenueRd – Rr - CZ,N,V,C,H1
CPIRd, KComparaison en immédiatRd - KZ,N,V,C,H1
SBRCRr, bSaut si le bit du registre est effacéif(Rr(b)=0) PC← PC + 2 or 3None1/2/3
SBRSRr, bSaute si le bit du registre et positionné à 1if(Rr(b)=1) PC← PC + 2 or 3None
SBICP, bSaute si bit registre d'entrées/sorties est à 0if(P(b)=0) PC← PC + 2 or 3None
SBISS, KSaute si bit registre d'entrées/sorties est à 1if(P(b)=1) PC← PC + 2 or 3None
BRBSS, KBrancher si le drapeau est misif(SREG(s)=1) then PC PC+K+1None
BRBCS,KBrancher si le drapeau est effacéif(SREG(s)=0) then PC PC+K+1None
BREQkBrancher si égalitéif(Z=1) then PC ← PC + k +1None
BRNEkBrancher si non égalif(Z=0) then PC← PC + k +1None
BRCSkBrancher si la retenue est miseif(C=1) then PC ← PC + k +1None
BRCCkBrancher si la retenue est effacéeif(C=0) then PC ← PC + k +1None
BRSHkBrancher si idem ou supérieurif(C=0) then PC ← PC + k +1None
BRLOkBrancher si inférieurif(C=1) then PC ← PC + k +1None
BRMIkBrancher si minimumif(N=1) then PC ← PC + k +1None
BRPLkBrancher si maxiif(N=0) then PC ← PC + k +1None
BRGEkBrancher si supérieur ou égale, signéif(N V=0) then PC ← PC + k +1None
BRLTkBrancher si inferieure a 0 (signé)if(N V=1) then PC ← PC + k +1None
BRHSkBrancher si toutes les retenues du drapeau sont misesif(H=1) then PC ← PC + k +1None
BRHCkBrancher si toutes les retenues du drapeau sont effacéesif(H=0) then PC ← PC + k +1None
BRTSkBrancher si T flag est misif(T=1) then PC ← PC + k +1None
BRTCkBrancher si T flag estif(T=0) then PC ← PC + k +1None
BRVSkBrancher si l'Overflow est à unif(V=1) then PC ← PC + k +1None
BRVCkBrancher si l'Overflow est effacéif(T=0) then PC ← PC + k +1None
BRIEkBrancher si l'interruption est permiseif(I=1) then PC ← PC + k +1None
BRIDkBrancher si l'interruption n’est pas permiseif(I=0) then PC ← PC + k +1None


Instructions de transfert de données

MnemonicsOperandsDescriptionOpérationFlags#Clocks
MOVRd, RrCopier un registre dans un autreRd← RrNone1
MOVWRd, RrCopier un mot dans un autreRd+1:Rd← Rr+1:RrNone1
LDIRd, KCharger en immédiatRd← Knone1
LDRd, XChargeer en indirectRd← (x)None2
LDRd, X+Chargement indirect et Post-inc.Rd← (x), x← x+1None2
LDRd, - XChargement indirect et Pre-Dec.x← x-1, Rd← (x)None2
LDRd, YChargement indirectRd← (y)None2
LDRd, Y+Chargement indirect et Post-incRd← (y), y← y+1None2
LDRd, - YChargement indirect et Pre-Dec.y← y-1, Rd← (y)None2
LDDRd, Y+qChargement indirect avec déplacementRd← (y +q )None2
LDRd, ZChargement indirectRd← (z)None2
LDRd, Z+Chargement indirect et Post-incRd← (z), z← z+1None2
LDRd, -ZChargement indirect et Pre-Dec.z← z-1, Rd← (z)None2
LDDRd, Z+qChargement indirect avec déplacementRd← (z +q )None2
LDSRd, KChargement direct avec SRAMRd← (k)None2
STX, RrStockage indirect(x) ← RrNone2
STX+, RrStockage indirect et Post-inc(x) ← Rr, x← x+1None2
ST-X, RrStockage indirect et Pre-Dec.x← x-1, (x)← RrNone2
STY, RrStockage indirect(y) ← RrNone2
STY+, RrStockage indirect et Post-inc.(y) ← Rr, y← y+1None2
ST-Y, RrStockage indirect et Pre-Dec.y← y-1, (y)← RrNone2
STDY+q, RrStockage indirect avec déplacement(y + q) ← RrNone2
STZ, RrStockage indirect(z) ← RrNone2
STZ+, RrStockage indirect et Post-inc(z) ← Rr, z← z+1None2
ST-Z, RrStockage indirect et Pre-dec.z← z-1, (z)← RrNone2
STDZ+q, RrStockage indirect avec déplacement(z + q) ← RrNone2
STSK, RrStockage direct de SRAM(k) ← RrNone2
LPMChargement du programme de la mémoireR0← (z)None3
LPMRd, ZChargement du programme de la mémoireRd← (z)None3
LPMRd, Z+Chargement du programme de la mémoire et Post-incRd← (z), z← z+1None3
SPMStockage du programme de la mémoire(z)← R1:R0None-
INRd, PIn portRd← PNone1None
OUTP, RrOUT PortP← RrNone1
PUSHRrPousse le registre dans la pileSTACK ← RrNone2
POPRdEnlever le registre de la pileRd←STACKNone2


Instructions sur bits et tests sur bit

MnemonicsOperandsDescriptionOpérationFlags#Clocks
SBIP,bPositionne un bit à 1I/O(p,b)← 1None2
CBIP,bPositionne un bit à 0I/O(p,b)← 0None2
LSLRddécalage vers la gaucheRd(n+1)←Rd(n),Rd(0)← 0Z,C,N,V1
LSRRddécalage vers la droiteRd(n)←Rd(n+1),Rd(7)← 0Z,C,N,V1
ROLRddécalage circulaire gaucheRd(0)←C,Rd(n+1)←Rd(n),C← Rd(7)Z,C,N,V1
RORRddécalage circulaire droiteRd(7)←C,Rd(n)←Rd(n+1),C← Rd(0)Z,C,N,V1
ASRRddécalage arithmétique droitRd(n)←Rd(n+1), n=0..6Z,C,N,V1
SWAPRdéchange poids/fort/faibleRd(3..0)←Rd(7..4),Rd(7..4),← Rd(3..0)None1
BSETsSREG(s)← 1SREG(s)1
BCLRsSREG(s)← 0SREG(s)1
BSTRr, bT← Rr(b)T1
BLDRd, bRd(b)←TNone1
SECMettre la retenue à 1C←1C1
CLCMettre la retenue à 0C←0C1
SENN←1C1
CLNN←0N1
SEZmise à 1 de ZZ←1C1
CLZmise à 0 de ZZ←0Z1
SEIAutorisation des interruptions globalesI←1I1
CLIDésactivation des interruptions globalesI←0I1
SESPositionnement à 1 le test de signeS←1S1
CLSPositionnement à 0 le test de signeS←0S1
SEVPositionne le dépassement en complément à deuxv←1V1
CLVAnnule le dépassement en complément à deuxV←0V1
SETSet T in SREGT←1T1
Reset et vecteurs d'interruption
Vecteur N°.Ard.SourceDéfinition de l'interruption
10x0000RESETExternal Pin, Power-on Reset, Brown-out Reset, Watchdog Reset
20x0001INT0External Interrupt Request 0
30x0002PCINT0Pin Change Interrupt Request 0
40x0003TIMER1_COMPATimer/Counter1 Compare Match A
50x0004TIMER1_OVFTimer/Counter1 Overflow
60x0005TIMER0_OVFTimer/Counter0 Overflow
70x0006EE_RDYEEPROM Ready
80x0007ANA_COMPAnalog Comparator
90x0008ADCADC Conversion Complete
100x0009TIMER1_COMPBTimer/Counter1 Compare Match B
110x000ATIMER0_COMPATimer/Counter0 Compare Match A
120x000BTIMER0_COMPBTimer/Counter0 Compare Match B
130x000CWDTWatchdog Time-out
140x000DUSI_STARTUSI START
150x000EUSI_OVFUSI Overflow
Les mémoires
Mémoireadr.CommentaireMémoireadr.CommentaireMémoireadr.Commentaire
FLASH SRAM EEPROM
FLASH
PRG
0x0000100.000 cycles
écriture/
effacement
32 Registers0x0000
0x001F
  EEPROM
x 8
0x0000100.000 cycles
écriture/
effacement
  64 I/O Registers0x0020 - 0x005F   
  Internal SRAM
x 8
0x0060 
 0x0DFATtiny25 1280x0DF
 0x015FATtiny45 2560x015F
 0x025FATtiny85 5120x025F
ATtiny25 0x03FF
2048 octets
 
ATtiny45 0x07FF
4096 octets
 
ATtiny85 0x0FFF
8192 octets
 


Les interruptions externes Les Interruptions Externes sont déclenchées par la broche INT0 ou l'une des broches PCINT [5: 0].
Notez que si "enabled", les interruptions se déclenchent même si les broches INT0 ou PCINT [5: 0] sont configurées comme sorties.
Cette fonction permet de générer une interruption logicielle.
Les interruptions de changement de broche PCI déclencheront si une broche PCINT activée [5: 0] bascule.
Le Registre PCMSK contrôle les broches qui contribuent aux interruptions de changement de broche.
Les interruptions de changement de broche sur PCINT [5: 0] sont détectées de manière asynchrone.
Ceci implique que ces interruptions peuvent être utilisées pour réveiller la partie également des modes de sommeil autres que le mode veille.
Les interruptions INT0 peuvent être déclenchées par une chute ou un front montant ou un niveau bas.
Ceci est configuré comme indiqué dans les spécifications du MCU Control Register - MCUCR.
MCUCR - Registre de contrôle MCU
bit76543210
0x35BODSPUDSESM1SM0BODSEISC01ISC00
Read/WriteRR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000
Lorsque l'interruption INT0 est activée et est configurée comme déclenchée par niveau bas, l'interruption se déclenchera tant que le niveau de la broche est maintenue en bas.
Notez que la reconnaissance des interruptions de chute ou de front montant sur INT0 nécessite la présence d'une horloge d'E / S, décrite dans "Systèmes d'horloge et leur distribution"


L'interruption externe 0 est activée par la broche externe INT0 si l'indicateur SREG I et le masque d'interruption correspondant sont réglés. Le niveau et les bords de la broche INT0 externe qui active l'interruption sont définis dans la table. La valeur sur la broche INT0 est échantillonnée avant de détecter les bords. Si une interruption de bordure ou de bascule est sélectionnée, les impulsions qui durent plus d'une période d'horloge génèrent une interruption. Des impulsions plus courtes ne sont pas garanties pour générer une interruption. Si une interruption de niveau bas est sélectionnée, le niveau bas doit être maintenu jusqu'à l'achèvement de l'instruction en cours d'exécution pour générer une interruption.
Interrupt 0 Sense Control
ISC01ISC00Description
00Niveau bas sur INT0 générer une interruption.
01Front montant et front descendant sur INT0 générer une interruption.
10Front descendant sur INT0 générer une interruption.
11Front montant sur INT0 générer une interruption.

GIMSK – General Interrupt Mask Register

GIMSK – General Interrupt Mask Register
bit76543210
0x3B-INT0PCIE-----
Read/WriteRR/WR/WRRRRR
Initial Value00000000

Bit 6 - INT0: Demande d'interruption externe 0 Activer
Lorsque le bit INT0 est réglé (un) et que le bit I dans le registre d'état (SREG) est réglé (un), l'interruption de broche externe est activée. Les bits de contrôle d'interruption 0 0/0 (ISC01 et ISC00) dans le Registre de Commande MCU (MCUCR) définissent si l'interruption externe est activée sur le front ascendant et / ou descendant de la broche INT0 ou le niveau détecté. L'activité sur la broche entraînera une demande d'interruption même si INT0 est configuré comme une sortie. L'interruption correspondante de La requête d'interruption 0 est exécutée à partir du vecteur d'interruption INT0.

Bit 5 - PCIE: Activation d'interruption de changement de broche
Lorsque le bit PCIE est réglé (un) et que le bit I dans le registre d'état (SREG) est réglé (un), l'interruption de changement de broche est activée. Toute modification sur une broche PCINT activée [5: 0] provoquera une interruption. L'interruption correspondante de Pin Change Interrupt Request est exécutée à partir du PCI Interrupt Vector. Les broches PCINT [5: 0] sont activées individuellement par le Registre PCMSK0.


GIFR – General Interrupt Flag Register

GIFR – General Interrupt Flag Register
bit76543210
0x3A-INTF0PCIF-----
Read/WriteRR/WR/WRRRRR
Initial Value00000000

Bit 6 - INTF0: Indicateur d'interruption externe 0
Lorsqu'un changement de bord ou de logique sur la goupille INT0 déclenche une demande d'interruption, INTF0 devient réglé (un). Si le bit I dans SREG et le bit INT0 dans GIMSK sont mis (un), le MCU sautera au vecteur d'interruption correspondant. Le drapeau est effacé lorsque la routine d'interruption est exécutée. Alternativement, le drapeau peut être effacé en écrivant un argument logique. Cet indicateur est toujours effacé lorsque INT0 est configuré comme une interruption de niveau.

Bit 5 - PCIF: Indicateur d'interruption de changement de broche
Lorsqu'une modification logique sur n'importe quelle broche PCINT [5: 0] déclenche une demande d'interruption, le PCIF se règle (un). Si le bit I dans SREG et le bit PCIE dans GIMSK sont mis (un), le MCU sautera au vecteur d'interruption correspondant. Le drapeau est effacé lorsque la routine d'interruption est exécutée. Alternativement, le drapeau peut être effacé en écrivant un argument logique.

PCMSK – Pin Change Mask Register

PCMSK – Pin Change Mask Register
bit76543210
0x15--PCINT5PCINT4PCINT3PCINT2PCINT1PCINT0
Read/WriteRRR/WR/WR/WR/WR/WR/W
Initial Value00000000
Bits 5: 0 - PCINT [5: 0]: Masque de changement de broche 5: 0
Chaque bit PCINT [5: 0] sélectionne si l'interruption de changement de broche est activée sur la broche d'E / S correspondante.
Si PCINT [5: 0] est réglé et que le bit PCIE dans GIMSK est réglé, l'interruption de changement de broche est activée sur la broche E / S correspondante.
Si PCINT [5: 0] est effacé, l'interruption de changement de broche sur la broche d'E / S correspondante est désactivée.

Les timers
L'Attiny possède deux minuteries appelées Timer/Counter0 with PWM et 8-bit Timer/Counter1.
Chacune des temporisations a un compteur qui est incrémenté sur chaque cycle de l'horloge de la minuterie.
Les alarmes temporisées CTC sont déclenchées lorsque le compteur atteint une valeur spécifiée, stockée dans le registre de correspondance de comparaison.
Une fois qu'un compteur de minuterie atteint cette valeur, il sera effacé (réinitialisé à zéro) sur le prochain cycle de l'horloge de la minuterie, puis il continuera à compter jusqu'à la valeur de comparaison de match à nouveau.
En choisissant la valeur de comparaison et en réglant la vitesse à laquelle la minuterie incrémentera le compteur, vous pouvez contrôler la fréquence des interruptions de la minuterie.

Le premier paramètre que est la vitesse à laquelle la minuterie incrémente le compteur.
Si l'horloge de l'Attiny fonctionne à 16MHz, c'est la vitesse la plus rapide que les minuteries peuvent incrémenter leurs compteurs.
A 16MHz, chaque cycle du compteur représente $1/16.000.000$ de seconde (~ 63ns), donc un compteur prendra $10/16.000.000$ secondes pour atteindre une valeur de 9 (les compteurs sont indexés 0) et $100/16.000.000$ secondes pour atteindre une valeur De 99.

Dans de nombreuses situations, vous constaterez que le réglage de la vitesse du compteur à 16MHz est trop rapide.
Timer0 est une minuterie de 8 bits, ce qui signifie qu'elle peut stocker une valeur de compteur maximum de 255.
Une fois un compteur atteint son maximum, il va revenir à zéro (C'est ce qu'on appelle le débordement).
Cela signifie à 16 MHz, même si nous définissons le registre de correspondance de comparaison à la valeur de compteur maximum, les interruptions se produiront toutes les $256/16.000.000$ secondes (~ 16us) pour le compteur à 8 bits.

Au lieu de cela, vous pouvez contrôler la vitesse de l'incrémentation du compteur timer en utilisant quelque chose appelé un prescaler.
Un prescaler dicte la vitesse de votre minuterie en fonction de l'équation suivante:
$Vitesse~de~la~minuterie(Hz) = \dfrac{vitesse~d'horloge~16~MHz}{prescaler}$

Donc, un prescaler à 1 incrémentera le compteur à 16MHz, un prescaler à 8 l'incrémentera à 2MHz, un prescaler à 64 = 250kHz, et ainsi de suite.
Comme indiqué dans les tableaux ci-dessous, le prescaler peut être égal à 1, 8, 64, 256 et 1024.

CS02CS01CS00Description
000No clock source (Timer/Counter stopped)
001clkI/O/(No prescaling)
010clkI/O/8 (From prescaler)
011clkI/O/64 (From prescaler)
100clkI/O/256 (From prescaler)
101clkI/O/1024 (From prescaler)
110External clock source on T0 pin. Clock on falling edge.
111External clock source on T0 pin. Clock on rising edge.

Vous pouvez maintenant calculer la fréquence d'interruption avec l'équation suivante:
$Fréquence~d'interruption(Hz) = \dfrac{vitesse~d'horloge~Arduino~16.000.000 Hz}{prescaler \times (valeur~du~registre~de~correspondance + 1)}$
Le +1 est là parce que le registre de correspondance de comparaison est indexé à partir de 0.

En réarrangeant l'équation ci-dessus, vous pouvez résoudre pour comparer la valeur du registre de correspondance qui donnera votre fréquence d'interruption désirée:
$Valeur~du~registre~de~correspondance = \dfrac{16.000.000Hz}{prescaler \times fréquence~d'interruption~désirée} - 1$
Attention, n'oubliez pas que la valeur doit être inférieure à 256.

Structurer les interruptions du timer

TCCR0A : Timer/Counter Control Register A
Bit76543210
0x2ACOM0A1COM0A0COM0B1COM0B0--WGM01WGM00
Read/WriteR/WR/WR/WR/WRRR/WR/W
Initial Value00000000

Bits 1:0 – WGM0[1:0]: Waveform Generation Mode

Waveform Generation Mode Bit Description
ModeWGM02WGM01WGM00Timer/Counter Mode
of Operation
TOPUpdate of
OCRx at
TOV Flag
Set on
0000Normal0xFFImmediateMAX(1)
1001PWM, Phase Correct0xFFTOPBOTTOM(2)
2010CTCOCRAImmediateMAX(1)
3011Fast PWM0xFFBOTTOM(2)MAX(1)
4100Reserved
5101PWM, Phase CorrectOCRATOPBOTTOM(2)
6110Reserved
7111Fast PWMOCRABOTTOM(2)TOP

Notes: 1. MAX = 0xFF - 2. BOTTOM = 0x00

TCCR0B : Timer/Counter Control Register B
Bit76543210
0x33FOC0AFOC0B--WGM02CS02CS01CS00
Read/WriteR/WR/WRRR/WR/WR/WR/W
Initial Value00000000

TCNT0 : Timer/Counter Register
Bit76543210
0x32TCNT0[7:0]
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000

OCR0A : Output Compare Register A
Bit76543210
0x29OCR0A[7:0]
Read/WriteR/WR/WR/WR/WR/WR/WR/WR/W
Initial Value00000000

TIMSK :Timer/Counter Interrupt Mask Register
Bit76543210
0x39-OCIE1AOCIE1BOCIE0AOCIE0BTOIE1TOIE0-
Read/WriteRR/WR/WR/WR/WR/WR/WR
Initial Value00000000

cli()	;stop interrupts

 ;set timer0 interrupt at 2kHz
 clr	r16
 out	TCCR0A, r16	;set entire TCCR0A register to 0
 out	TCCR0B, r16	;same for TCCR0B
 out	TCNT0,	r16	;initialize counter value to 0
 ; set compare match register for 2khz increments
 ldi	r16,124		;= (16*10^6) / (2000*64) - 1 (must be <256)
 out	OCR0A,	r16
 
 ; turn on CTC mode
 in	r16,TCCR0A
 ldi	r17,(1 << WGM01)
 or	r16,r17
 out	TCCR0A, r16
 
 ;Set CS01 and CS00 bits for 64 prescaler
 in	r16,TCCR0B
 ldi	r17,(1 << CS01) |  (1 << CS00)
 or	r16,r17
 out	TCCR0B, r16
 
;enable timer compare interrupt
 in	r16,TIMSK
 ldi	r17,(1 << OCIE0A)
 or	r16,r17
 out 	TIMSK, r16

 sei()	;allow interrupts

Notez comment la valeur de OCR0A (la valeur de comparaison correspondante) change pour chacune de ces configurations de minuterie.
Comme expliqué dans la dernière étape, ceci a été calculé selon l'équation suivante:
$compare~match~register = \dfrac{ 16.000.000Hz}{prescaler /times desired~interrupt~frequency } - 1$
Digispark

Disgispark Attiny 85

Installation sous raspberry

Augmenter le courant disponible sur les ports USB

Avec les réglages par défaut, le Raspberry Pi 2 limite le courant à 600mA pour l'ensemble des 4 ports USB. La modification logicielle qui est proposée ici va étendre cette limite à 1200mA.
Pour info :

Editer le fichier config.txt : sudo nano /boot/config.txt
Rechercher la présence éventuelle de la ligne "max_usb_current=..."
Ajouter la ligne suivante "max_usb_current=1" ou modifier sa valeur à 1 si elle existe déjà.
Enregistrer le fichier config.txt

Détection automatique du Digispark au branchement

La Détection automatique du Digispark au branchement, et communication série doit être réaliser dans les 5 secondes, ce qui semble difficile
Mais qui donne comme résultat:
pi@raspberrypi:~ $ lsusb
Bus 001 Device 004: ID 16d0:0753 MCS Digistump DigiSpark
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ lsusb -v -d 16d0:0753
Et au bout de 5 s:
pi@raspberrypi:~ $ lsusb
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Pour résourdre se problème :
cd /etc/udev/rules.d/ 
sudo nano 49-micronucleus.rules
Mettre dans le fichier
# UDEV Rules for Micronucleus boards including the Digispark.
# This file must be placed at:
#
# /etc/udev/rules.d/49-micronucleus.rules    (preferred location)
#   or
# /lib/udev/rules.d/49-micronucleus.rules    (req'd on some broken systems)
#
# After this file is copied, physically unplug and reconnect the board.
#
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
#
# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.
sudo reboot

Arduino 1.6.x for Raspberry PI Jessie

Install Arduino 1.6.7 on jessie


Install Arduino 1.6.5 on jessie

Install some tools
sudo su
apt-get install zip quilt 

Update quilt defaults
nano /root/.quiltrc
<enter these lines>
//
for where in ./ ../ ../../ ../../../ ../../../../ ../../../../../; do
if [ -e ${where}debian/rules -a -d ${where}debian/patches ]; then
export QUILT_PATCHES=debian/patches
break
fi
done
 
QUILT_PUSH_ARGS="--color=auto"
QUILT_DIFF_ARGS="--no-timestamps --no-index -p ab --color=auto"
QUILT_REFRESH_ARGS="--no-timestamps --no-index -p ab"
QUILT_DIFF_OPTS='-p'

Do this installs first if you like me removed a lot of unwanted software
apt-get install javahelper default-jdk default-jre ant astyle

Now start this long lasting string of steps:
wget https://github.com/arduino/Arduino/archive/1.6.5.tar.gz
tar xf 1.6.5.tar.gz
cd Arduino-1.6.5
git clone https://github.com/ShorTie8/Arduino_IDE
ln -s Arduino_IDE/debian debian
dpkg-buildpackage -uc -b -tc
cd ..
dpkg -i arduino-core_1.6.5_all.deb 
dpkg -i arduino_1.6.5_all.deb

And you have Arduino 1.6.5!

Pour le lancer
sudo arduino
Flasher Disgispark Pour programmer un DigiSpark avec un Arduino Nano,celui-ci devra contenir le programme ArduinoISP, contenu dans l'installation de Arduino IDE.
Une fois le DigiSpark branché comme l'indique le schéma suivant:


Compiler le programme avec la commande :
avra nomduprogramme.asm

Maintenant que le digispark est reconnu :



Record Format
An Intel HEX file is composed of any number of HEX records. Each record is made up of five fields that are arranged in the following format:

:llaaaatt[dd...]cc

Each group of letters corresponds to a different field, and each letter represents a single hexadecimal digit. Each field is composed of at least two hexadecimal digits-which make up a byte-as described below:

Exemple : flash85.hex
Pour graver le programme taper la commande
C:\arduino-1.6.8\hardware\tools\avr\bin\avrdude -C C:\arduino-1.6.8\hardware\tools\avr\etc\avrdude.conf -c avrisp -P COM6 -b 19200 -p t85 -U flash:w:flash.hex:i
HVSP Attiny et utilisation de PB5

Mais pourquoi HVSP?

High-Voltage Serial Programming (HVSP)
Il arrive parfois: vous essayez de programmer un Attiny et vous obtenez une erreur, par exemple, vous définissez la broche 1 (réinitialisation) comme une broche E / S. Cela rend impossible de programmer avec ISP, ou vous avez réglé le mauvais oscillateur. Pour ces cas, un programmeur à haute tension peut être utile.
Le jour où vous avez accidentellement changer le fusible "reset-disabled" avant que le "bootloader" ai été installé.
Ou vous avez tué le boot de démarrage, essayé différentes sources d'horloge, ou autre.
Dans ce cas, il n'y a qu'un moyen de corriger le problème; Vous devrez utiliser la programmation en série haute tension (HVSP).
La haute tension est de 12 volts, il n'y a donc aucun risque. Le problème est cependant que le protocole utilisé pour ce type de programmation diffère de SPI et rend HVSP-programmeurs plus compliqué.
Dans tous les cas, le transistor utilisé est un 2N3904, mais un BC547, fonctionne aussi.

Utilisation de PB5

Pour utiliser PB5, utiliser dans le programme, puis téléverser celui-ci. Et alors,... ça ne fonctionne pas.
Pour que cela fonctionne, il faut changer les fusibles, voici toute la methode.


Pour programmer les fuses :

c:\>avrdude -C C:\AVRDUDE\avrdude.conf -c avrisp -P COM7 -b 19200 -p t85 -t
avrdude> w lfuse 0 0xe2
>>> w lfuse 0 0xe2

avrdude> w hfuse 0 0x5f
>>> w hfuse 0 0x5f

avrdude> w efuse 0 0xff
>>> w efuse 0 0xfe

avrdude> q
>>> quit

avrdude: safemode: Fuses OK (H:5F, E:FF, L:E2)

avrdude done.  Thank you.
Maintenant, tout fonctionne, mais vous ne pouvez plus programmer cet Attiny.
La solution si vous vouler téléverser un nouveau programme, il faut reseter l'Attiny.

Le reseter HVSP?


Tout simplement pour reconfigurer les fusibles, et revenir a l'état : lfuse : 0xE2 ; hfuse : 0xDF ; efuse : 0xFF

  1. Placer l'Attiny a reconfigurer dans le support, dans le même sens que l'autre
  2. Brancher le cabre USB Micro sur une alimentation USB >=500mA
  3. Maintenir le boutton appuyé, jusqu'a ce qu'une LED s'allume, plusieurs possibilités
    • Seule la LED Verte s'allume, tout vas bien, vous pouver relacher le bouton, c'est fini, tout marche bien!
    • La LED Rouge clignotte lentement, la signature (0x1e930b pour Attiny85) n'est pas valide
    • La LED Rouge clignotte rapidement, les fusibles n'ont pas pu être reprogrammés

Dans cette configuration
Non de la broche PortBCommentaire
LED Verte PB5Led de bon fonctionnement
LED Rouge PB3Clignottement rapide, problème de signature
Clignottement lent, problème de fusibles
RST PB4Sortie Vers la base du transistor NPN, le collecteur sur 12V et l'emetteur vers la broche RESET de l'Attiny a programmer
SCI PB3Target Clock Input
SDO PB2Target Data Output
SII PB1Target Instruction Input
SDI PB0Target Data Input

LE bon exemple, car j'utilise le port PB5 de broche 1 soit les 6 ports, youpi!!!

La configuration des FUSES sur le site eleccelerator

Différents câblages

Programmes :

La première attend que vous définissiez les bits d'usine dans le programme en fonction de la puce que vous utilisez
hvsp_tiny1.ide
Ce programme lit réellement quelle puce vous utilisez.
hvsp_tiny2.ide

Avec une simplification du brochage permettant d'utiliser une plaque LAB et, une lecture de la puce utilisée, donc j'ai fini par utiliser celui-ci. pour l'alimentation 12V j'utilise 23A/8LR23
hvsp_tiny3.ide
Les deux programmes démarrent après que vous envoyez un caractère aléatoire au port série.
Programmes utilitaires en assembleur
Liste des bibliothèques :
ProgrammeDéscription
lcd_.incGestion LCD1602 en I2C
wait.inc Gestion du Temps
eeprom_V5.inc Gestion de l'EEPROM interne
i2c_attiny.inc Gestion des composants I²C
1-wire.inc Gestion des composants 1 wire
watchdog.inc Gestion du Watchdog
DS3231.inc Gestion du DS3231 : Horloge I²C
ADS1115.inc Gestion ADS1115 : Convertisseur A/N 24bits I²C
bin2asc5.inc Conversion BIN vers ASC 5 caractères
bin2dcb32.inc Conversion BIN vers DCB 32 bits
div32.inc Division 32 bits par 16 bits
div32_24.inc Division 32 bits par 24 bits
crc8.inc Calcul CRC8

Liste des programmes :
ProgrammeDéscription
ADS1115_LCD2.asmAffichage de l'entrée A/N 24bits I2C
DS1820_V2_t85.asmGestion de la température
LCD_DS3231.asmAffichage de l'heure
SNIF_I2C.asmSnif et affiche l'adresse I2C
Ultrasonic_t85_V6.asmRécupération des distances pendants plusieurs mois
Fr_meter.asmFréquencemètre