Forum: Mikrocontroller und Digitale Elektronik interrupt


von chris (Gast)


Lesenswert?

hallo,
ich arbeite mit einem ATMega128.
ich bin anfänger und wollte mich jetzt mal mit Interrupt
beschäftigen.Dazu hab ich dieses Programm geschrieben :

   2 #include <avr/io.h>
    3 #include <avr/signal.h>
    4 #include <avr/interrupt.h>
    5
    6
    7 INTERRUPT(SIG_OVERFLOW0)            // bei überlauf von Timer 0
    8 {
    9   int i;
   10   int j;
   11   outp(~4,PORTB);  //   LED 3 an
   12 }
   13
   14
   15
   16 int main( void )
   17 {
   18   int i,j;
   19
   20   outp(255,DDRB);       // Alle Pins von Port B sollen Ausgänge
sein: LED
   21
   22   // Timer0
   23   TCCR0=5;              // Timer0 aktiv mit Frequenz CPU/1024
   24   TIMSK=1;              // Timer0 Overflow - Interrupt enable
   25   sei();                // Interrups enable
   26
   27  while(1)
   28   {
   29    if(TCNT0 <= 64 )
   30     {
   31        outp(~1,PORTB);   //  LED 1 an
   32     }
   33    else
   34     {
   35      outp(~2,PORTB);           // LED 2 an
   36     }
   37   }
   38
   39 }


ich benutze das STK500 ( und STK501)
das Programm soll nur led 1 dann led2 leuchten lassen, dann kommt ja
ein SIG_Overflow0 und meine INTERRUPT( ) wird auch durchlaufen, dh es
brennt LED3 .... aber nachdem mein Interrupt fertig ist müsste doch der
normale Programmcode weiterlaufen, dh wieder LED1 dann LED 2 leuchten
..dann wieder INTERRUPT()...
Leider bleibt mein Programm in der Interrupt Routiene stehen.
Also ich sehe einmal LED1 dann LED2 dann LED3 .. das bleibt dann aber
an ....
kann mir jemadn sagen worans liegt ??
  Chris

von Quark (Gast)


Lesenswert?

wo werden die LEDs denn ausgeschaltet?
Grüße
Quark

von Peter Dannegger (Gast)


Lesenswert?

Bei Mega128 steht in meiner Kristallkugel sofort "M103 Fuse"


Peter

von Quark (Gast)


Lesenswert?

dann ist die Tilde die Negation, und deswegen gehen die LEDs an und aus?
Dann vergesst meine Postings,sorry.
Gruß
Quark

von Bri (Gast)


Lesenswert?

Die LED's werden nicht wieder ausgeschaltet. Ich glaub das was du
willst sieht so aus:

char led_state = 4;

INTERRUPT(SIG_OVERFLOW0)            // bei überlauf von Timer 0
    8 {
    9   int i;
   10   int j;
   11   outp(led_state,PORTB);  //   LED 3 an/aus
   12   led_state ^= 0xFF;
   13 }

von Bri (Gast)


Lesenswert?

Vergiss was ich oben geschrieben hab. Du musst das anders machen. So wie
du die LED schaltest, beeinflusst du immer die anderen beiden LEDs mit.
Zum LED anschalten solltest du das hier machen:

PORTB |= 4; // für LED 3

und ausschalten tut man eine LED damit:

PORTB &= ~4; // für LED 3

(Vorrausgesetzt, die LED's sind gegen Masse geschaltet. Sonst genau
andersrum.)

Du musst also darauf achten, dass du immer nur ein Bit veränderst und
nicht alle Bits bei dem Port gleichzeitig setzt.

von chris (Gast)


Lesenswert?

also ich hab mir das so gedacht das zuerst led1 dann led2 dann led3
leuchten ( die anderen LED 's sind immer aus )
und dann wieder von vorne .... led1,led2,led3 ....
sobald ich das prog auf meinem mc geladen habe sehe ich einmal led1,
dann led2 leuchten und dann leuchtet nur noch led3 ... obwohl das dann
wieder ausgehen und led1 an gehen müsste ......
also mit kommts nur so vor als ob nachdem mein interrupt gelaufen ist
auch mein programm beendet wird, oder zumindest mal nach der while()
schleife fortgesetzt wird .. ?
 chris

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.