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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.