Hallo Forum, ich benutze das Arduino Mega 2560 und habe ein Verständnisproblem. Es geht um Interrupts. Im Pinmapping steht zB. PE4(OC3B/INT4) oder PB7(OC0A/OC1C/PCINT7). Ist das dann richtig, dass ich diese Pins zur Interruptsteurung nutzen kann. Ist es auch richtig, dass wenn man die fallende Flanke des Pins zur Interruptsteuerung nutzt, der Interrupt nur einmal ausgeführt wird, auch wenn der Pin länger auf 0 bleibt. Das Do ... Hauptprogramm ... LOOP läuft ja immer weiter. Falls es so ist, habe ich es doch verstanden. Gruß Frank
Frank Jakob schrieb: > Ist es auch richtig, dass > wenn man die fallende Flanke des Pins zur Interruptsteuerung nutzt, Ja - flankengetriggerte Interrupts werden nur bei der Flanke ausgeführt. Wenn der Pin weiter auf dem Pegel bleibt, führt das nicht zur einer erneuten Ausführung. Ein levelgetriggerter Interrupt hingegen würde sofort wieder ausgeführt, wenn der Level am Ende des Interrupts immer noch auf 'Zünd' Level steht. Frank Jakob schrieb: > Im Pinmapping steht zB. PE4(OC3B/INT4) Int4 ist ein normaler externer Interrupt und kann nach Freigabe des entsprechenden Bits im IE Register und des globen Interrupt Flags benutzt werden > oder PB7(OC0A/OC1C/PCINT7). Hier gibst du im PCMSK0 Register den entsprechenden Pin (7) frei für Interrupts und benutzt den Vektor für die erste Gruppe Pin Change Interrupts. Denke dran, das sich PCINT0 bis PCINT7 also einen Vektor teilen.
:
Bearbeitet durch User
Hallo Matthias, Danke für die schnelle Antwort. Die von mir genannten Pins waren ein Beispiel. Es gibt ja noch mehrere Pins auf dem Board. Vektor heisst dann fallende oder steigende Flanke richtig ?. Wenn Ja verstanden. Wozu ich das Ganze nutzen möchte ist folgendes. Ich möchte die Wurfzahlen und gefallene Kegel auf unserere Kegelanlage auswerten. Hier mal mein bis jetzt programmierter Code: ' -------------------------------------- ' Uart with Fifo Example (internal) ' -------------------------------------- ' System Settings ' -------------------------------------- const F_CPU = 16000000 avr.device = atmega2560 avr.clock = F_CPU avr.stack = 32 'Uart-Konfiguration uart0.baud = 9600 'Baudrate (ggf. erhöhen um buffer-overflow zu provozieren) uart0.recv.enable 'Senden aktivieren uart0.send.enable 'Empfangen aktivieren 'Fifo initialisieren uart0.recv.fifo = 8 '8 Bytes für Empfangsbuffer uart0.send.fifo = 8 '8 Bytes für Sendebuffer dim ab1,ab2,ab3,ab4,ab5 as Byte 'Variabelen Bahnwahl dim sps as Byte 'Variabele Spiel Start dim wab1,wab2,wab3,wab4,wab5,b as Byte'Variabelen Probe, und Gesamtwurfzahl dim b1s,b2s,b3s,b4s,b5s as Integer 'Variabelen für Start Portabfrage dim hz1,hz2,hz3,hz4,hz5 as Integer 'Variabelen für Holzzahl senden #define B1ESU as Portf.0 'Bahn1 Endschalter Kegel unten Pin 0 #define B1LS as Portf.1 'Bahn1 Lichtschranke Pin 1 #define B1VH as Portf.2 'Bahn1 Vorderholz Pin 2 #define B1VDR as Portf.3 'Bahn1 Vorderdame rechts Pin 3 #define B1VDL as portf.4 'Bahn1 Vorderdame links Pin 4 #define B1BR as portf.5 'Bahn1 Bauerrechts Pin 5 #define B1BL as portf.6 'Bahn1 Bauerlinks Pin 6 #define B1HDR as portf.7 'Bahn1 Hinterdame rechts Pin 7 #define B1HDL as portk.0 'Bahn1 Hinterdame linke Pin 8 #define B1HH as portk.1 'Bahn1 Hinterholz Pin 9 #define B1K as portk.2 'Bahn1 König Pin 10 Das Ganze noch für Bahn 2 bis 5 B1ESU.mode = input B1LS.mode = input 'müsste ich dann als anderen Port/Pin nehmen B1VH.mode = input B1VDR.mode = input B1VDL.mode = input B1BR.mode = input B1BL.mode = input B1HDR.mode = input B1HDL.mode = input B1HH.mode = input B1K.mode = input Das Ganze noch für Bahn 2 bis 5 avr.interrupts.enable 'Keine Ausgabe ohne aktivierte Interrupts möglich print 12;"uart fifo example" print print "Sehr schnell tippen oder Text einkopieren zur" print "Anzeige eines Fifo-Overrun (Zeichenverlust) = LED1 EIN." print do if b1ls=0 and b1esu=1 then 'Probewürfe zählen 20 je Bahn wab1=wab1+1 end if if b2ls=0 and b2esu=1 then wab2=wab2+1 end if if b3ls=0 and b3esu=1 then wab3=wab3+1 end if if b4ls=0 and b4esu=1 then wab4=wab4+1 end if if b5ls=0 and b5esu=1 then wab5=wab5+1 end if loop until wab1+wab2+wab3+wab4+wab5=80 '80 Probewürfe erreicht dann Spiel Start wab1 = 0 'Wurfzahlen auf 0 setzen wab2 = 0 wab3 = 0 wab4 = 0 wab5 = 0 do if b1esu = 1 and b1ls = 0 then 'Bahn1 Endschalter unten 1, Lichtschranke kurz auf 0 b1s=1 'Portabfrage setzen wab1=wab1+1 'Wurfnummer end if Das Ganze noch für Bahn 2 bis 5 if b1s = 1 and wab1 < 15 then 'Bahn1 Port abfragen Volle hz1=b1vh+b1vdr+b1vdl+b1br+b1bl+b1hdr+b1hdl+b1hh+b1k 'Bahn1 Portstatus addieren end if if b1s = 1 and wab1 > 15 and wab1 < 30 then 'Bahn1 Port abfragen räumen hz1=vh1+vdr1+vdl1+br1+bl1+hdr1+hdl1+hh1+k1 'Bahn1 Portstatus addieren Hier fehlt noch der Code end if if b1esu = 0 and b1s = 1 then 'Bahn1 Portaddition senden uart0.WriteByte 1 'Bahn uart0.WriteByte wab1 'Wurfnummer uart0.WriteByte hz1 'Holzzahl b1s = 0 'Bahn1 Portabfrage zurücksetzen end if loop Ich habe das auch schon getestet, geht soweit ganz gut. Die Bahnnummer und die Holzzahl wird richtig übertragen. Nur die Holzzahl geht ab wie Schmitz Katze. Also nicht 1 dann 2 usw. Das liegt wohl an der Geschwindigkeit des uC. Ich möchte die Programmschleife auch nicht mit WAIT anhalten, da es vorkommen kann das dann ein Wurf untergehen kann. Deshalb überlege ich das mit Interrupts zu steuern. Der Programmcode ist mit LUNAAVR geschrieben, teile davon sind aus den Beispielsprogramm von LUNA. Will mich ja nicht mit fremden Federn schmücken. Wäre schön wenn Du oder einer aus dem Forum mir Tips geben kann. Gruß Frank
Frank Jakob schrieb: > Vektor heisst > dann fallende oder steigende Flanke richtig ? Nein, Vektor meint in diesem Fall die Sprungadresse, die der AVR anhüpft, wenn ein Interrupt ausgelöst wird. Das ist eine Tabelle ganz am Anfang des Programmflash (siehe Datenblatt). Da ich von Luna (wenn sichs nicht um den Himmelskörper handelt) aber absolut null Ahnung habe, bin ich mit deinem Programm völlig überfragt - 'Bahnhof' wäre noch zu viel gesagt.
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.