Forum: Mikrocontroller und Digitale Elektronik Interrupt Routine schreiben (Timer 1 , 16 bit)


von klaus (Gast)


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
    }


von MCP (Gast)


Lesenswert?


von klaus (Gast)


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

}

von Uwe .. (uwegw)


Lesenswert?

1
#define TIMER1_OVF_vect                 _VECTOR(9) //siehe Datenblatt
2
S.44
3
#define SIG_OVERFLOW1                   _VECTOR(9)
brauchst du nicht. Darum kümmert sich die iom8.h.

Und die iom8-h musst du auch nicht manuell includen. Darum kümmert sich 
die io.h.

von Werner (Gast)


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?

von klaus (Gast)


Lesenswert?

ok..danke für eure antworten...

ja tatsächlich gabe es eine warnung....

habe die define´s gelöscht....

kann ich den code denn so verwenden ?
ist er so richtig ?

vielen dank

von Karl H. (kbuchegg)


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.

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.