Forum: Compiler & IDEs Mehrere externe Interrupts C für ATMega16?


von Roland D. (duro)


Lesenswert?

Hallo Zusammen,

da ich nach stundenlanger Suche auch hier auf der Seite nichts gefunden 
habe, habe ich eine Frage an die Profis. Ich habe einen ATMega16, den 
ich per C Code programmiere. Ich möchte gerne über mehrere Tasten 
Interrupts auslösen und habe bisher keine für mich verständliche 
Erklärung gefunden, wie ich das anstellen kann. Ich möchte z.B. über 
eine Taste eine bestimmte Funktion ausführen und über eine andere Taste 
eine andere Funktion aufrufen.
Kann mir hierbei jemand von Euch helfen, da mir nach der Suche einfach 
nur noch der Kopf schwirrt.... Vielleicht sehe ich den Wald ja vor 
lauter Bäumen nicht.


Gruß Roland

von kosmonaut pirx (Gast)


Lesenswert?

hallo,
entsprechend deiner überschrift vermute ich einfach mal so, dass du 
mehrere externe interrupts benutzen willst. dazu musst du für jeden eine 
eigene ISR schreiben.

hier steht wie:

http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

hth, gute nacht,
bye kosmo

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

kosmonaut pirx wrote:

> entsprechend deiner überschrift vermute ich einfach mal so, dass du
> mehrere externe interrupts benutzen willst.

Aber nur bis zu dem Zeitpunkt, da er merkt, dass man mechanische
Tasten sowieso entprellen muss und daher einen Timerinterrupt
stattdessen benötigt...

von Roland D. (duro)


Lesenswert?

Jörg Wunsch wrote:
> Aber nur bis zu dem Zeitpunkt, da er merkt, dass man mechanische
> Tasten sowieso entprellen muss und daher einen Timerinterrupt
> stattdessen benötigt...

Hallo Jörg,

ich dachte die Entprellung der Taste erfolgt dann in der Funktion, die 
die Taste aufruft. Ok, eswar spät gestern Abend und den meinen 
Logikfehler habe ich inzwischer eingesehen.
Kannst Du mir vielleicht zu Deinem Lösungsvorschlag (mehrere 
Timerinterrupts) ein wenig weiterhelfen? Da ich eher C-lastig bin, ist 
die Programmierung des ATMEGA16 manchmal ein wenig verwirrend für 
mich....

Besten Dank & Gruß
Roland

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Es sind nicht mehrere Timerinterrupts, sondern ein ,,tick''-Timer,
der z. B. alle 10 ms aufgerufen wird.  Den braucht man in einer
hinreichend komplexen Applikation ohnehin, um alle von der Zeit
abhängenden ,,Standardaufgaben'' auszuführen, und der pollt dann
gleich die Tasten mit.  Wenn eine Taste 2- oder 3mal als gedrückt
erkannt worden ist, wird es dann dem Hauptprogramm gemeldet.

Implementierungen dafür dürftest du einige in den einschlägigen
Codesammlungen finden.

Externer Interrupt (oder pin change interrupt, aber den hat der
ATmega16 nicht) hat bei mechanischen Tasten nur Sinn, um damit dem
Prozessor aus dem sleep zu ziehen.  Danach schaltet man den aber
auch wieder ab.

von Oliver (Gast)


Lesenswert?

Ich vermute mal, dein eigentliches Problem lautet:

Wie frage ich mehrere Tasten ab?

Und das hat mit externen Interrupts so gut wie gar nichts zu tun.

So gehts:
Beitrag "Tasten entprellen - Bulletproof"

Oliver

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.