ATMEGA48 Timer0 Problem

Gast #2775429
Hallo,
ich versuche gerade verzweifelt den Timer0 am ATMEGA 48 in ganz zu 
bringen.
Leider funktioniert folgender code nicht:
1
volatile uint16_t millisekunden = 0;
2

3
void init()
4
{
5
        /* Control Timer aktivieren */
6
  TCCR0A = (1<<WGM01); // Normal port operation, OC0A disconnected, CTC
7
  TCCR0B = (1<<CS22) | (0<<CS21) | (1<<CS20); // Prescaler 1024
8
  TIMSK0 = (1 << OCIE0A); //Timer0A output compare match interrupt
9
  OCR0A = 20;
10
  TCNT0 = 0;
11

12
  sei(); // turn interrupt on
13
}
14

15
ISR(TIMER0_COMPA_vect)
16
{
17
  millisekunden++;
18
  if (outputState.PWMPortOutput[1] != 100)
19
    outputState.PWMPortOutput[1] = 100;
20
  else
21
    outputState.PWMPortOutput[1] = 0;
22
  if (millisekunden == 1000)
23
  {
24
    if (outputState.PWMPortOutput[0] == 100)
25
      outputState.PWMPortOutput[0] = 0;
26
    else
27
      outputState.PWMPortOutput[0] = 100;
28

29
    millisekunden = 0;
30
  }
31
}

Der Interrupt wird wenn nur einmal aufgerufen.
Timer 2 läuft ohne Probleme (generiert das PWM aus outputState). Auch 
Timer1 läuft mit dalay_ms problemlos.
Dann hab ich noch PCINT Interrupts, auch diese laufen Problemlos.
Also warum läuft Timer0 nicht?
Auch den ATmega hab ich schon getauscht... selbes Problem.
Hat irgendwer noch ne Idee woran das liegen könnte?
ahh ja klar dämlicher copy paste....
Aber leider keine Änderung... (Bits sind gleich).
Was mir aber noch aufgefallen ist: Wenn ich die PCINT Interrupts häufig 
betätige wird der Interrupt vom Timer0 auch in nicht nachvollziehbarer 
Weise ausgeführt (outputState.PWMPortOutput[1] = 100; resp. 
outputState.PWMPortOutput[1] = 0;).
Gast
>Auch Timer1 läuft mit dalay_ms problemlos.

Öh, was?

>ahh ja klar dämlicher copy paste....
>Aber leider keine Änderung... (Bits sind gleich).

Ich weiss, aber wenn du mal nen kompletten Quellcode
zeigen würdest, dann könnte man vieleicht auch helfen.

Alternativ würde ich dir mal empfehlen nur Timer0
in einem Testprogramm auszuprobieren. Eigentlich sieht die
Init gut aus.
20Mhz
Aber ich glaub ich habs gefunden:
Der Timer 2 lief mit Prescaler 8. Das war anscheinend zu viel. Jetzt 
läuft der mit 32 und OCR2A = 100; nun funktioniert Timer0.
Grrr die halbe Nacht hab ich gestern danach gesucht...
Gast
Hi

>Joh ich meint auch 64, halt das nächst höhere nach 8.

Mit Millisekunden hat das aber trotzdem nichts zu tun. Da wärst du mit 
clk/256 und OCR0A=77 am nächsten dran.

MfG Spess

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.