Forum: Mikrocontroller und Digitale Elektronik Timer1 läuft nicht an?


von Bobby McFerrin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
die letzten Tage habe ich mit dem Installieren und der Inbetriebnahme
und Einarbeitung des AVR Studios mit WinAvr beschäftigt. Ich habe
vorher mit CodeVision gearbeitet und war nun einfach mal auf der Suche
nach einem freien C-Compiler. Mein Fazit vorab: Ich bin sehr angetan
von der aus Kombination von Studio und WinAvr entstehenden kompletten
Entwicklungsumgebung. Großes Plus ist die Möglichkeit auf C-Ebene zu
debuggen.
Nun wollte ich den Timer1 mal zum Laufen bringen, dieser läuft aber
leider nicht los. Ich denke eigentlich habe ich alle Register
vernünftig initialisiert, aber wie gesagt er läuft nicht los.

Vielen Dank für die Hilfe und Tips schon im voraus.

von Bobby McFerrin (Gast)


Lesenswert?

P.s.: Das Tutorial hier habe ich mir schon durchgelesen, also bitte
keine Verweise darauf.

von crazy horse (Gast)


Lesenswert?

um welchen Chip gehts denn?
Beim Mega8 z.B. müsste es heissen
TIMSK=0x10;
besser daher die entsprechende symbolische Schreibweise...

von Bobby McFerrin (Gast)


Lesenswert?

Sorry, habe ich vergessen anzugeben.
Es ist ein ATMega8535
Habe die Register nach durchlesen des Datenblatt initialisiert.

von thkais (Gast)


Lesenswert?

Mit symbolischer Schreibweise ist gemeint: TIMSK = (1<<OCIE1A) zum
Beispiel. Liest sich besser als TIMSK = 0x10;
Denn TIMSK = 0x40 ist falsch. Der Timer läuft zwar, löst aber keinen
Interrupt aus (denn Du hast den Overflow des Timer2 selektiert)

von Bobby McFerrin (Gast)


Lesenswert?

@thkais,
hast recht, muss natürlich TIMSK=0x01 bzw. TIMSK=(1<<OCIE1A) heißen.


Aber das Hauptproblem bleibt; der Timer läuft nicht an. Er müsste doch
nach Init von TCCR1B anlaufen. Hier wähle ich:
CS12:CS10 0b00000101 //Vorteiler 1024
Und für CTC Mode: Setzen von WGM12 bzw. CTC1. Dies ist das 3. Bit im
Register, also ergibt sich doch
TCCR1B=0b00001101 bzw. TCCR1B=0x0D
bzw. symbolisch:
TCCR1B=(1<<CS12)|(1<<CS10)|(1<<CTC1);

von johnny.m (Gast)


Lesenswert?

Woraus schließt Du eigentlich, dass der Timer nicht losläuft? Wenn Du
das vom Debugger hast, in welchem Modus lässt Du den denn laufen? Bei
einer Taktteilung von 1024 kriegste ja nur alle 1024 Takte ein
Inkrement in TCNT1. Wenn Du in Einzelschritten simulierst, dann
müsstest Du 1024 mal klicken, bevor sich da überhaupt was tut.

von Bobby McFerrin (Gast)


Lesenswert?

@johnny b
Hast auch recht. Ich hab den Vorteiler auf 1 eingestellt und den
Compare wert auf 10, so dass man im Simulator mehr sieht.
Timer läuft, die ISR wird jedoch nicht ausgeführt. Jetzt weiß ich
zumindest schon genauer wo es klemmt.

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.