Timer0 Interrupt

OP #3442959
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
Gast #3442997
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".
#3443012
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.

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