www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik interrupt


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Quark (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wo werden die LEDs denn ausgeschaltet?
Grüße
Quark

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Mega128 steht in meiner Kristallkugel sofort "M103 Fuse"


Peter

Autor: Quark (Gast)
Datum:

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

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 }

Autor: Bri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.