Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer funktioniert nicht


von Kevin K. (smeat)


Lesenswert?

Hallo,

ich habe erst vor kurzem mit Mikrocontrollern angefangen und stehe nun 
vor einem Problem mit den Timern beim Atmega8.
Zum Testen habe ich eine LED an Pin PB0 angeschlossen.

Hier einmal mein Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define F_CPU 8000000UL  // 8 MHz
5
6
ISR (TIMER0_OVF_vect){
7
    PORTB |= (1 << PB0);
8
}
9
10
int main(){
11
  DDRB = (1 << PB0);
12
  PORTB = 0;
13
14
  TCCR0 = (1 << CS00);
15
  TIMSK |= (1 << TOIE0);
16
17
  sei();
18
19
  while(1){
20
    //PORTB |= (1 << PB0);
21
  }
22
  return 0;
23
}

Ich habe den Code auf das Nötigste reduziert, um den Fehler besser 
finden zu können.
Anscheinend wird aber die Interruptfunktion nicht ein einziges Mal 
aufgerufen, da die LED aus bleibt.
In der Schaltung sollte kein Fehler sein, da die LED leuchtet wenn ich 
den Port in der main()-Funktion aktiviere.
Ich suche schon die ganze Zeit im Datenblatt/Internet, ob ich nicht 
etwas wichtiges vergessen habe, kann aber leider nichts finden. Auch mit 
einem Atmega88 funktioniert es nicht.

Low-Fuse: 0xe4 High-Fuse: 0xd9
gcc-Version 4.8.2 (Gentoo 4.8.2 p1.0, pie-0.5.8)

Ich hoffe ich habe keine Information vergessen und mir kann jemand 
helfen.

mfg Kevin

von Bitkracherl (Gast)


Lesenswert?

Es wird sich wohl weniger um einen Fall von: "Atmega8 Timer funktioniert 
nicht" handeln, sondern um "Programm ist fehlerhaft" handeln, meinst Du 
nicht?

Also, dann wohln wir mal schauen.
Was, meinst Du, tut das hier:
1
PORTB |= (1 << PB0);

Schaltet es die LED ein oder aus?

Und was ändert sich an der LED wenn Du diesen Befehl mehrfach ausführst?

von Bitkracherl (Gast)


Lesenswert?

>Ich hoffe ich habe keine Information vergessen

Leider doch! Den Schaltplan bzw. die Angabe der verwendeten Hardware.

von Oliver (Gast)


Lesenswert?

Hm. Der Code sieht ok aus. Am Timer0 ist im Mega8 ja nicht viel dran, 
was man falsch machen könnte.

Hast du den richtigen Prozessor im makefile eingestellt?

Oliver

von Oliver (Gast)


Lesenswert?

Bitkracherl schrieb:
> Was, meinst Du, tut das hier:
>
>
1
> PORTB |= (1 << PB0);
2
>
>
> Schaltet es die LED ein oder aus?

Was meinst du, meint das hier:

Kevin K. schrieb:
> In der Schaltung sollte kein Fehler sein, da die LED leuchtet wenn ich
> den Port in der main()-Funktion aktiviere.

Oliver

von Roland .. (rowland)


Lesenswert?

Bitkracherl schrieb:
> Und was ändert sich an der LED wenn Du diesen Befehl mehrfach ausführst?

Worau willst Du hinaus? Seine LED leuchtet nie, der Interrupt wird somit 
nicht aufgerufen.

von Bitkracherl (Gast)


Lesenswert?

@ Oliver
@ Roland

Probiert es einfach mal selbst auf 'nem STK500. Dann fragt hier wieder.
(Es ist schon klar, das die Hardware nicht bekannt ist).

von spess53 (Gast)


Lesenswert?

Hi

>  TIMSK |= (1 << TOIE0);

Bei 8MHz Takt macht das 8,192 ms bis zum Overflow.

MfG Spess

von jojo1969@gmx.de (Gast)


Lesenswert?

Bitkracherl schrieb:
> Es wird sich wohl weniger um einen Fall von: "Atmega8 Timer funktioniert
> nicht" handeln, sondern um "Programm ist fehlerhaft" handeln, meinst Du
> nicht?
>
> Also, dann wohln wir mal schauen.
> Was, meinst Du, tut das hier:
>
>
1
> PORTB |= (1 << PB0);
2
>
>
> Schaltet es die LED ein oder aus?
>
> Und was ändert sich an der LED wenn Du diesen Befehl mehrfach ausführst?

Lieber Bitkracher:
Das schaltet die LED zumindest einmal ein, er sagt aber sie sei aus !

von Bitkracherl (Gast)


Lesenswert?

@  jojo1970

>Das schaltet die LED zumindest einmal ein...
Tut es das?

von Frank L. (frank_l)


Lesenswert?

Gewünscht: 1 s
Am nächsten gelegen: 0.032768 s
Verwendeter prescaler: 1024
Verwendeter preload: 0

TCCR0 |= (1<<CS02) | (1<<CS00)
TCNT0 = 0

Läßt Deinen Interrupt einmal pro Sekunde tickern.

Statt PORTB |= (1 << PB0); schreibst Du PORTB ^= (1 << PB0); und Deine 
LED sollte im 1 Hz-Takt blinken.

Gruß
Frank

von Karl H. (kbuchegg)


Lesenswert?

Bitkracherl schrieb:
> @  jojo1970
>
>>Das schaltet die LED zumindest einmal ein...
> Tut es das?

ZUmindest sagt er es.
Ich wäre ja auf einen Vorteiler 1024 gegangen und hätte die LED toggeln 
lassen. Dann ist es wurscht, ob die LED bei einer 1 oder bei einer 0 am 
Pin leuchtet. 15Hz blinken (bei 8Mhz) sollte man noch flackern sehen
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define F_CPU 8000000UL  // 8 MHz
5
6
ISR (TIMER0_OVF_vect){
7
    PORTB ^= (1 << PB0);
8
}
9
10
int main(){
11
  DDRB = (1 << PB0);
12
  PORTB = 0;
13
14
  TCCR0 = (1<<CS02) | (1 << CS00);
15
  TIMSK |= (1 << TOIE0);
16
17
  sei();
18
19
  while(1){
20
  }
21
  return 0;
22
}

von Bitkracherl (Gast)


Lesenswert?

@ Karl Heinz

Bitkracherl schrieb:
>> @  jojo1970
>>
>>>Das schaltet die LED zumindest einmal ein...
>> Tut es das?

>ZUmindest sagt er es.

Er hat gesagt, das sie nicht leuchtet:
>..., da die LED aus bleibt.

Es war also zumindest wahrscheinlich, dass er die andere Seite der LED 
an Vcc angeschlossen hat.

>Ich wäre ja...
Du hast vermutlich recht, wie so oft. Ich muss zugeben, das bei so 
einfachen Fragen, möglicherweise eine Vorgabe sinnvoll sein mag.

von Kevin K. (smeat)


Lesenswert?

Wow kommen hier schnell viele antworten. Vielen Dank!

Ich habe nun den Fehler gefunden. Ich habe immer ein raw binary benutzt, 
statt ein Intel hex. Da sonst immer alles ging, hatte ich das gar nicht 
in Frage gestellt.
Der Fehler saß also wirklich vor dem Monitor. Jetzt fühle ich mich 
richtig dämlich.
Nun muss ich erst mal die genauen Eigenschaften der beiden Formate 
herausfinden, damit ich nicht nochmal eure Zeit verschwenden muss ;)

Nochmal danke an alle, die versucht haben mir zu helfen und tut mir Leid 
für die verschwendete Zeit.

Kevin

von Bitkracherl (Gast)


Lesenswert?

Facepalm!

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.