mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer1_Overflow interrupt_funzt nicht atmega32


Autor: cler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo...

Bin gerade verzweifelt auf der Suche nach dem Fehler:
Und zwar möchte ich dass periodisch nach Ablauf von 1ms eine Variable 
inkrementiert wird und diese gleichzeitig in der Mainfunktion oder in 
anderen Funktionen auslesbar sind:
Als Hardware verwende ich die mikrosps mit atmega32 controller mit einer 
Taktfrequenz von 16 MHz, wobei dieser dann über das stk 500 board 
geflasht wird.

siehe folgenden Code:
#define TAKT 16 000 000UL //Systemtakt 16 MHz
#define Teiler 65536UL-(TAKT/256UL)

unsigned int global_time=0;
unsigned int task_time=500; //nach 500 ms wird global_time resetet (auf //0 gesetzt) zusätzlich soll eine LED nach 500 ms an PORTB getoggelt werden

//ISR
SIGNAL (TIMER_OVERFLOW1)
{
TCNT1=Teiler;//timer1 Anfangswert
//schalte alle Interrupt aus
   cli();
global_time++;
if(global_time>task_time)
{
global_time=0;
PORTB^=(1<<4);
}
//bewillige alle Interrupts wieder
  sei();

}
//Hauptfunktion für Parametrisierung
int main(void){

DDRB=0xFF; // PortB als Ausgang
TCCR1A=0x00;//Compare A aus
TCCR1B=0x04;//Prescaler 16 Mhz/256=62500 Hz

TCNT1=Teiler;//timer1 Anfangswert

TIMSK|=(1<<TOIE1); Interrupt frei
sei();//I=1: alle Interrupts frei

while(1){};//leere Endlosschleife

return 0;
}
Leider funzt es nicht. Könnt ihr mir helfen...Bin verzwiefelt


gruß cler

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch's mal mit volatile

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cli() und sei() haben in der ISR nichts zu suchen.
SIGNAL sperrt sowieso die anderen ISRs.
Statt TCNT1 immer vorzuladen wäre der CTC Modus was für dich.
Probiers mal mit volatile für die Variable global_time, sonst wirst in 
der Main Funktion nicht viel auslesen können (hier sowieso, da sie leer 
ist).

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SIGNAL ist veraltet, allerdings schadet das (noch) nicht. Trotzdem 
solltest du auf ISR umstellen.

Selbst erfundene Interruptvektoren dagegen führen unweigerlich zur 
Verzweiflung. Der Vektor heisst SIG_OVERFLOW1(veraltet) oder 
TIMER1_OVF_vect. TIMER_OVERFLOW1 gibt es nicht.

guggst du hier:
http://www.nongnu.org/avr-libc/user-manual/group__...

Oliver

Autor: Christopher G. (cbg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> SIGNAL ist veraltet, allerdings schadet das (noch) nicht. Trotzdem
> solltest du auf ISR umstellen.
Kommt auf die avr-libc, die er verwendet, an. Auf der Uni haben wir auch 
eine ältere Version, wo man noch SIGNAL für ununterbrechbare und ISR für 
unterbrechbare ISRs verwenden muss. Da können wir auch nicht selber 
upgraden.

> Selbst erfundene Interruptvektoren dagegen führen unweigerlich zur
> Verzweiflung. Der Vektor heisst SIG_OVERFLOW1(veraltet) oder
> TIMER1_OVF_vect. TIMER_OVERFLOW1 gibt es nicht.
Da man hier keinen einzigen #include sieht (Absicht oder Fehler) weiß 
man nicht obs evtl ein eigenes Makro ist was irgendwo drinsteht oder vl 
vorher noch wo steht. Ist aber unwahrscheinlich und ich geb dir deshalb 
Recht. Natürlich is das zur verwendeten avr-libc passende Makro zu 
nehmen.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen vom falschen Namen der ISR (SIGNAL-Routine): Die Einstellung 
für 1ms stimmt nicht, weil Teiler falsch berechnet wird. Dein Timer 
braucht wesentlich länger bis zur ISR (1000x so lang). Benutze deshalb 
die Zeile: #define Teiler 65536-(TAKT/1000/256)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Abgesehen vom falschen Namen der ISR (SIGNAL-Routine): Die Einstellung
>für 1ms stimmt nicht, weil Teiler falsch berechnet wird. Dein Timer
>braucht wesentlich länger bis zur ISR (1000x so lang). Benutze deshalb
>die Zeile: #define Teiler 65536-(TAKT/1000/256)

Abgesehen davon ist der Overflow-Interrupt mit Preload eh das 
ungeeignete Mittel. Dafür gibt es die OC-Register und den CTC-Mode.

MfG Spess

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.