Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| dev:arduino:shields:encodeur-rotatif [2017/12/16 14:10] – créée yoann | dev:arduino:shields:encodeur-rotatif [2021/02/01 21:51] (Version actuelle) – modification externe 127.0.0.1 | ||
|---|---|---|---|
| Ligne 15: | Ligne 15: | ||
| ===== Exemples ===== | ===== Exemples ===== | ||
| - | non fonctionnel, | + | Dans ce premier exemple on écrit l' |
| <code c> | <code c> | ||
| + | / | ||
| + | * ERST01: Encodeur Rotatif Snootlab Test 01 * | ||
| + | * Affiche sur le port série: | ||
| + | * Le sens de rotation R (Right) ou L (Left) | ||
| + | * valeur du compteur | ||
| + | * le nombre d' | ||
| + | *****************************************************/ | ||
| + | |||
| #include < | #include < | ||
| + | |||
| //stocke le sens de rotation | //stocke le sens de rotation | ||
| volatile char dir = ' | volatile char dir = ' | ||
| - | volatile | + | volatile |
| + | volatile int current_counter= 0; | ||
| + | volatile int isr_count = 0; | ||
| + | |||
| // | // | ||
| SwitchEncoder s = SwitchEncoder(8, | SwitchEncoder s = SwitchEncoder(8, | ||
| + | |||
| void setup() | void setup() | ||
| { | { | ||
| // Autorisation des interruptions sur le port B car les broches D12 D13 sont liées au port B | // Autorisation des interruptions sur le port B car les broches D12 D13 sont liées au port B | ||
| PCICR |= (1 << PCIE0); | PCICR |= (1 << PCIE0); | ||
| - | | + | |
| // Activation des interruptions sur les broches D12 et D13 | // Activation des interruptions sur les broches D12 et D13 | ||
| PCMSK0 |= (1 << PCINT0) | (1 << PCINT4); | PCMSK0 |= (1 << PCINT0) | (1 << PCINT4); | ||
| - | | + | |
| // Activation générale des interruptions | // Activation générale des interruptions | ||
| sei(); | sei(); | ||
| - | | + | |
| // | // | ||
| - | Serial.begin(9600); | + | Serial.begin(115200); |
| Serial.println(" | Serial.println(" | ||
| + | | ||
| + | s.resetCount(); | ||
| } | } | ||
| + | |||
| void loop() | void loop() | ||
| { | { | ||
| - | if(input_changed) | + | if(current_counter != last_counter) |
| { | { | ||
| Serial.println(dir); | Serial.println(dir); | ||
| Serial.println(s.count()); | Serial.println(s.count()); | ||
| - | | + | |
| + | last_counter | ||
| } | } | ||
| - | + | ||
| - | + | ||
| } | } | ||
| + | |||
| /* Définition du gestionnaire d' | /* Définition du gestionnaire d' | ||
| * PCINT0_vect pour le port B | * PCINT0_vect pour le port B | ||
| Ligne 64: | Ligne 77: | ||
| ISR(PCINT0_vect) | ISR(PCINT0_vect) | ||
| { | { | ||
| + | | ||
| dir = s.process(); | dir = s.process(); | ||
| - | | + | |
| + | isr_count++; | ||
| } | } | ||
| - | |||
| </ | </ | ||
| + | |||
| + | Le téléversement de ce code et quelques manipulations de l' | ||
| + | |||
| + | < | ||
| + | boot | ||
| + | R | ||
| + | 1 | ||
| + | 36 | ||
| + | L | ||
| + | 0 | ||
| + | 11 | ||
| + | R | ||
| + | 1 | ||
| + | 18 | ||
| + | L | ||
| + | 0 | ||
| + | 9 | ||
| + | |||
| + | 1 | ||
| + | 33 | ||
| + | L | ||
| + | 0 | ||
| + | 16 | ||
| + | |||
| + | 1 | ||
| + | 39 | ||
| + | |||
| + | 2 | ||
| + | 74 | ||
| + | |||
| + | </ | ||
| + | |||
| + | <note warning> | ||
| + | Les interruptions sont particulièrement sensibles au phénomène de rebond, on constate ici que lors de la première manipulation, | ||
| + | </ | ||
| < | < | ||
| - | Attention | + | Attention |
| </ | </ | ||
| + | |||
| + | Autre curiosité, la valeur du sens de rotation n'est pas systématiquement écrite sur le port série. L' | ||
| + | |||
| + | |||
| + | < | ||
| + | $ cat minicom.cap | od -Ad -tc -w4 | ||
| + | 0000000 | ||
| + | 0000004 | ||
| + | 0000008 | ||
| + | 0000012 | ||
| + | 0000016 | ||
| + | 0000020 | ||
| + | 0000024 | ||
| + | 0000028 | ||
| + | 0000032 | ||
| + | 0000036 | ||
| + | 0000040 | ||
| + | 0000044 | ||
| + | 0000048 | ||
| + | 0000052 | ||
| + | 0000056 | ||
| + | 0000057 | ||
| + | </ | ||
| ===== Références ===== | ===== Références ===== | ||