pave Interruptions5 Interruptions3 INTERRUPTIONS
4/7


ATTINY84


DESCRIPTION

cet article décrit l'utilisation des interruptions sur la puce attiny84. Un exemple avec quatre boutons poussoirs en mode momentané ON / OFF est décrit dans cette page. Le code est strictement identique à celui de l'ATTiny85 mais adapté pour l'ATTiny84 avec un doublement des possibilités.
Les modes ON / OFF avec détection du Front Montant et Descendant, et interrupteur Marche / Arrêt seront à extraire des codes de l'ATTiny85. Il faut bien que je vous laisse un peu de travail...

ENTÊTE

L'entête aura une structure identique et adaptée à chaque puce.

CODE

La structure du code (le programme à proprement parler) sera toujours la même.

/* ATMEL ATTINY 24/44/84 - @Alain DORING (2020) - https://www.astrolynx.com/ - Original source
   ┌───────────────────────────────────────── SPI ───────────────────────────────────────────┐
   │                                ┌─────── ANALOG ──────┐                                  │
   │                                │  ┌─── DIGITAL ───┐  │                                  │
   │                                │  │    ┌─┐_┌─┐    │  │                                  │
 ROUGE                         VCC         1│o    │14         GND                           NOIR
                        PCINT8 PB0     10  2│     │13  0  0   PA0 PCINT0/ADC0/AREF
                        PCINT9 PB1     9   3│     │12  1  1   PA1 PCINT1/ADC1/AIN0
 JAUNE           RESET/PCINT11 PB3         4│     │11  2  2   PA2 PCINT2/ADC2/AIN1
                  INT0/PCINT10 PB2     8   5│     │10  3  3   PA3 PCINT3/ADC3/T0 
                   ADC7/PCINT7 PA7  7  7   6│     │9   4  4   PA4 PCINT4/ADC4/T1/SCK/SCL    BLANC
 VERT  SDA/MOSI/DI/ADC6/PCINT6 PA6  6  6   7│     │8   5  5   PA5 PCINT5/ADC5/DO/MISO       BLEU
                                            └─────┘

 Vecteurs externes                 INT0_vect
 Vecteurs de changement de broches PCINT0_vect - PCINT1_vect

            7       6       5       4       3       2       1       0
 GIMSK  -         INT0    PCIE1   PCIE0  
 GIFR   -         INTF0   PCIF1   PCIF0  
 PCMSK0 - PCINT7  PCINT6  PCINT5  PCINT4  PCINT3  PCINT2  PCINT1  PCINT0 
 PCMSK1 -                                 PCINT11 PCINT10 PCINT9  PCINT8 
 PORTA  - PORTA7  PORTA6  PORTA5  PORTA4  PORTA3  PORTA2  PORTA1  PORTA0
 DDRA   - DDA7    DDA6    DDA5    DDA4    DDA3    DDA2    DDA1    DDA0
 PINA	  - PINA7   PINA6   PINA5   PINA4   PINA3   PINA2   PINA1   PINA0
 PORTB  -                                 PORTB3  PORTB2  PORTB1  PORTB0
 DDRB   -                                 DDB3    DDB2    DDB1    DDB0
 PINB	  -                                 PINB3   PINB2   PINB1   PINB0
 WDTCSR - WDIF    WDIE    WDP3    WDCE    WDE     WDP2    WDP1    WDP0
 WDT    0x0004
                                ┌────────────┐            
                              ─◄│ VCC    GND │►─                 
                                │            │                    
                 „       1K     │            │    1K      „      
  LED BLEUE  ┌──┤◄├────/\/\/\──◄│ PB0    PA0 │►─/\/\/\───┤►├───┐  LED VERTE 
 CLIGNOTANTE │                  │            │                 │ CLIGNOTANTE
             │                  │            │           _▄▄_  │ 
             │                ─◄│ PB1    PA1 │◄──────────O  O──┤ BP > LED PB2 
             │                  │            │                 │ 
             │                  │            │           _▄▄_  │ 
 Non utilisé │          RESET ─◄│ PB3    PA2 │◄──────────O  O──┤ BP > LED PA7 
             │                  │            │                 │ 
             │   „       1K     │            │           _▄▄_  │ 
 LED BLANCHE ├──┤◄├────/\/\/\──◄│ PB2    PA3 │◄──────────O  O──┤ BP > LED PA6 
             │                  │            │                 │ 
             │   „       1K     │            │           _▄▄_  │ 
  LED JAUNE  ├──┤◄├────/\/\/\──◄│ PA7    PA4 │◄──────────O  O──┤ BP > LED PA5 
             │                  │            │                 │ 
             │   „       1K     │            │    1K      „    │ 
  LED ORANGE ├──┤◄├────/\/\/\──◄│ PA6    PA5 │►─/\/\/\───┤►├───┤ LED ROUGE
             │                  └────────────┘                 │
             ┴                                                 ┴
            GND                                               GND
*/         

volatile int oldEtatA1;
volatile int newEtatA1;
volatile int oldEtatA2;
volatile int newEtatA2;
volatile int oldEtatA3;
volatile int newEtatA3;
volatile int oldEtatA4;
volatile int newEtatA4;

// Routines d'interruptions
ISR (PCINT0_vect)
{
  newEtatA1 = (PINA & B00000010); // digitalRead(1)  PA1;
  newEtatA2 = (PINA & B00000100); // digitalRead(2)  PA2;
  newEtatA3 = (PINA & B00001000); // digitalRead(3)  PA3;
  newEtatA4 = (PINA & B00010000); // digitalRead(4)  PA4;

  // Détection d'un changement d'état PB2 LED BLANCHE
  if (oldEtatA1 != newEtatA1) {
    PORTB ^= (1 << PB2);    // bascule la broche PB2 si changement logique PA1
    oldEtatA1 = newEtatA1;
  }

  // Détection d'un changement d'état PA7 LED JAUNE
  if (oldEtatA2 != newEtatA2) {
    PORTA ^= (1 << PA7);    // bascule la broche PA7 si changement logique PA2
    oldEtatA2 = newEtatA2;
  }

  // Détection d'un changement d'état PA6 LED ORANGE
  if (oldEtatA3 != newEtatA3) {
    PORTA ^= (1 << PA6);    // bascule la broche PA6 si changement logique PA3
    oldEtatA3 = newEtatA3;
  }

  // Détection d'un changement d'état PA5 LED ROUGE
  if (oldEtatA4 != newEtatA4) {
    PORTA ^= (1 << PA5);    // bascule la broche PA5 si changement logique PA4
    oldEtatA4 = newEtatA4;
  }
}

void setup() {
  // Initialisation du PORTA en entrées ou en sorties = 8 x Pinmode(pin, INPUT ou OUTPUT)
  DDRA   =  B11100001;      // active PA 1 en sorties et 0 en entrées PA1 à PA4
  // Initialisation du PORTB en entrées ou en sorties = 4 x Pinmode(pin, INPUT ou OUTPUT)
  DDRB   =  B11110111;      // active PB 1 en sorties sauf PB3 (RESET)

  // initialisations des PULLUPs = 4 x Pinmode(pin, INPUT_PULLUP) 
  PORTA |=  B00011110;      // active le pullup PA1-2-3-4 pour les Boutons Poussoirs

  // Activation des ports A & B
  GIMSK   = B00110000;      // active interruption de changement de broche PCIE0 & PCIE1

  // Déclaration des broches d'interruptions
  PCMSK0 |= B00011110;      // changement de broche activée pour PA1 à PA4

  // Activation globale des interruptions
  sei ();                   // active les interruptions

  // Inversion logique des 4 leds commandées par les BPs sinon démarrent allumées
  PORTA ^= B11100000;       // bascule PA5-6-7 pour inverser logique
  PORTB ^= B00000100;       // bascule PB2 pour inverser la logique

  // Initialisations des routines d'interruptions pour forcer le démarrage leds éteintes
  PCINT0_vect();            // Initialise la routine d'interruption de PB3 & PB4     
  
}

void loop() {
  // Ici le code à répéter continuellement
  delay(500);
  PORTA ^= (1 << PA0);      // Led clignotante verte
  PORTB ^= (1 << PB0);      // Led clignotante bleue
}

Téléchargement du code au bas de cette page

IMPLANTATION

Cette vue permet de voir l'implantation des composants sur une breadboard. Les annotations A0..A7 et B0..B2 sont à lire PA0..PA7 et PB0..PB2. La broche PB3, notée RST pour RESET, n'est pas utilisée.

VIDÉO

Cette vidéo montre le fonctionnement des interruptions sur un ATTiny84.
La led blanche PB2 commandée par le bouton poussoir PA1.
La led jaune PA7 commandée par le bouton poussoir PA2.
La led orange PA6 commandée par le bouton poussoir PA3.
La led rouge PA5 commandée par le bouton poussoir PA4.
Les leds verte PA0 et bleue PB0 dont le clignotement est assuré dans la boucle LOOP.

Télécharger les codes Interrupt_ATTiny84