Forum: Mikrocontroller und Digitale Elektronik Outpout compare (AVR) neu laden


von Herb B. (s-stoerung)


Lesenswert?

Mahlzeit,

ich hab nen ATMega168.
Ich würde gerne wärend des CompareA oder B im normal mode, den 
Comparewert neu laden, also einen anderen.
Ich bin aber der Meinung das daß nicht funktioniert, zmindest hab ich 
das Datenblatt so verstanden.
Hab ich recht? Und wenn ja, hat jemand vielleicht ne Alternative?

Greetz

Herb

von spess53 (Gast)


Lesenswert?

Hi

>Ich würde gerne wärend des CompareA oder B im normal mode,

Was meinst du mit: 'wärend des CompareA oder B'?

Die Compare-Register kannst du jederzeit neu beschreiben.

MfG Spess

von Herb B. (s-stoerung)


Lesenswert?

Sorry, hab nur die hälfte geschrieben :)

Also ich mein wärend der ISR von CompareA, einen neuen Wert ins Compare 
Register hineinschreiben. Mit B Genauso.

von Karl H. (kbuchegg)


Lesenswert?

Herb B. schrieb:
> Sorry, hab nur die hälfte geschrieben :)
>
> Also ich mein wärend der ISR von CompareA, einen neuen Wert ins Compare
> Register hineinschreiben. Mit B Genauso.

Immer noch die gleiche Antwort: Wer soll dich daran hindern, und warum 
soll das nicht gehen?

von spess53 (Gast)


Lesenswert?

Hi

>Also ich mein wärend der ISR von CompareA, einen neuen Wert ins Compare
>Register hineinschreiben. Mit B Genauso.

Was sollte dich daran hindern? Allerdings ist es u.U. günstiger das 
Update im Overflow-Interrupt zu machen.

MfG Spess

von Hc Z. (mizch)


Lesenswert?

Im normalen Mode geht das.

Worauf Du vermutlich anspielst, ist, dass das Output Compare Register in 
bestimmten Modes double buffered ist und dort Änderungen nur am Beginn- 
oder Endwert übernommen werden, was Dich auf einen einzigen 
Compare-Interrupt pro Zählerdurchlauf beschränkt.  Aber Du hast ja 
normal mode.

von Herb B. (s-stoerung)


Lesenswert?

Ok ich dachte das geht halt nur wenns double buffered ist. Dann hab ichs 
falsch verstanden :)

Ich habs mir schon gedacht das es ziemlich u.U is aber ne bessere Lösung 
hab ich leider nicht für meine Problematik..
Tnx ;)

von Karl H. (kbuchegg)


Lesenswert?

Herb B. schrieb:

> Ich habs mir schon gedacht das es ziemlich u.U is aber ne bessere Lösung
> hab ich leider nicht für meine Problematik..

Dann schildere mal deine Problematik.

Denn bei diesem Verfahren gibt es eine Falle:

Wenn der neue Wert größer ist als der alte, dann werden dir ein einem 
Timerdurchlauf 2 Matches generiert.

Das kann egal sein, muss es aber nicht.
(Daher auch der Vorschlag von spess53 sich selbst eine Art double 
buffering mit dem Overflow Interrupt zu bauen)

von spess53 (Gast)


Lesenswert?

Hi

>Wenn der neue Wert größer ist als der alte, dann werden dir ein einem
>Timerdurchlauf 2 Matches generiert.

Daher mein Tip mit dem Overflow-Interrupt.

MfG Spess

von Peter D. (peda)


Lesenswert?

Herb B. schrieb:
> Ich würde gerne wärend des CompareA oder B im normal mode, den
> Comparewert neu laden, also einen anderen.

Ja das geht.
Es ist sogar der einzige Weg, wenn A und B 2 verschiedene Frequenzen 
ausgeben sollen:
1
//ISR_A:
2
  OCR1A += TIME_1;
3
4
//ISR_B:
5
  OCR1B += TIME_2;


Peter

von Vlad T. (vlad_tepesch)


Lesenswert?

Herb B. schrieb:
> Ok ich dachte das geht halt nur wenns double buffered ist. Dann hab ichs
> falsch verstanden :)

wenns nicht double buffered ist, hast du unter umständen das Problem, 
dass der conter schon am comparewert vorbei ist.
dann kommt er erst das nächste mal, wenn er einmal übergelaufen ist.
Das kann bei zeitkritischen Prozessen oder bei langsamlaufenden Timern 
(zb 16bit) Probleme bereiten.

von Herb B. (s-stoerung)


Lesenswert?

Die Problematik is halt, wie Peter schon bemerkte das ich 2 Frequenzen 
ausgeben möchte...
Da wollt ich die Compare Werte genau wärend des Compares neu laden.
(Natürlich nur größere Compare Werte) ;)
Da ich ja die Timer Overflow ISR nur für eine der beiden frequenzen 
nutzen kann.

Ich werd eure Tips mal beherzigen. mal sehen was rauskommt ;)

Tnx

von spess53 (Gast)


Lesenswert?

Hi

>Da ich ja die Timer Overflow ISR nur für eine der beiden frequenzen
>nutzen kann.

Du hast weiter oben von 'normal mode' geschrieben. Das heisst 
eigentlich, das der Timer einfach durchläuft.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.