Hallo, wie erzeugt man mit dem genannten Controller einen Interruptbefehl in C? Ich würde gerne zwei Interruptroutinen erzeugen, wenn sich an einem Eingang des Port 1 ein Pegel ändert (-> Taster angeschlossen) und wenn der Timer0 überläuft. Habe leider noch nichts diskretes über die Interruptroutinen gefunden, wie der Syntax aussieht etc und aus dem Datenblatt werde ich über die Register auch nicht schlau, wäre also über alle Tipps sehr dankbar!:) Müsste das ungefähr so aussehen? (für Timer0): void Timer0 (void) interrupt 1 { } MfG Herbert
Herbert Hanser schrieb: > Ich würde gerne zwei Interruptroutinen erzeugen, wenn sich an einem > Eingang des Port 1 ein Pegel ändert (-> Taster angeschlossen) und wenn > der Timer0 überläuft. Dann kannst du im Timer-Interrupt auch den Pinpegel abfragen. Oder Interrupts priorisieren, und beim Tastendruck ein Flag setzen. Es gibt da viele Möglichkeiten. Aber eine Tastenentprellung geschieht normalerweise über den Timerinterrupt mit zyklischer Pinabfrage und Softwarefilterung. Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte, und die Prellung egal ist, dafür reicht der externe Interrupt mit Flankentriggerung.
Häsch Define schrieb: > Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte, > und die Prellung egal ist, dafür reicht der externe Interrupt mit > Flankentriggerung. Das Problem ist, dass 8 Taster angeschlossen werden. Ziel im Programm wäre es, bei einem der Tastendrücke die ISR zu starten, zu überprüfen, welcher Taster betätigt wurde und dann die entsprechende Funktion zu starten, um den Tastendruck umzusetzen. So ähnlich wäre das bei einem weiteren Interrupt, dieser soll bei einer internen Signaländerung gestartet werden.
Herbert Hanser schrieb: > Häsch Define schrieb: >> Wenn man aber nur gelegentlich mal einen Tastendruck erkennen möchte, >> und die Prellung egal ist, dafür reicht der externe Interrupt mit >> Flankentriggerung. > > Das Problem ist, dass 8 Taster angeschlossen werden. > > Ziel im Programm wäre es, bei einem der Tastendrücke die ISR zu starten, > zu überprüfen, welcher Taster betätigt wurde und dann die entsprechende > Funktion zu starten, um den Tastendruck umzusetzen. > > So ähnlich wäre das bei einem weiteren Interrupt, dieser soll bei einer > internen Signaländerung gestartet werden. Such mal hier im Forum nach Tastenentprellung. Mir schwebt da noch was von Peter Dannegger im Kopf, wo es auch ein Beispiel in der Codesammlung geben soll. Vernünftige Einlesung von Mehrfachtaten geht nur über einen Timer mit zyklischer Einlesung der Tastenzustände und dann Entprellung.
Häsch Define schrieb: > Such mal hier im Forum nach Tastenentprellung. Mir schwebt da noch was > von Peter Dannegger im Kopf, wo es auch ein Beispiel in der Codesammlung > geben soll. > > Vernünftige Einlesung von Mehrfachtaten geht nur über einen Timer mit > zyklischer Einlesung der Tastenzustände und dann Entprellung. Okay, ich verstehe was du meinst und ich denke ich kann das umsetzen. Vielen Dank! Nach wie vor verstehe ich nur noch nicht ganz, wie der Funktionskopf der Interruptroutine dann aussehen muss .... Das ganze wäre dann ja auch theoretisch im main-Programm realisierbar; innerhalb einer while-Schleife, amirite?
Herbert Hanser schrieb: > Nach wie vor verstehe ich nur noch nicht ganz, wie der Funktionskopf der > Interruptroutine dann aussehen muss .... Das hängt vom Compiler ab. Die obige syntax ist für den Keil C51 o.k. Herbert Hanser schrieb: > Das ganze wäre dann ja auch theoretisch im main-Programm realisierbar; > innerhalb einer while-Schleife, amirite? Nur hast Du da keinerlei definiertes Zeitintervall. Hat das Main nichts zu tun, sind es nur wenige µs, ist es beschäftigt sinds vielleicht mehrere s und der Tastendruck geht verloren. Ein konstanter Timerinterrupt (z.B. 10ms) ist erheblich besser.
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.