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.
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.