Pages: [1] 2 3   Go Down
Author Topic: Plus d'info sur l'utilisation des Timer par l'environnement Arduino  (Read 6368 times)
0 Members and 1 Guest are viewing this topic.
Paris
Offline Offline
Sr. Member
****
Karma: 2
Posts: 366
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous,

Je débute depuis quelques mois, et je voudrais utiliser les Timers, mais comme un grand, en équilibre sur les registres et sans les petites librairies !!  smiley

Mais voila, je n'arrive pas à trouver sur le site Arduino l'information que je cherche :

Comment l'environnement Arduino utilise les timer/counter de l'Atmega ??
J'ai cru comprendre que les micros() & millis() utilise le Timer0... mais quoi d'autre ? comment toucher un timer en sachant précisément quelle commande on "neutralise" ?

Sev
Logged

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 !

83 - var
Offline Offline
God Member
*****
Karma: 9
Posts: 864
ARDUINO Powa !
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tout ce trouve dans des doc plus poussé, celle du composant,  ATmega328 ou autre je ne sais pas quel carte tu utilise..

Skizo !
Logged

Un tien vaux mieux que deux tu l'auras !

0
Offline Offline
God Member
*****
Karma: 2
Posts: 802
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yep!

La documentation de base est le datasheet du composant (prendre la version pdf complète, quelques Mo).

Pour info, il y a de trés bon tuto écrit par Dean Camera ici :

http://www.fourwalledcubicle.com/AVRArticles.php

Faut pas avoir peur de l'anglais off-course  smiley-lol

@+

Zoroastre.
Logged

Veuillez indiquer [RESOLU] dans l'entête du titre en éditant votre premier message smiley-wink

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

D'après http://www.mythic-beasts.com/~markt/ATmega-timers.html, seul le 1er timer 8bits (timer0) est utilisé.

Si tu cherche des informations sur l'utilisation directe des timers, je te recommande de lire la partie "timer0" de la datasheet(Il te faudra par fois aler chercher des infos dans d'autres sections. Par exemple, pour activer la sortie PWM après avoir modifier un timer, il te faudras modifier le Data Direction Registery [ou quelque chose dans le genre], ce qui revien à passer la patte en mode output.)
Une fois la datasheet assimilé, tu remarqueras que la libavr (utilisé par arduino) défini toute les constantes que tu a pu lire dans la datasheet. Cherches quelques exemples d'utilisation sur internet (du genre 'timers atmega328p') smiley-wink

Si tu veux savoir si une fonctionnalité précise est affectée (par exemple les libs de contrope I2C, ou autre) le plus simple et de feuilleter le code de la dite lib, et de vérifier qu'elle n'utilise pas interruption ou de compteur associé à ton timer.
Logged

Paris
Offline Offline
Sr. Member
****
Karma: 2
Posts: 366
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Premièrement : merci à tous !

Les 2 liens qui m'aident beaucoup sont les suivants :

http://www.mythic-beasts.com/~markt/ATmega-timers.html
http://deans-avr-tutorials.googlecode.com/svn/trunk/Timers/Output/Timers.pdf

On y apprend que seul le timer0 est utilisé par micros(), millis(), delay()... et que le timer1 est utilisé par la librairie servo.
J'imagine que le timer0 tourne à 250 KHz puisque la résolution du compteur micros() est de 4µs...

Le timer1 a l'air plus flexible (A & B) et plus contenant (16 bits)...

Donc je partirais bien sur l'idée de me monter un timer1 pour mes besoins personnels. (voir mon projet ici : http://www.rcgroups.com/forums/showthread.php?t=1648040&page=2 mais en anglais)

Mais alors comment "neutraliser" les interruptions mise en place par l'arduino sur le timer0 ?
Cette partie ne parait pas documentée.

La datasheet de l'Atmega 328P, je la lis souvent mais elle ne parle évidement pas de l'arduino  smiley-wink

EDIT : Je viens de trouver ceci :
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1216294585
Qui me laisse penser que wiring.c est contient ce que je cherche... cela veut-il dire que ce fichier est inclus automatiquement à chaque compilation ?

« Last Edit: June 19, 2012, 09:33:37 am by UniseV » Logged

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 !

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

À quel fréquence veut tu utiliser ton interruption? Le mode fast pwm, qui permet d'avoir une interruption OVF (counter overflow) monte à 62,5kHz, soit toute les 16uS (Le compteur est incrémenté à chaque cycle, donc à 16MHz). Tu peux bien sur diminuer le tout en utilisant des interruptions comme CMPA ou CMPB (http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html pour la liste des interruptions) mais n’oublie pas qu’avec de tels fréquences, le nombre d'instructions que tu a le temps d’exécuter n'est pas folichon...
Pour un entête de fonction utilisé comme interruption (c'est à dire une fonction vide), tu utilise déjà une vingtaine de cycles, donc ça vas très vite.

Pour savoir comment remplacer une interruption 'à chaud', ou simplement à la compilation, tu trouveras ce qu'il faut dans la doc de la libavr (il s'agit essentiellement de stocker l'adresse de ton interruption dans le bon emplacement de la mémoire de ton atméga).

La datasheet sert surtout pour savoir quels sont les modes des counters, comment les utiliser, quels sont les interruptions disponibles, etc.
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1395
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

j'utilise beaucoup les timers de l'arduino, c'est super puissant mais ça m'a pris plusieurs jours de lecture du datasheet, et plusieurs pages de brouillon. Mais ça vaut le coup de s'y intéresser (surtout sur la MEGA où on a accès à 4 timers 16 bits + 2 x 8 bits complètement indépendants). Une fois qu'on a bien compris comment utiliser les trois registres de configuration d'un timer, tout est permis. l'atmega est très polyvalent, du coup, les configs sont pas évidentes mais utiles.

Bon arrachage de cheveux!

Cinci
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

salut,

j'utilise beaucoup les timers de l'arduino, c'est super puissant mais ça m'a pris plusieurs jours de lecture du datasheet, et plusieurs pages de brouillon. Mais ça vaut le coup de s'y intéresser (surtout sur la MEGA où on a accès à 4 timers 16 bits + 2 x 8 bits complètement indépendants). Une fois qu'on a bien compris comment utiliser les trois registres de configuration d'un timer, tout est permis. l'atmega est très polyvalent, du coup, les configs sont pas évidentes mais utiles.
Je plussoie, les timers sont trés puissant une fois leur fonctionnement assimilé, et pas seulement avec les ATmega smiley-wink
Exemple avec un ATtiny85 : https://skyduino.wordpress.com/2012/06/14/attiny-generateur-de-signaux-dds-dac-software/

Mais pour ça il faut ce éplucher tout le datasheet et lire tout même (surtout) les petites lignes smiley-wink
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

0
Offline Offline
Full Member
***
Karma: 0
Posts: 104
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut,

Je rejoins la conversation car ce souci s'est posé il y a quelques mois lorsque nous préparions la coupe de robotique, à savoir: qu'utilise l'arduino pour fonctionner?

Donc si je résume ce que je viens de lire, si l'on utilise ni analogWrite() ni la librairie servo, on peut se permettre d'utiliser tous les timers (sauf le timer 0) avec "le code AVR"? c'est à dire interruptions softs et autres joyeusetés (ISR overflow?)

ça m'intéresserait vraiment de la savoir car je pense à utiliser des Arduino pour leur fiabilité hardware mais du code AVR pour son niveau plus bas...

En tout cas je suis le fil avec intéret!
Logged

J'apprends tous les jours!

Offline Offline
Newbie
*
Karma: 0
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et si tu n'utilise pas les fonctions delay/ms et que tu fait tout à la main, tu peux utiliser tout les timers smiley-wink
Logged

Bretagne
Offline Offline
Edison Member
*
Karma: 16
Posts: 1395
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Et si tu n'utilise pas les fonctions delay/ms et que tu fait tout à la main, tu peux utiliser tout les timers smiley-wink
Effectivement! Il faut savoir que chaque port série a son propre timer, le WD aussi, et l'utilisation des trois timers du UNO n'affectera personne d'autre que les fonctions pompeuses analogWrite(), delay(), millis(), etc du core arduino... que l'on n'utilise finalement que très peu et dont on peut se passer surtout si on a un DS1307 en RTC externe. Il en va de même pour les INT et PCINT.

En utilisant judicieusement les INT externes et timers, le core arduino peut retourner se coucher.
Logged

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Effectivement! Il faut savoir que chaque port série a son propre timer, le WD aussi, et l'utilisation des trois timers du UNO n'affectera personne d'autre que les fonctions pompeuses analogWrite(), delay(), millis(), etc du core arduino... que l'on n'utilise finalement que très peu et dont on peut se passer surtout si on a un DS1307 en RTC externe. Il en va de même pour les INT et PCINT.
Et quand on découvre <util/delay.h> on n'as même plus besoin de ce casser la tête smiley-wink
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

En utilisant judicieusement les INT externes et timers, le core arduino peut retourner se coucher.
Des fois je me dit que coder en "arduino" est vraiment pas plus compliqué que coder en Avr-C ...
Franchement la team arduino ferait une doc des registres/macro/fonctions les plus utilisé ça passerai comme une lettre à la poste
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Paris
Offline Offline
Sr. Member
****
Karma: 2
Posts: 366
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ouaaouu,

Le sujet passionne les foules !!

À quel fréquence veut tu utiliser ton interruption?

Je souhaite mesurer les signaux d'un recepteur de modelisme (6 voies), ce sont des pseudo PWM avec un état haut qui varie entre 1000µs et 2000µs (point milieu à 1500µs), et j'aimerai les mesurer avec une précision de 1µs.

Je dois générer 4 voies de sortie de même type (signal servo).

Plus de précision sur mon projet ici, but in Anglishe :
http://www.rcgroups.com/forums/showthread.php?t=1648040&page=2
(j'aimerai l'héberger ailleurs mais je ne sais pas encore où...)

Des fois je me dit que coder en "arduino" est vraiment pas plus compliqué que coder en Avr-C ...
Franchement la team arduino ferait une doc des registres/macro/fonctions les plus utilisé ça passerai comme une lettre à la poste

On peut uiliser une Adruino duemilanove sans l'environnement arduino ?

Et quand on découvre <util/delay.h> on n'as même plus besoin de ce casser la tête smiley-wink
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

J'ai pas encore tout bien compris mais je sens que cette librairie pourrait être l'étape intermiédiaire pour moi entre la librairie servo et le codage direct avec les registres...

...sur la MEGA où on a accès à 4 timers 16 bits + 2 x 8 bits complètement indépendants

Indépendants oui et non, ils dépendent quelque par un peu les uns des autres.
L'utilisation du timer0 par l'environnement Arduino "consomme" du temps de proc par le biais d'interruption... si mon interruption intervient simultanément mais arrive après dans la file, je vais devoir attendre et ma mesure de temps sera faussée, je ferai donc mieux de "démonter" l'utilisation du timer0 de l'environnement Arduino... non ?

Sev
Logged

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 !

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

On peut uiliser une Arduino duemilanove sans l'environnement arduino ?
Bien sur, une carte arduino c'est avant tout un bête ATmega smiley-wink
Il suffit de savoir utiliser les outils en ligne de commande, comme avrdude par exemple smiley-wink
http://skyduino.wordpress.com/2011/11/24/avr-la-musique-cest-bien-mais-polyphonique-cest-mieux/

J'ai pas encore tout bien compris mais je sens que cette librairie pourrait être l'étape intermiédiaire pour moi entre la librairie servo et le codage direct avec les registres...
Ce n'est pas vraiment une librairie c'est juste une série de fonctions permettant de créer des delais de quelque us à quelques ms.
Un peu comme delay() et delayMicroseconds() mais en plus léger et en moins usine à gaz.

L'utilisation du timer0 par l'environnement Arduino "consomme" du temps de proc par le biais d'interruption... si mon interruption intervient simultanément mais arrive après dans la file, je vais devoir attendre et ma mesure de temps sera faussée, je ferai donc mieux de "démonter" l'utilisation du timer0 de l'environnement Arduino... non ?
Regarde du côté des macro sei() et cli() qui permettent d'activer / désactiver les interruptions durant une autre interruption ou dans le code principal.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Paris
Offline Offline
Sr. Member
****
Karma: 2
Posts: 366
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Justement, ces commandes (sei et cli), dont j'utilise le pendant en C dans mon main loop pour empecher mes fonctions d'interruption de mettre à jour les données que je lis (notament pour les données plus grandes que 8bits) me posent des interrogations internes :

Ces "pause" concernent quel types interruptions ?
Les compteurs continuent de s'incrémenter normalement ? (l'incrémentation des compteurs c'est bien fait par une interruption ?)
Et les interruption de type counter overflow, elle peuvent intervenir ?
Toutes les interruptions qui auraient du arrivent pendant cette période sont-elle jetées à la poubelle ou certaines sont-elles mises en file d'attente ?

Je relis régulièrement la datasheet du 328P sur ces points, et je ne suis pas toujours éclairé.

Sev
Logged

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 !

Pages: [1] 2 3   Go Up
Jump to: