[Programmation] Chronometre AVR
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Chronometre AVR



  1. #1
    doubletortue

    Chronometre AVR


    ------

    Bonjour,

    Etant donner qu'il n'y a pas de catégorie AVR je poste ici veuillez m’excuser

    Je suis a la recherche d'aide ou d'un code pour pouvoir mesurer un temps sur un atmega8. Comme la fonction millis() sur arduino, que je puisse savoir pendant combien de temps un PORT est resté a un.

    Merci d'avance de votre aide

    -----

  2. #2
    PA5CAL

    Re : Chronometre AVR

    Bonjour

    À mon sens une catégorie AVR n'aurait pas sa place dans la rubrique « Électronique » parce que la programmation des micro-contrôleurs est plutôt une question d'informatique industrielle.

    Il existe de nombreuses façons de mesure une durée sur un micro-contrôleur qui dispose d'au moins un timer et de fonctions d'interruption, qu'on peut d'ailleurs ne pas utiliser. La résolution et la précision de la mesure, la durée maximale attendue et les tâches menées en parallèle sont des paramètres à prendre en compte dans le choix de la solution.

    Voici un exemple de solution simple, par polling :

    Code:
    ; Sortie : r23:r20 compteur 32 bits
    
    ; Met le compteur à zéro 
      ldi   r20, 0x00    ; clear r23:r20 
      ldi   r21, 0x00    ;
      movw  r22, r20     ;
    
    ; Interdit les interruptions
      cli                ;
    
    ; Attend un niveau haut sur PB1
    loop1:
      sbis   0x16, 1     ; (1/2) test bit 1 of I/O register PINB
      rjmp   loop1       ; (2/0) loop while bit is cleared
    
    ; Compte en attendant un niveau bas sur PB1
    loop2:
      sbis   0x16, 1     ; (1/2) test bit 1 of I/O register PINB
      rjmp   end_t       ; (2/0) end if bit is cleared
      subi   r20, 0xFF   ; (1)   add 1 to r23:r20
      sbci   r21, 0xFF   ; (1) 
      sbci   r22, 0xFF   ; (1)
      sbci   r23, 0xFF   ; (1)
      rjmp   loop2       ; (2)   loop
    
    end_t:
    ; Autorise les interruptions
      sei                ;
    Le compteur contenu dans les registres r20 à r23 contient la durée du niveau haut appliqué sur la broche PB1. Le code est valable pour un ATmega8 (registre PINB à l'adresse 0x16 dans l'espace des registres d'entrée/sortie).

    Les chiffres entre parenthèses indiquent le nombre de cycles machine des instructions.

    Résolution : 8 cycles machine par boucles de comptage. La durée est exprimée en microsecondes sur un ATmega8 cadencé à 8 MHz.

    Précision : la différence entre la durée et sa mesure est comprise entre –5 cycles et +6 cycles, soit entre –0,625µs et +0,75µs sur un ATmega8 cadencé à 8 MHz, à la précision de la fréquence d'horloge près.
    Dernière modification par PA5CAL ; 21/01/2019 à 11h17.

  3. #3
    abracadabra75

    Re : Chronometre AVR

    Bonjour.
    Quelque soit le processeur et son fabricant, une durée est toujours faite par comptage.
    tu peux faire une simple boucle (exemple pour un quartz de 16 MHz et un processeur Atmel, pour 2 millisecondes):
    Code:
    tempo_ms2:
    		ldi		ZH,$7D
    		ldi		ZL,$00
    tempo_ms2_1:			
    		sbiw	      ZL,4		      ; SBIW fait 2 cycles
    		 brne	tempo_ms2_1			; + 2 cycles de boucle = 4
    	ret
    Celle façon de faire a 2 inconvénients:
    -occuper la cpu durant l'attente
    -une certaine imprécision. (Dans l'exemple ci-dessus l'erreur est de 12 cycles-horloge).

    Une autre façon est d'employer le mode de comptage dit 'CDC' (pour les AVR). On documente un registre (par exemple OCRA1) avec la valeur adéquate. Lorsque le compteur atteint la valeur ci-dessus, une interruption se produit qui permet alos de faire le traitement voulu.

    Le choix dépend donc du but cherché. Pour faire une horloge, la boucle est beaucoup trop imprécise, la méthode par interruption est impérative.
    De même si tu veux créer une fréquence précise.Par contre, si c'est pour attendre quelques millisecondes, le comptage est plus pratique.

    A+
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  4. #4
    PA5CAL

    Re : Chronometre AVR

    Citation Envoyé par abracadabra75 Voir le message
    tu peux faire une simple boucle
    Attention, ici il n'est pas question de produire un état d'une durée déterminée, mais de mesurer la durée inconnue d'un état.

    S'agissant de produire un signal, avec un ATmega il est possible de réaliser logiciellement n'importe quelle durée au cycle machine près, à condition de ne pas réaliser d'autres tâches en parallèle (et de ne pas avoir recours juste à une simple boucle). L'utilisation des seules fonctions matérielles (générateur attaché à un compteur-timer) autorise l'exécution de tâches en parallèle, mais la durée est limitée et sa résolution est d'autant plus mauvaise que cette durée est importante. Enfin, la précision des durées obtenues par le biais d'interruptions dépend de la longueur des opérations atomiques présentes dans le programme (par exemple le traitement d'une interruption peut être retardée de 3 cycles machine si elle survient durant l'exécution d'une instruction RET, et beaucoup plus durant l'exécution d'une portion de programme non-interruptible, comme le traitement d'une autre interruption).

    S'agissant de mesurer une durée, de façon purement logicielle on peut obtenir une précision de ±1 cycle machine sur une durée inférieure à 30 cycles pour un événement attendu. La même précision peut être obtenue sur des durées plus longues en ayant recours aux fonctions matérielles (Input Capture du compteur-timer 16 bits), moyennant certaines contraintes. Dans les deux cas, les différentes contraintes peuvent être levées si l'on accepte une résolution et une précision plus mauvaises (comme dans l'exemple que j'ai donné). Le recours aux interruptions (notamment sur changement d'état des entrées INTx) implique le même problème de précision sur le résultat que celui soulevé ci-dessus.
    Dernière modification par PA5CAL ; 22/01/2019 à 17h12.

  5. A voir en vidéo sur Futura
  6. #5
    abracadabra75

    Re : Chronometre AVR

    Tes précisions ont importantes., et tout dépend du contexte.
    Comme toujours, avant de programmer quoi que ce soit, il faut avoir réfléchi un brin, et savoir exactement ce qu'on veut faire,
    Il n'y a que dans le dictionnaire où 'réussite' vient avant 'travail'.

  7. #6
    PA5CAL

    Re : Chronometre AVR

    En effet. Il n'y a plus qu'à espérer que doubletortue repasse sur le forum pour donner des précisions quant à ses demandes.

Discussions similaires

  1. Chronomètre à led
    Par Boomer_80 dans le forum Électronique
    Réponses: 14
    Dernier message: 27/09/2013, 08h20
  2. Chronomètre
    Par invite2ef11dd9 dans le forum Électronique
    Réponses: 4
    Dernier message: 02/11/2010, 07h54
  3. chronometre
    Par invite425959be dans le forum Électronique
    Réponses: 4
    Dernier message: 13/05/2010, 01h56
  4. chronometre
    Par mej dans le forum Physique
    Réponses: 2
    Dernier message: 24/06/2008, 20h54
  5. Chronomètre (74 ls 160)
    Par invite02200952 dans le forum Électronique
    Réponses: 10
    Dernier message: 11/06/2007, 13h21
Découvrez nos comparatifs produits sur l'informatique et les technologies.