328 PU timer 1 OCR1AL et OCR1AH

Bonjour à tous
suite au post d'un jeuneICI
je me suis intéressé de plus près au timer 1 du 328 d'ATMEL

pouvez vous me dire si l'un d'entre vous à réussi à écrire une valeur supérieure à 0xFF dans OCR1A

et si oui, comment?

perso, je le fais en assembleur sous AVR STUDIO 7, les tests me montrent que des valeurs telles que 0x3344 par exemple sont bien prises en compte et que TCNT1 compte bien jusqu'à cette valeur avant de faire basculer le sortie correspondante ( OC1A en toggle).

sous ide 18.1.9, pas moyen d'écrire une telle valeur directement en C
même en incorporant mon assembleur dans le C, la compilation se passe bien, mais OCR1H reste toujours à zéro.

Avez vous une solution ?

hello
je me réponds
tout dépends de l'ordre dans lequel on ecrit dans les registres
si j'ecris:
OCR1A=0xFFFF; TCCR1A=0x43;TCCR1B=0x1D;
le Serial.print du registre OCR1A me donne :
image

alors que si j'écris:
TCCR1A=0x43;TCCR1B=0x1D;OCR1A=0xFFFF;
le Serial.print du regstre OCR1A me donne:
image

hi,
et à la prochaine révision , il faut le réécrire dans l'autre sens ?
il n'y a , amha , aucune logique à ceci , les registres de config ne doivent pas avoir d'influence sur le registre de capture !
il eût fallu ouvrir un 'issue" , mais comme c'est une vieille version ... (et de + tu te serais fait engirlander pour ne pas utiliser le noble API)

Je pense que l'explication est au moins en partie dans le datasheet si on adresse en C un registre 16 bits en une fois sur un micro 8 bits il faut forcément utiliser une technique spécifique.

1 Like

Il faut écrire les poids forts en premier qui sont stockés dans un registre tampon et l'ensemble est transféré lorsqu'on écrit les poids faibles

1 Like

oui , mais ça , (depuis le temps) , le compilo est sensé le savoir !
quand on fait cette écriture (ou cette lecture) en c sur 16 bits , il doit faire les opérations qui vont bien ;
un coup ça marche , un coup pas , c'est un bug

1 Like

merci à vous, de vos réponses et commentaires

il m'était déjà arrivé de buter sur ce problème.

ce coup ci, j'avais décidé de rester dessus jusqu'à trouver une solution.

c'est chose faite, à ma prochaine rencontre avec une fréquence lente, je ne passerai pas autant de temps

:smile: :+1:

hello
en ce moment, un gars est sur un µ328 PB
étant un peu curieux, je suis allé voir la data sheet, et comme je pense accès aux registres en 16 bits,
j'ai regardé ce qu'il en est dit dans la data sheet du 328PB

tiens , ce n'est pas ce dont je me souviens, je vais donc vérifier dans la data sheet du 328PU, et voilà ce qu'il est dit

:astonished: :hushed: :open_mouth: :slightly_frowning_face: :woozy_face:

Bonsoir dfgh.
Votre pugnacité ma rappelle le bon temps, datasheet sous les yeux pour maîtriser des ATtiny ou des ATméga avec un langage bas niveau.
Quelle est la stratégie du fabricant d'inverser l'ordre d'écriture lecture LB et HB entre les versions PB et PU de ce 328 concernant ce registre TCNT1 et registres de comparaison OCR1A et B?
Je pense que nous n'aurons jamais la réponse.
Cordialement.

Your above discussion is barking up the wrong tree. In fact, the compiler will always generate the correct write order, and developers don't need to worry about this. Instead, you actually need to pay attention to page 142, 145 and 154 of the Datasheet:

The OCRnx Register is double buffered when using any of the twelve Pulse Width Modulation (PWM) modes. For the Normal and Clear Timer on Compare (CTC) modes of operation, the double buffering is disabled. The double buffering synchronizes the update of the OCRnx Compare Register to either TOP or BOTTOM of the counting sequence.
When the double buffering is enabled, the CPU has access to the OCRnx Buffer Register, and if double buffering is disabled the CPU will access the OCRnx directly. The content of the OCR1x (Buffer or Compare) Register is only changed by a write operation (the Timer/Counter does not update this register automatically as the TCNT1 and ICR1 Register). Therefore OCR1x is not read via the high byte temporary register (TEMP).


To summarize, when the lower two bits of TCCRA are not all zeros, OCRA is controlled by PWM mode and cannot exceed the number of bits allowed by PWM (8, 9 or 10 bits). Therefore, before setting OCRA to a larger value, you must first set the lower two bits of TCCRA to 0.

hello ebolachan.
désolé de cette réponse tardive, comme tous les retraités, je manque de temps.... :innocent:
"Pour résumer, lorsque les deux bits inférieurs de TCCRA ne sont pas tous des zéros, OCRA est contrôlé par le mode PWM et ne peut pas dépasser le nombre de bits autorisé par PWM (8, 9 ou 10 bits). Par conséquent, avant de définir OCRA sur une valeur plus élevée, vous devez d’abord définir les deux bits inférieurs de TCCRA sur 0."

tout dabord, merci de l'intéret que tu portes à cette question.

ta réponse est intéressante, mais je te renvoie à mon post #2
tout dépends de l'ordre dans lequel on ecrit dans les registres
si j'ecris:
OCR1A=0xFFFF; TCCR1A=0x43;TCCR1B=0x1D;
le Serial.print du registre OCR1A me donne :
image

alors que si j'écris:
TCCR1A=0x43;TCCR1B=0x1D;OCR1A=0xFFFF;
le Serial.print du regstre OCR1A me donne:
image

je suis daccord pour le fait que les bits 0 et 1 doivent etre à 1 pour etre dans un mode qui accepte une valeur telle que 0xFFFF.
ce que je faisais remarquer, c'est qu'il faut dabord écrire à 1 les bits 0 et 1 de TCCR1A puis écrire 0XFFFF dans OCR1A . le compilateur ayant été prévenu en premier de la valeur de TCCR1A, il va gérer correctement OCR1A.

mais si le compilateur ne sait pas la valeur de TCCR1A, il ne va pas la voir avant de gerer OCR1A.
il y a donc bien un ordre d'écriture à respecter pour que le compilateur sache quoi faire.

encore merci de ta reponse. :+1:

Indeed, I ignored the second half of the table. When WGM3 is set (in TCCRB), the limit on OCRA bits is also removed. But this also means that the TCCRA setting in your code won't help - setting only the TCCRB WGM3 bit is enough to remove the OCRA restriction. Otherwise, you must still set the lower two bits of TCCRA to 0.

:+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.