Forum: Mikrocontroller und Digitale Elektronik Timer0 Interrupt


von Alex K. (rie)


Lesenswert?

Hey Leute,
ich versuche mich gerade in die Programmierung von Microcontrollern 
einzuarbeiten. Zur Zeit versuche ich einen Interrupt zu Programmieren 
(in C). Naja irgendwie will es nicht wie ich will, ich zeig euch einfach 
mal meine Zeilen:


  #include <avr/io.h>
  #include <avr/interrupt.h>
  #define F_CPU 1000000UL
  #include <util/delay.h>


int main(void)
{

  DDRB=0xff;
  TIMSK|=(1<<TOIE0);
  TCNT0=0x00;
  sei();

    while(1)
    {

    }

}
ISR(TIMER0_OVF_vect)
  {
  PORTB=0x01;
  reti();
  }


Naja das Programm soll einfach dazu dienen, damit ich sehe dass die ISR 
überhaupt aufgerufen wird.

Ich hoffe ihr könnt mir sagen wo der Fehler ist.

Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit 
I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio 
6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es 
einen Zusammenhang.

Danke im Voraus

von Stefan E. (sternst)


Lesenswert?

Alex K. schrieb:
> Ich hoffe ihr könnt mir sagen wo der Fehler ist.

Das reti() hat dort nichts verloren, und sorgt für einen Absturz 
(respektive Neustart) des Programms.

Edit:
Aber so weit kommt dein Programm ja erst gar nicht, da der Timer ja nie 
gestartet wird.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Alex K. schrieb:

>   DDRB=0xff;
>   TIMSK|=(1<<TOIE0);
>   TCNT0=0x00;

Diese Initialisierung ist unvollständig. Weder sagst du dem Timer, was 
er überhaupt machen soll, noch legst du fest, wie schnell er es machen 
soll und, last but not least, du startest den Timer noch nicht einmal...

Lies' das verdammte Datenblatt und das Tutorial zur Timerprogrammierung, 
damit du wenigstens den Hauch einer Andeutung einer Ahnung davon 
bekommst, was du da eigentlich tust.


> ISR(TIMER0_OVF_vect)
>   {
>   PORTB=0x01;
>   reti();

Das ist Blödsinn. Der C-Compiler fügt das reti schon ganz von alleine 
ein, wenn du eine ISR implementierst. Genau dafür steht das Macro ISR() 
ja (unter anderem).

> Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit
> I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio
> 6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es
> einen Zusammenhang.

Zum einen muß du das nicht so machen, das sei() genügt völlig. Zum 
anderen: Das Bit für das globaleInterruptflag heißt "SREG_I", nicht "I".

von Thomas E. (thomase)


Lesenswert?

Alex K. schrieb:
> int main(void)
> {
>
>   DDRB=0xff;
>   TIMSK|=(1<<TOIE0);
>   TCNT0=0x00;
>   sei();
>
>     while(1)
>     {
>
>     }
>
> }
> ISR(TIMER0_OVF_vect)
>   {
>   PORTB=0x01;
>   reti();
>   }
>
>
> Naja das Programm soll einfach dazu dienen, damit ich sehe dass die ISR
> überhaupt aufgerufen wird.
>
> Ich hoffe ihr könnt mir sagen wo der Fehler ist.

Der Timer läuft nicht. Guck dir im Datenblatt in der Beschreibung des 
TCCR0B-Registers die CS00 - CS02 Bits an.

> Achja vielleicht eine Frage neben bei, ich habe versucht im SREG das Bit
> I direkt zu setzen, sprich SREG|=(1<<I), aber der Compiler (Atmel Studio
> 6.1) kennt sowohl das I als auch das SREG nicht. Dachte vllt hat es
> einen Zusammenhang.

Vergiss das. Davon hast du nie was gehört, gelesen oder gesehen. Genauso 
wie das reti(); in der ISR. Um beides kümmert sich der Compiler.

mfg.

von Alex K. (rie)


Lesenswert?

Danke Leute jetzt läufts

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.