mikrocontroller.net

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


Autor: Herb B. (s-stoerung)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Herb B. (s-stoerung)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herb B. (s-stoerung)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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:
//ISR_A:
  OCR1A += TIME_1;

//ISR_B:
  OCR1B += TIME_2;


Peter

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herb B. (s-stoerung)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.