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
mach es so Eingabetasten kommen net an interrupt sondern werdn alle ms abgefragt (gepollt) gugg mal hier Beitrag "Tasten entprellen - Bulletproof" mfg phil
Einen Interrupt mit Tasten zu belegen ist schlimmer als die Taste vllt. alle 10ms abzufragen. Den Interrupt wirst du anders wo noch brauchen ^^
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.