Forum: Mikrocontroller und Digitale Elektronik Atmega8 Timer0 Overflow Interrupt - ich find den Fehler nicht


von tobias (Gast)


Lesenswert?

Hallo

An PB1 hängt eine LED die sich nicht einschält. (Gegenprobe habe ich 
gemacht, wenn rupt = 1 initialisiert wird dann leuchtet die LED)

Der Timer läuft, das habe ich schon herausgefunden.


danke für alle Hilfe,
Tobias


1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h> 
4
5
volatile uint8_t rupt = 0;
6
7
int main (void) {
8
  
9
  //Atmega8
10
  TCCR0 |= (1<<CS00)|(1<<CS02); //prescaler 1/1024
11
  TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt ON
12
  sei(); //Interrupts ON
13
  
14
  DDRB = 2;
15
  PORTB = 0;
16
  
17
  while (1) {
18
    
19
    if (rupt == 1) PORTB = 2;
20
    
21
  }
22
  
23
  cli();
24
  return 0;
25
}
26
27
28
ISR (TIMER0_OVF_vect) {
29
  rupt = 1;
30
}

von Michael H* (Gast)


Lesenswert?

bei mir im stk500 klappt der code. mega8 bei 1MHz

von tobias (Gast)


Lesenswert?

danke fürs Testen (bei mir ebenso 1MHz, interner Oszillator, kein 
Entwicklungsboard sondern Steckbrett)

An was kann es noch liegen?
- LED funktioniert
- Timer zählt
- Code läuft

Können die Werkseinstellungen der Fuse-Bits Probleme machen?

Zum Programmieren benutze ich WinAVR und Ponyprog. Bisher klappte alles 
wie es sollte (habe zuvor schon ein Projekt mit einem Atmega16 
verwirklicht).

Ich nutze jetzt als Ausweichlösung die delay-Funktionen. Morgen teste 
ich nochmal den Timer Interrupt... (bisher eine äußerst frustrierende 
Angelegenheit).

von Michael H* (Gast)


Lesenswert?

richtiger controller eingestellt? flashst du auch das richtige hex? die 
led hängt an PB1 und nicht an PB2? aktuelle programmversionen?
fuses sollten kein problem darstellen, wenn du nix verändet hast.

von MarcusW (Gast)


Lesenswert?

Tobias

Nur ne Vermutung: Falls du als Programmer den USBProg verwendest, kann 
ich dein Problem nachvollziehen. Aus irgendeinem Grund werden Programme, 
bei denen der Timerinterrupt mit einem Flag verwendet wird, bei mir auch 
nicht geflasht. Manchmal gibts dann beim Flashen ne Fehlermeldung, 
manchmal nicht. Setze mal den Programmteil mit der LED-Steuerung 
probeweise in den Interruptteil (also ohne Flag).
Zu dem Fehler gibts auch im USBProg-Forum ne muntere Diskussion. Da 
solls angeblich auch mal helfen, einfach irgendwo im Prog ne Leerzeile 
zusätzlich einzufügen!?! Frag mich nicht warum, sollte schließlich an 
der Hex nichts ändern.

von tobias (Gast)


Lesenswert?

Hallo Michael H

> richtiger controller eingestellt?

(PonyProg) Device -> AVR micro -> ATmega8


> flashst du auch das richtige hex? die led hängt an PB1 und nicht an PB2?

Ja, ich habe wie gesagt auch schon die Gegenprobe gemacht... (schon in x 
Variationen)


> aktuelle programmversionen?

PonyProg: 2.07c beta, Jan 6 2008
WinAVR: 20080610


> fuses sollten kein problem darstellen, wenn du nix verändet hast.

Hab ich nicht.


Evtl. wärs eine Idee eine Alternative zu PonyProg zu testen, ist ja noch 
beta.

von tobias (Gast)


Lesenswert?

Hallo MarcusW

Ich benutze ein selbstgebautes Kabel angeschlossen über Parallel-Port 
bestehend nur aus dem nötigsten. Wie gesagt bisher nie Probleme... jeder 
einzelne Flashvorgang den ich bisher gemacht hatte war erfolgreich.

Davon abgesehen habe ich mein Programm schon viele Male umgebaut um ja 
sicher zu gehen, daß es nicht an der Programmierung liegt.


> Setze mal den Programmteil mit der LED-Steuerung probeweise in den Interruptteil 
(also ohne Flag).

Ich habe gleich noch ein paar Kleinigkeiten geändert aber das Ergebnis 
ist immer dasselbe.
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <avr/interrupt.h> 
4
5
int main (void) {
6
  
7
  //Atmega8
8
  TCCR0 |= (1<<CS00)|(1<<CS02); //prescaler 1/1024
9
  TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt ON
10
  sei(); //Interrupts ON
11
  
12
  DDRD = 0xFF;
13
  PORTD = 0x00;
14
  
15
  while (1) ;
16
  
17
  cli();
18
  return 0;
19
}
20
21
ISR (TIMER0_OVF_vect) {
22
  PORTD = 0xFF;
23
}


Grüße,
Tobias

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.