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
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
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.
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?
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
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.
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 ;)
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)
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
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.