Tastererkennung ATTINY48

OP #4315130
Lesenswert?
• ▲
▼
Hallo zusammen

Ich habe folgende Ausgangslage:
- Einen Attiny48 mit 4 Tastern an PORTD
- Zwei sind low-active, zwei sind high-active
- Per Interrupt in der Software muss erkannt werden, welcher Taster 
gedrückt wurde

Das Problem:
Ich habe nur ein Interruptflag für den ganzen Port. Ich habe keine 
nennenswerte Lösung, wie ich erkennen kann, welcher Taster gedrückt 
wurde. Da es Interruptgesteuert ist, brauche ich eine zeit-kurze Lösung.

Zugleich wird eine Tasterentprellung per Software mit einem Timer 
gemacht.
1
// PORTD interrupt routine; any switch were pressed
2
ISR(PCINT2_vect)
3
{
4
   // start debouncing
5
}
6

7
// debouncing timer interrupt routine
8
ISR(TIMER0_COMPA_vect)
9
{
10
  // ... do something
11
}


MfG und danke für Lösungsvorschläge
(Firma: matzetronics) #4315137
Lesenswert?
• ▲
▼
Tu die einen Gefallen und lies mal den Entprellungsartikel:
https://www.mikrocontroller.net/articles/Entprellung

Diese Verfahren liest periodisch die Eingangsports und vergleicht den 
jetzigen Zustand mit dem vorigen. Wenn das ein paarmal einen Unterschied 
gibt, wird eine Taste als gedrückt erkannt.
Das bei dir einige Tasten low- und andere high-aktiv sind, ist zwar 
doof, aber in der Software leicht anzupassen.
Du brauchst also gar keinen PCINT, sondern lediglich einen Timer mit 
ISR.
#4315139
Lesenswert?
• ▲
▼
TM F. schrieb:

> Das Problem:
> Ich habe nur ein Interruptflag für den ganzen Port. Ich habe keine
> nennenswerte Lösung, wie ich erkennen kann, welcher Taster gedrückt
> wurde. Da es Interruptgesteuert ist, brauche ich eine zeit-kurze Lösung.

* Du weisst am Anfang, dass keiner der Taster gedrückt ist.
* Nur weil du an einem Pin einen Interrupt hast, bedeutet das nicht, 
dass du den Pin nicht ganz normal abfragen kannst
* Wenn du also im Interrupt nachsiehst welcher Portpin sich verändert 
hat, kannst du rausfinden, welcher Taster gedrückt wurde

> Zugleich wird eine Tasterentprellung per Software mit einem Timer
> gemacht.

Entprellung
Gast #4315143
Lesenswert?
• ▲
▼
Das mit dem Interrupt steht aber sicherlich in der Aufgabenstellung.

also einfach das Interuptflag nehmen und in der Interuptroutiene 
auswerten, welcher der 4 Taster betätigt wurde.

Sicherlich keine Praxisgerechte Lösung.
#4315149
Lesenswert?
• ▲
▼
TM F. schrieb:
> Karl H. schrieb:
>> Nur weil du an einem Pin einen Interrupt hast, bedeutet das nicht,
>> dass du den Pin nicht ganz normal abfragen kannst
>
> Dann mit einer globalen Variablen einen Taster-spezifischen Wert setzen,
> wenn einer gedrückt wurde?

Angenommen du kriegst jedesmal, wenn der Schalter im Badezimmer betätigt 
wird eine Mitteilgung. Jedesmal siehst du nach, ob das Licht jetzt 
brennt oder nicht.
Bei welchem Zustand des Lichtes ist der Schalter offensichtlich 'ein' 
geschaltet worden und bei welchem ist er 'aus' geschaltet worden?

Und ja.
Deine einzige Möglichkeit um aus einer ISR Informationen hinein oder 
haraus zu schmuggeln, sind globale Variablen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.