Atmega8 Timer funktioniert nicht

#3429910
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
Gast #3429918
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?
Gast #3429935
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 !
#3429973
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
}
Gast #3430002
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.
#3430073
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren