Interrupt Routine schreiben (Timer 1 , 16 bit)

Gast #525913
Lesenswert?
• ▲
▼
Hallo zusammen... Ich hoffe, dass ihr mir helfen könnt.

Und zwar möchte ich mit dem Atmega8 in C eine Interrupt Routine 
schreiben. Ich nutze dazu WINAVR.

Frage:

1) Wie kann ich meinem C Code mitteilen, dass der Überlauf stattgefunden 
hat ? Ich glaube ja mit ner Interrupt Routine, aber wie wird sie 
aufgerufen ?

2) Wie muss mein Programm aussehen, welche Header Dateien brauche ich ?

3)Muss ich noch einen Prototypen definieren ?


void main (void)

{

...


TIMSK |= _BV(TOIE1); //aktivieren des Überlaufinterrupts von Timer1

TCCR1B = _BV(CS12) | _BV(CS10); //Prescaler definieren(aus Datenblatt: 
101 cs12,cs11,cs10) = 1024 Prescaler

TCNT1 = 55771; //Zählregister vorladen für 10sek.

sei (); //Interrupts global zulassen.

}

// so hier soll jetzt eine Interrupt Routine stehen, diese Lösung habe 
ich hier aus dem Forum...
heißt das jetzt, wenn meine 10 sek. abgelaufen sind, wird dieses 
Programm aufgerufen ???????
was sollte ich an meinem Code ändern ?
danke für die Hilfe

interrupt [TIM0_OVF] void timer0_int(void) //
    {
    // hier dein Code
    }

Gast #525925
Lesenswert?
• ▲
▼
ok...habs mal versucht...sagt mir bitte ob das so richtig ist...

1) sind die header Dateien vollständig dafür ?
2) Ist das define richtig ? mit dem vector 9 ?
3) würde das programm so laufen ?

//-------------------------------------------------------------

#define TIMER1_OVF_vect                 _VECTOR(9) //siehe Datenblatt 
S.44
#define SIG_OVERFLOW1                   _VECTOR(9)

// Timer Interrupt Routine (ISR) , wird ausgeführt, wenn der Timer 
überläuft !!?????

ISR(TIMER1_OVF_vect) /* veraltet: SIGNAL(SIG_OVERFLOW0) */
{
    /* Interrupt Code */
}

#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/iom8.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 1000000UL     /* Quarz mit 1 Mhz  */
#endif
#include <util/delay.h>

int main (void)
{
...
TIMSK |= _BV(TOIE1);
TCCR1B = _BV(CS12) | _BV(CS10);
TCNT1 = 55771; //Zählregister vorladen für 10sek.
sei (); //Interrupts global zulassen

}
Gast #525932
Lesenswert?
• ▲
▼
Wenn der AVRTyp im Makefile angegeben wird brauchst Du nur die io.h 
einbinden. Dadurch, das du die interrupt.h einbindest brauchst du den 
vector nicht selber setzten. sollte eigentlich auch ne warnung geben, 
oder?
#526061
Lesenswert?
• ▲
▼
1) Lade den Code ins AVR Studio und simuliere ihn.
   Tip: Prescaler auf kleinere Werte als 1024 setzen.
   Sonst wartest du dir einen Ast ab.

2) Lade den Code in den Prozessor und probiere ihn aus.

Da du Neuling bist empfehle ich dir, dich mit
Variante 1) auseinander zu setzen. Du Simulation im
AVR-Studio ist dein Freund und du wirst noch viele
Stunden mit dem Debugger im AVR-Studio verbringen. Also
fang besser gleich damit an, dich mit ihm zu beschäftigen.

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