Forum: Mikrocontroller und Digitale Elektronik ATMEGA48 Timer0 Problem


von jingo (Gast)


Lesenswert?

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?

von holger (Gast)


Lesenswert?

>  TCCR0B = (1<<CS22) | (0<<CS21) | (1<<CS20); // Prescaler 1024

  TCCR0B = (1<<CS02) | (0<<CS01) | (1<<CS00); // Prescaler 1024

von jingo j. (jingo)


Lesenswert?

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;).

von spess53 (Gast)


Lesenswert?

Hi

Mit welcher Frequenz läuft dein ATMega?

MfG Spess

von holger (Gast)


Lesenswert?

>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.

von jingo j. (jingo)


Lesenswert?

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...

von spess53 (Gast)


Lesenswert?

Hi

> Jetzt läuft der mit 32 und OCR2A = 100; nun funktioniert Timer0.

Einen Prescaler von 32 hat der nicht

MfG Spess

von jingo j. (jingo)


Lesenswert?

spess53 schrieb:
> Einen Prescaler von 32 hat der nicht

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

von spess53 (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

jingo jango schrieb:
> spess53 schrieb:
>> Einen Prescaler von 32 hat der nicht
> Joh ich meint auch 64, halt das nächst höhere nach 8.
Was? Den hat ja sogar der Atmega8.

mfg.

von spess53 (Gast)


Lesenswert?

Hi

>Was? Den hat ja sogar der Atmega8.

Timer2 hat einen Prescaler von 32. Timer0 nicht.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

spess53 schrieb:
> Timer0 nicht.
Das hat ja auch niemand behauptet.
> Der Timer 2 lief mit Prescaler 8. Das war anscheinend zu viel. Jetzt
> läuft der mit 32 und OCR2A = 100;

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.