Forum: Mikrocontroller und Digitale Elektronik Interrupt - Erklärung für Anfänger


von remo (Gast)


Lesenswert?

hallo
ich bin noch anfänger in der Welt der PIC
unsere Schaltung - ein erstes kleines Projekt das wir selber anpacken 
mussten - soll einen Start, einen Reset und vier Cursortasten (am Analog 
input) besitzen.
Da ich nicht alle millisekunde überprüfen will, ob ein Taster gedrückt 
ist, macht man das ja logischerweise mit Interrupt.
Unser Pic(16f819) besitzt soweit ich weiss am RB0 einen interrupt pin 
und dann noch mehrere interrupt-on-change pins
was ist mit diesen interrupt-on-change pins? kann ich die gleich 
gebrauchen wie RB0? ich brauch ja zwei interrupt inputs (start+reset)

danke für eure hilfe

von phil (Gast)


Lesenswert?

mach es so

Eingabetasten kommen net an interrupt sondern werdn alle ms abgefragt 
(gepollt)

gugg mal hier

Beitrag "Tasten entprellen - Bulletproof"

mfg phil

von jÜrgen (Gast)


Lesenswert?

Einen Interrupt mit Tasten zu belegen ist schlimmer als die Taste vllt. 
alle 10ms abzufragen. Den Interrupt wirst du anders wo noch brauchen ^^

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Lange Geschichte...

Ich habe schon beides realisiert.
Per Interrupt:

Ich würde den Interrupt on Change nutzen.
Sobald ein Int auftritt... Port B auslesen (damit wird das IF gelöscht) 
und einen Timer straten. Dieser Timer lößt nach 50ms einen Int aus, bei 
dem man dann nachsieht, welche Taste immer noch gedrückt ist. Damit 
entprellt man die Geschichte.
Wird eine Taste losgelassen, wird dieser Int auch ausgelöst.

Taste in RAM speichern und in einem Bit die Information setzen, daß eine 
Taste gedrückt wurde. Im Hauptprogramm wartet man auf das Bit, wertet 
die Taste aus und löscht das Bit.

Probleme, die es zu beachten gibt:
Ganz kurze Drücker... Wird halt entprellt.
Mehrere Tasten gleichzeitig... da muß eine Auswahl getroffen werden.

von johnny.m (Gast)


Lesenswert?

> Da ich nicht alle millisekunde überprüfen will, ob ein Taster gedrückt
> ist,...
Und was spricht dagegen? Du musst es ja nicht selber machen, und der 
Controller wird dafür bezahlt, dass er es macht;-) Bei den üblichen 
Verarbeitungsgeschwindigkeiten ist es für den µC (ob das jetzt ein AVR, 
ein PIC oder sonstwas ist) praktisch keine Belastung, alle 10-20 ms 
(öfter macht keinen Sinn) abzufragen, welche der angeschlossenen Taster 
gedrückt sind. Dafür einen Hardware-Interrupt zu verwenden ist aus zwei 
Gründen unsinnig:
1. Externe Interrupts sind i.d.R. kostbares Gut, auch wenn es µCs gibt, 
die ganze Ports über sog. Pin Change Interrupts (oder "Interrupt on 
Change") abfragen können.
2. Einen Timer braucht man für die Entprellung sowieso (außer man macht 
die mit Warteschleifen, was aber noch unsinniger für den Programmfluss 
ist), also kann man den auch direkt durchlaufen lassen und eben alle 
paar zig ms die Taster einlesen. Als Dreingabe hat man noch ein genau 
vorhersagbares Verhalten, weil man genau weiß, wann der Timer-Interrupt 
auftritt und keine Probleme mit der Bearbeitung anderer Sachen bekommt, 
die sonst durch die asynchron auftretenden Ereignisse unterbrochen 
werden könnten.

Außerdem braucht man nach meiner Erfahrung eh in fast jeder Anwendung 
irgendeinen Basistakt für bestimmte Abläufe. Und den kann man dann 
zusätzlich für eine Tasterabfrage nutzen. Wenn man z.B. für irgendwas 
einen Millisekunden-Takt hat, kann man in dem entsprechenden 
Timer-Interrupt eine Zählvariable hochzählen und z.B. beim Zählerstand 
von 20 die Taster einlesen. Wenn man den Zustand der Taster dann mit 
demjenigen von der letzten Abfrage vergleicht, erkennt man sofort, wo 
sich etwas geändert hat. Für den Vergleich bietet sich eine 
Exklusiv-ODER-Verknüpfung an.

Die eigentlich einzige sinnvolle Anwendung für Taster an externen 
Interrupts ist das Aufwecken aus einem Stromsparmodus (zumindest bei 
AVRs, weiß nicht, wie das bei den PICs geht).

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.