Go Down

Topic: Plus d'info sur l'utilisation des Timer par l'environnement Arduino (Read 7484 times) previous topic - next topic

UniseV

#30
Jun 25, 2012, 03:45 pm Last Edit: Jun 25, 2012, 04:56 pm by UniseV Reason: 1
Bon à titre d'exemple, voici ce que je retiens de la lecture du datasheet à propos des registres concernant les interruptions :

INT0=digital PIN 2 (la PIN 2 de l'Arduino)
INT1=digital PIN 3 (la PIN 3 de l'Arduino)
port D=PIN de 0 à 7 de l'Arduino
port B=PIN de 8 à 13 de l'Arduino (14 n'étant pas documenté côté Arduino)
port C=PIN A0 à A5 (l'équivalent du A6 étant le RESET, la A7 n'est pas documenté)

SREG [I;T;...] pour activer globalement les interruptions
Le I-bit est : Global Interrupt Enable (modifié notamant par SEI, CLI)

EICRA [...ISC11;ISC10;ISC01;ISC00] pour parametrer les type d'interruption INT1 & INT0
ISC11 & ISC 10 : pour INT1
ISC01 & ISC 00 : pour INT0
Se paramètre comme suit :
00 Low level
01 Change (falling & Rising)
10 Falling
11 Rising
Exemple : EICRE = [0;0;0;0;0;0;1;0] veut dit que INT1 est déclenché par Low level & INT0 est déclenché par Falling edge (front déscendant)

EIMSK [...;-;INT1;INT0] Pour activer les interruption sur INT1 & INT0
Enable or Disable INT1 INT0 interruption

EIFR [...;-;INTF1;INTF0] Flag quand les interruption INT sont déclenchées
Flags when interrupt are triggered (reset when interruption is executing)

PCICR [...;-;PCIE2;PCIE1;PCIE0] pour activer le déclenchement d'interruptions sur les ports D, C, B

PCIMSK2 [PCINT23;...;PCINT16] pour selectionner les PIN du PORT qui vont déclencher l'interruption PCIE2 (portD)
PCIMSK1 [-;PCINT14;...;PCINT8] pour selectionner les PIN du PORT qui vont déclencher l'interruption PCIE1 (portC)
PCIMSK0 [PCINT7;...;PINT0] pour selectionner les PIN du PORT qui vont déclencher l'interruption PCIE0 (portB)

PCIFR [...;-;PCIF2;PCIF1;PCIF0] Flag quand les interruption PCI sont déclenchées
Flags when interrupt are triggered (reset when interruption is executing)

...

Voila ce n'est qu'un exemple, je cherche la forme appropriée qui peremettrait une utilisation "simple"... mais c'est à peu près ce qu'il me faut pour comprendre et pouvoir utiliser les timers.
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

68tjs

Pour les interruptions PCINTx je m'étais un document que j'ai rendu disponible là :
http://arduino.cc/forum/index.php/topic,100906.0.html

UniseV

Ton doc est très chouette, j'aurai bien aimé tomber dessus il y a quelques temps...  :smiley-sweat: ça m'aurait évité de me fourvoyer à ce sujet.

Le même doc qui traiterait des counter/timer me serait très utile.

Sev
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

68tjs

Il fallait regarder dans le sous forum tutoriaux !

Il y a aussi "Le guide Arduino" épinglé en tête du forum principal qui est une mine de renseignements.

Quand on dit qu'il faut se renseigner avant .........

UniseV

Je ne connaissais malheureusement pas ce forum lorsque j'ai travaillé sur la partie interruption.

En revanche, j'ai déjà parcouru la partie "Le guide Arduino" et je n'y ai pas vraiment trouvé ce que je cherchais, qui n'est autre que la couche non-documentée de l'Arduino, c'est à dire toutes les librairies "invisibles" de l'environnement Arduino.

Il serait bon de documenter cette partie, au moins pour que les débutants qui se mettent au C/C++ pour l'Arduino puissent savoir quel commande est du C générique et quelle commande appartient à la couche Arduino.

Sev
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

68tjs

Vaste programme !

Suite de fork et autres évolutions
Processing -> Wiring  --> Arduino

Je ne sais pas si une mère y retrouverait ses petits.

UniseV

J'aimerais vraiment que le soft Arduino permette 2 modes de compilation, avec et sans l'environnement Arduino, ça allègerait forcément les devs de certains projets.

Bon j'avance sur mon "pense-bête" sur les timers, la première partie rappelle les spécificités des timers, la seconde n'est qu'un dictionnaire de registre, dans lequel il manque pour l'instant les définitions :
-------------------------------------------------------------------------------------------------------------------------------------------------
Le timer0 et timer2 sont similaires en tout point, ce sont tous les 2 des timer 8-bits, sauf que le timer2 peut être "clocké" sur une source externe asynchrone.

Le timer1 est un peu différent, puisque c'est un timer 16-bits et qu'il embarque un compteur qui peut horodater les évenement capturé sur un PIN (timestamp), avec un atténuateur de bruit activable.
-------------------------------------------------------------------------------------------------------------------------------------------------
RAPPEL SUR LES REGISTRES
-------------------------------------------------------------------------------------------------------------------------------------------------
Le registre commun
GTCCR [TSM ;-…-;PSRASY;PSRSYNC]
General Timer/Counter Ctrl Reg

Les registres du Timer 0
TCCR0A [COM0A1;COM0A1;COM0B1;COM0B0;-;-;WGM01;WGM00] …
TCCR0B [FOC0A;FOC0B;-;-;WGM02;CS02;CS01;CS00] …
TCNT0 = Counter, OCR0A = ComparMatch0A, OCR0B = ComparMatch0B
TIMSK0 [...-;OCIE0B;OCIE0A;TOIE0] …
TIFR0 [...-;OCF0B;OCF0A;TOV0] …

Les registres du Timer 1
TCCR1A [COM1A1;COM1A1;COM1B1;COM1B0;-;-;WGM11;WGM10] …
TCCR1B [ICNC1;ICES1;-;WGM13;WGM12;CS12;CS11;CS10] …
TCCR1C [FOC1A;FOC1B;-...] …
TCNT1H = CounterH, TCNT1L = CounterL
OCR1AH & OCR1AL = ComparMatch1A, OCR1BH & OCR1BL = ComparMatch1B
ICR1H & ICR1L = Input Capture Register1

TIMSK1 [-;-;ICIE1;-;-;OCIE1B;OCIE1A;TOIE1] …
TIFR0 [-;-;ICF1;-;-;OCF1B;OCF1A;TOV1] …

Les registres du Timer 2
TCCR2A [COM2A1;COM2A1;COM2B1;COM2B0;-;-;WGM21;WGM20] …
TCCR2B [FOC2A;FOC2B;-;-;WGM22;CS22;CS21;CS20] …
TCNT2 = Counter, OCR2A = ComparMatch2A, OCR2B = ComparMatch2B
TIMSK2 [...-;OCIE2B;OCIE2A;TOIE2] …
TIFR2 [...-;OCF2B;OCF2A;TOV2] …
ASSR [-;EXCLK;AS2;TCN2UB;OCR2AUB;OCR2BUB;TCR2AUB;TCR2BUB]
-------------------------------------------------------------------------------------------------------------------------------------------------

Moi je suis nul pour les tuto, mais si avec cette base, quelqu'un veut s'y frotter...
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

skywodd

#37
Jun 27, 2012, 06:23 pm Last Edit: Jun 30, 2012, 08:50 am by skywodd Reason: 1

J'aimerais vraiment que le soft Arduino permette 2 modes de compilation, avec et sans l'environnement Arduino, ça allègerait forcément les devs de certains projets.

-> AVR studio ou eclipse + toolchain avr-gcc ou notepad++ & makefile ...
Pas besoin de l'ide arduino si c'est pour faire du avr-c/c++ ...
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

UniseV

#38
Jun 28, 2012, 08:41 pm Last Edit: Jun 28, 2012, 09:05 pm by UniseV Reason: 1
Merci Skywodd,

Je crois bien que je ne vais pas tarder à m'y mettre à l'Arduino sans environnement Arduino...

Je viens de faire un point sur les timers, dans la datasheet, ils sont arrêtés tout les trois, par défaut.
Par curiosité, je viens de faire un programme qui interroge les registres timer dès le démarrage de la bête et sans aucune librairie... voici le résultat comenté :
Code: [Select]
____________________________________________
              Timer 0 :
TCCR0A : 11 (mode 3, fast PWM)
TCCR0B : 11 (prescaler clk/64)
TIMSK0 : 1 (Timer Over Inter)
____________________________________________
              Timer 1 :
TCCR1A : 1 (mode 1, PWM phase correct, 8-bit)
TCCR1B : 11 (prescaler clk/64)
TCCR1C : 0
TIMSK1 : 0
____________________________________________
              Timer 2 :
TCCR2A : 1 (mode 1, PWM phase correct)
TCCR2B : 100 (prescaler clk/256)
TIMSK2 : 0
____________________________________________

Le timer0 (environ 250KHz) déclenche une interruption lorsqu'il est plein.
Rien d'étonnant, l'interruption doit surement incrémenter un compteur qui permet au fonction millis() et micros() de renvoyer le temps total depuis l'allumage.

En revanche, le timer1 tourne à la même fréquence sans interruption et je ne sais pas pourquoi...
Le timer2 tourne lui à enciron 62,5KHz... et je ne sais pas pourquoi.

Le seul point rassurant, c'est que, à part l'interruption du timer0 (qui intervient à peu près tout les 1ms), rien ne "consomme" du proc.

Sev
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

skywodd


Je crois bien que je ne vais pas tarder à m'y mettre à l'Arduino sans environnement Arduino...

On finit vite par apprécier de coder en avr-c, c'est tellement plus documenté et surtout il y a un standard derrière (la libc).


En revanche, le timer1 tourne à la même fréquence sans interruption et je ne sais pas pourquoi...
Le timer2 tourne lui à enciron 62,5KHz... et je ne sais pas pourquoi.

C'est normal, le processus de démarage du "core arduino" est le suivant :
Code: [Select]
internal_init()
setup()
while(1) -> loop()

internal_init() configure le Timer1 pour que millis() & co fonctionnent, mais (pré)configure aussi les autres timers pour la fonction analogWrite (PWM) qui ne fait rien d'autre que lancer la génération du signal PWM.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

Super_Cinci

J'ai (je crois que je me répète, désolé... :D) déjà modifié la librairie <serial> dans l'idée de ne pas compiler l'ISR de réception afin de pouvoir moi-même gérer cette int. en gros, j'ai entouré la déclaration de l'isr dans la lib par un truc genre #ifdef / #endif. donc dans mon prog, il me suffit de déclarer #define PAS_D_ISR pour que l'isr ne soit pas compilée et que je puisse en faire une rien que pour moi. (PAS_D_ISR devient en fait une directive de compilation)

je n'ai pas trop testé, beaucoup de trucs sur le feu... mais je pense que ça doit marcher?

Mais dans cette idée, on pourrait utiliser un #define LIBERTE qui empêcherait la compilation de tout ces codes encombrants du core arduino, tout en restant dans l'IDE arduino, non? ainsi, pas de souci dû au timer0... mais bonjour le boulot de modifier toutes les libs, car le plus basique des programme fait quand-même intervenir un paquet de libs (j'avais estimé entre 500 et 900 octets de code en plus du mien)...

barbudor

Tu définit où #define PAS_D_ISR  ?
Il faut que ce soit dans le source HardwareSerial.cpp

Et dans ce cas, comment gères-tu la réception ? Tu fournis ta propre routine d'interruption ?
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Super_Cinci


Tu définit où #define PAS_D_ISR  ?
Il faut que ce soit dans le source HardwareSerial.cpp
Ben justement, c'était ma question... si ce que tu dis est vrai, alors mon truc ne marche pas. vu que je l'ai jamais testé... :smiley-mr-green:

Et dans ce cas, comment gères-tu la réception ? Tu fournis ta propre routine d'interruption ?
oui, sinon ça ne sert à rien de la désactiver dans le core... en fait, c'était pour de la réception DMX, où ça ne sert à rien de recevoir des données qui ne nous concerne pas dans la trame, donc désactiver la réception une fois qu'on est servi et laisser du temps pour le traitement de ces données (une réception série à 250Kb/s en continu, ça laisse pas beaucoup de temps entre deux octets...) et attendre le retour de début de trame. (c'est un protocole assez compliqué mais qui se gère très bien avec un serial.begin(250000)...)

UniseV

#43
Aug 10, 2012, 03:58 pm Last Edit: Aug 10, 2012, 04:47 pm by UniseV Reason: 1
Je pense que je n'irai malheureusement pas plus loin, voici mon doc sur GoogleDrive :

MemoCounter PDF
MemoCounter DOC

Il est un peu déstructuré mais je m'en sert pour faire des copier/coller de nom de registre ou de valeur, et je m'en sers aussi pour parametrer mes timers.
C'est un sorte de mémo, avec les essentiels mais il faut déjà avoir compris le fonctionnement général des timer.

Sev
EN: Libraries are my Gurus, they make me believe anything they want !
FR: Les librairies sont mes gourous, elles me font croire ce qu'elles veulent !

Go Up