ATMega328 CTC 8bit Timer

Gast #4094080
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.
Moderator Persönliche Seite #4094094
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.
Gast #4094138
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
#4094250
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.
Gast #4094472
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.