Forum: Mikrocontroller und Digitale Elektronik ATMega328 CTC 8bit Timer


von UnendlichHoherPotentialtopf (Gast)


Lesenswert?

Hi,

ich habe hier ein Problem mit meinem ersten Timerversuch.
Wenn TOV0 gesetzt ist soll die while Schleife abgebrochen werden.
Scheinbar komme ich aber nie da rein. Ich vermute, dass die Bedingung 
falsch ist.
Aktuell bleibt die LED an PB0 immer an.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
int main(void)
5
{
6
    DDRB = 0xFF;    // Port B als Ausgang
7
    PORTB |= (1 << PB0);  // PB0 einschalten  
8
9
    while (1)
10
    {
11
        // Timer im CTC mode
12
        TCCR0A = (1 << WGM01);
13
14
        //1ms bei 8MHz
15
        //125(7D)/8000000*64=1ms
16
17
        // Vergleichswert für Timeroverflow
18
        OCR0A = 0x7D;    
19
20
        // Timer starten mit Prescaler auf 64
21
        TCCR0B |= (1 << CS01) | (1 << CS00);
22
23
        //Solange bis Überlauf 
24
         while ( (TIFR0 & (1 << TOV0) ) > 0)        
25
         {
26
             PORTB &= ~(1 << PB0);    // PB0 ausschalten
27
             _delay_ms(100);
28
         }  
29
             
30
        //Überlaufflag wieder umschalten
31
        TIFR0 &= ~(1 << TOV0);
32
    }
33
}


Danke
UnendlichHoherPotentialtopf

P.S: Ich wollte erstmal so anfangen bevor ich mit Interrupt beginne.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Auszug aus dem Datenblatt:

"Alternatively, TOV0 is cleared by writing a logic one to the flag."

Das hier:
1
        //Überlaufflag wieder umschalten
2
        TIFR0 &= ~(1 << TOV0);

ist also schon mal falsch.

Richtig wäre:
1
        //Überlaufflag wieder umschalten
2
        TIFR0 |= (1 << TOV0);

Ausserdem:

"The setting of this flag is dependent of the WGM02:0 bit setting. Refer 
to Table 14-8, ”Waveform Generation Mode Bit Description” on page 108."

Und dort steht, dass das TOV0-Flag nur gesetzt wird, wenn OCRA MAX 
erreicht. MAX ist aber 0xFF. Das kann nicht erreicht werden wegen:

    OCR0A = 0x7D;

> P.S: Ich wollte erstmal so anfangen bevor ich mit Interrupt beginne.

Mein Tipp:

Machs direkt mit Interrupts und vergiss das Pollen eines Registers.

von UnendlichHoherPotentialtopf (Gast)


Lesenswert?

Frank M. schrieb:
> Und dort steht, dass das TOV0-Flag nur gesetzt wird, wenn OCRA MAX
> erreicht. MAX ist aber 0xFF. Das kann nicht erreicht werden wegen:

Stimmt hier habe ich TOP und MAX verwechselt.
Ich kann dann scheinbar nur TCNT0 abfragen.


Frank M. schrieb:
> Richtig wäre:        //Überlaufflag wieder umschalten
>         TIFR0 |= (1 << TOV0);

Danke, das muss ich ändern.

UnendlichHoherPotentialtopf

von Thomas E. (thomase)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:
> Stimmt hier habe ich TOP und MAX verwechselt.
> Ich kann dann scheinbar nur TCNT0 abfragen.

Welchen Sinn soll das alles haben?

Dein Timer ist im CTC-Mode.

Und wenn ich diesen Kommentar:
1
// Vergleichswert für Timeroverflow
2
OCR0A = 0x7D;

sehe, kommen mir Zweifel, ob du das auch verstanden hast.

CTC ist ein eigener Mode mit einem eigenen Interrupt.

Dieser Interrupt(COMPA0) wird ausgelöst wenn TCNT0 = OCR0A ist. Dann 
wird der TCNT0 auf 0 gesetzt und das Spiel beginnt von vorn. Das, was du 
gerade über Umwege versuchst und auf diesem Wege nie sinnvoll 
hinbekommen wirst, hat der Timer komfortabel eingebaut.

mfg.

von UnendlichHoherPotentialtopf (Gast)


Lesenswert?

@Thomas
Ich bin gerade am Probieren wie das mit den Timern funktioniert.
Das war mein erster Anlauf.
Danke für den Hinweis.

Ich habe jetzt auch noch ganz gute Beispiele gefunden.

UnendlichHoherPotentialtopf

von Thomas E. (thomase)


Lesenswert?

UnendlichHoherPotentialtopf schrieb:
> Ich habe jetzt auch noch ganz gute Beispiele gefunden.

Wenn du die Beispiele hier aus dem Tutorial meinst, orientiere dich 
nicht so sehr am Timer0. Der Timer0 des 328 ist gegenüber dem 
8048-Revival-Timer des Atmega8 mittlerweile erwachsen geworden und ist 
von den Funktionen her näher dran am Timer1.

mfg.

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.