mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega128 u Timer2


Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Allerseits,

ich mache irgendwo einen groben Denkfehler bei der Programmierung eines 
Timer2_Overflow interrupts und find ihn nicht. Ziel des Ganzen soll es 
sein, den auf 8Mhz getakteten ATmega128 den Timer2 so zu programmieren, 
das ich eine routine ziemlich genau 1200mal pro sekunde aufrufe.

Über den TCCR2 wähle ich zunächst einen 8er von  f/io Prescaler, so das 
ich in der Vorstufe schonmal einen 1Mhz Takt für TCNT2 erhalten sollte. 
Nun lade ich TCNT2 mit dem Wert 13 vor überlauf (256-13) in der 
Initialisierung und bei jedem Interruptaufruf. Ein Softwareteiler, der 
bis 64 zählt, sollte nun meine gewünschnten 1200ints/s (ca, muss nicht 
genau sein) bringen. Aufstellnung:

8.000.000 Hz interner RCTakt
1.000.000 Hz nach prescaler (TCCR2=CS21)
   76.923 Hz nach Autoreload (TCNT2=(256-13))
    1.200 Hz nach Software (zähler bis 64)

Der Code funktioniert auch, nur der Takt, mit dem meine Routine 
aufgerufen wird, ist doppelt so schnell (2400ints/s), als von mir o.g. 
berechnet.

Ansich kein Problem; ich setzte einfach den Softwarezähler auf 128 und 
gut ist. Das Problem, das ich damit habe: ich verstehs nicht. Der 
Interne RC-Resonator kann unmöglich mit 16Mhz laufen und es gäbe auch 
sonst nirgens eine 16Mhz quelle. Die lfuse steht eindeutig auf 8Mhz.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>    76.923 Hz nach Autoreload (TCNT2=(256-13))
Autorelaod gibts bei den AVRs überhaupt nicht. Und wenn Du den 
Reload-Wert in der ISR von Hand da reinschreibst: Lass es. Benutze die 
Compare-Einheit des Timers dafür (entweder CTC-Modus oder Timer einfach 
durchlaufen lassen und nur in der Compare-ISR zum Compare-Register die 
Zykluszahl addieren).

Ansonsten kann ich mir nicht vorstellen, was dazu führen könnte, dass 
doppelt so viele Interrrupts kommen wie berechnet...

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ich dachte noch "schick gleich quelltext mit". Man fällt aber auch 
immer wieder drauf rein, oder?

#define TC2Prescale CS21
TCCR2 = TC2Prescale

Na, wo ist das fehlerchen? :)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:
> Na, wo ist das fehlerchen? :)
Ich sehe mindstens zwei Fehler. Einer davon ist ein Syntaxfehler durch 
ein fehlendes Semikolon. Beim anderen kann man sich aussuchen, was man 
haben möchte. Entweder ist das #define unsinnig oder die Zuweisung...

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abgesehen von dem fehlenden Semicolon...

CS21 representiert per define die BitNUMMER. Um das entsprechende Bit zu 
setzen, müsste es entweder

#define TC2Prescale _BV(CS21)
oder
#define TC2Prescale (1<<(CS21))

heissen...

Aber es freud' mich zu sehen, daß Andere das auch übersehen und nicht 
nur ich so schäl bin :)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Niels Hüsken wrote:
> CS21 representiert per define die BitNUMMER. Um das entsprechende Bit zu
> setzen, müsste es entweder
>
> #define TC2Prescale _BV(CS21)
> oder
> #define TC2Prescale (1<<(CS21))
>
> heissen...
Das ist mir schon klar. Oder aber das #define so lassen wie es ist und
TCCR2 = 1 << TC2Prescale;
schreiben. Genauso, wie ich es oben angedeutet habe. Eine der beiden 
Zeilen ist eben falsch. Kannst Dir aussuchen, welche der beiden.

> Aber es freud' mich zu sehen, daß Andere das auch übersehen und nicht
> nur ich so schäl bin :)
Wer hat denn hier was übersehen? Wenn Du keinerlei Code postest, dann 
kann man in dem Code auch nichts übersehen. Im Moment bist DU hier der 
einzige, der das übersehen hat!

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.