Forum: Mikrocontroller und Digitale Elektronik Tastererkennung ATTINY48


von TM F. (p_richner)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


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.

von Karl H. (kbuchegg)


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

: Bearbeitet durch User
von Lehrer (Gast)


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.

von TM F. (p_richner)


Lesenswert?

Karl H. schrieb:
> Entprellung

Die Entprellung funktioniert und ist auf etwa 20ms eingestellt.

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?

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
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.