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
dann ist die Tilde die Negation, und deswegen gehen die LEDs an und aus? Dann vergesst meine Postings,sorry. Gruß Quark
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 }
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.