Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem Interrupt


von Frank J. (jaeko01)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
von Frank J. (jaeko01)


Lesenswert?

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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

von Frank J. (jaeko01)


Lesenswert?

Hallo Mattihas,
trotzdem DANKE für deine Antworten.
Gruß Frank

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.