mikrocontroller.net

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


Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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



#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h> 

volatile uint8_t rupt = 0;

int main (void) {
  
  //Atmega8
  TCCR0 |= (1<<CS00)|(1<<CS02); //prescaler 1/1024
  TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt ON
  sei(); //Interrupts ON
  
  DDRB = 2;
  PORTB = 0;
  
  while (1) {
    
    if (rupt == 1) PORTB = 2;
    
  }
  
  cli();
  return 0;
}


ISR (TIMER0_OVF_vect) {
  rupt = 1;
}



Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bei mir im stk500 klappt der code. mega8 bei 1MHz

Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Michael H* (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: MarcusW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h> 

int main (void) {
  
  //Atmega8
  TCCR0 |= (1<<CS00)|(1<<CS02); //prescaler 1/1024
  TIMSK |= (1<<TOIE0); //Timer0 Overflow Interrupt ON
  sei(); //Interrupts ON
  
  DDRD = 0xFF;
  PORTD = 0x00;
  
  while (1) ;
  
  cli();
  return 0;
}

ISR (TIMER0_OVF_vect) {
  PORTD = 0xFF;
}


Grüße,
Tobias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.