Atmega8 Timer funktioniert nicht

OP #3429910
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
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
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
Gast
@ Oliver
@ Roland

Probiert es einfach mal selbst auf 'nem STK500. Dann fragt hier wieder.
(Es ist schon klar, das die Hardware nicht bekannt ist).
Gast
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 !
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
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
@ 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.
OP
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

Eine eigene Frage? Dieser Thread ist über 12 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.