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

  • Bit 7 – ADEN: ADC Enable
  • Bit 6 – ADSC: ADC Start Conversion
  • Bit 5 – ADATE: ADC Auto Trigger Enable
  • Bit 4 – ADIF: ADC Interrupt Flag
  • Bit 3 – ADIE: ADC Interrupt Enable
  • Bits 2:0 – ADPS[2:0]: ADC Prescaler Select Bits
    Ces bits déterminent le facteur de division entre la fréquence d'horloge du système et l'horloge d'entrée de l'ADC.
    ADPS2ADPS1ADPS0Division Factor
    0002
    0012
    0104
    0118
    10016
    10132
    11064
    111128

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

  • Bit 7 – BIN: Bipolar Input Mode
  • Bit 5 – IPR: Input Polarity Reversal
  • Bits 4:3 – Res: Reserved Bits
  • Bits 2:0 – ADTS[2:0]: ADC Auto Trigger Source
    ADTS2ADTS1ADTS0Trigger Source
    000Free Running mode
    001Analog Comparator
    010External Interrupt Request 0
    011Timer/Counter0 Compare Match A
    100Timer/Counter0 Overflow
    101Timer/Counter0 Compare Match B
    110Pin Change Interrupt Request

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


  • Bits 7:6, 4 – REFS[2:0]: Voltage Reference Selection Bits
    REFS2REFS1REFS0Voltage Reference (VREF) Selection
    X00VCC used as Voltage Reference, disconnected from PB0 (AREF).
    X01External Voltage Reference at PB0 (AREF) pin, Internal Voltage
    Reference turned off.
    010Internal 1.1V Voltage Reference.
    011Reserved
    110Internal 2.56V Voltage Reference without external bypass
    capacitor, disconnected from PB0 (AREF).
    111Internal 2.56V Voltage Reference with external bypass capacitor at
    PB0 (AREF) pin.
  • Bit 5 – ADLAR: ADC Left Adjust Result
  • Bits 3:0 – MUX[3:0]: Analog Channel and Gain Selection Bits
    MUX[3:0]Single Ended
    Input
    Positive
    Differential Input
    Negative
    Differential Input
    Gain
    0000ADC0 (PB5)N/A
    0001ADC1 (PB2)
    0010ADC2 (PB4)
    0011ADC3 (PB3)
    0100N/AADC2 (PB4)ADC2 (PB4)1x
    0101ADC2 (PB4)ADC2 (PB4)20x
    0110ADC2 (PB4)ADC3 (PB3)1x
    0111ADC2 (PB4)ADC3 (PB3)20x
    1000ADC0 (PB5)ADC0 (PB5)1x
    1001ADC0 (PB5)ADC0 (PB5)20x
    1010ADC0 (PB5)ADC1 (PB2)1x
    1011ADC0 (PB5)ADC1 (PB2)20x
    1100$V_BG$N/A
    1101GND
    1110N/A
    1111ADC4 (For temperature sensor.)


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

  • Bits 5:2 – ADC3D:ADC0D: ADC[3:0] Digital Input Disable
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

  • Bit 7 – USISIF: Start Condition Interrupt Flag
  • Bit 6 – USIOIF: Counter Overflow Interrupt Flag
  • Bit 5 – USIPF: Stop Condition Flag
  • Bit 4 – USIDC: Data Output Collision
  • Bits 3:0 – USICNT[3:0]: Counter Value

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

  • Bit 7 – USISIE: Start Condition Interrupt Enable
  • Bit 6 – USIOIE: Counter Overflow Interrupt Enable
  • Bits 5:4 – USIWM[1:0]: Wire Mode
    USIWM1USIWM0Description
    00Désactivé
    01Three-wire mode. Port DO, DI, et USCK.
    10Two-wire mode. Port SDA (DI) et SCL (USCK)
    11Two-wire mode. Port SDA et SCL
  • Bits 3:2 – USICS[1:0]: Clock Source Select
    USICS1USICS0USICLKDescription
    000Pas d'horloge
    001Software clock strobe (USICLK)
    01XTimer/Counter0 Compare Match
    100External, positive edge
    110External, negative edge
    101External, positive edge
    110External, negative edge
  • Bit 1 – USICLK: Clock Strobe
  • Bit 0 – USITC: Toggle Clock Port Pin
    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

    • Support for the Arduino IDE 1.0 and later (OS X, Windows, and Linux)
    • Power via USB or external source - 5 V or 7-35 V (automatic selection)
    • On-board 500 mA 5V Regulator
    • Built-in USB
    • 6 I/O pins (2 are used for USB only if your program actively communicates over USB, otherwise you can use all 6 even if you are programming via USB)
    • 8 KB flash memory (about 6 KB after bootloader)
    • I²C and SPI (vis USI)
    • PWM on 3 pins (more possible with software PWM)
    • ADC on 4 pins
    • Power LED and test/status LED
    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 :

    • Cette modification est réversible.
    • L'utilisation d'une alimentation de 2000mA est toujours préconisée, quelque soit l'usage du Raspberry Pi 2.
    • Le courant maximal admissible par le Raspberry Pi 2 est de 2000mA.
    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:
    • : is the colon that starts every Intel HEX record.
    • ll is the record-length field that represents the number of data bytes (dd) in the record.
    • aaaa is the address field that represents the starting address for subsequent data in the record.
    • tt is the field that represents the HEX record type, which may be one of the following:
      • 00 - data record
      • 01 - end-of-file record
      • 02 - extended segment address record
      • 04 - extended linear address record
      • 05 - start linear address record (MDK-ARM only)
    • dd is a data field that represents one byte of data. A record may have multiple data bytes. The number of data bytes in the record must match the number specified by the ll field.
    • cc is the checksum field that represents the checksum of the record. The checksum is calculated by summing the values of all hexadecimal digit pairs in the record modulo 256 and taking the two's complement.

    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