PCINT0 für Taster und LEDs am selben Port betreiben

Gast #7096193
Lesenswert?

Hallo, Assembler Neuling hier.
Und zwar muss ich eine Aufgabe lösen wo die jeweiligen Pinbelegungen für 
Tasten und LEDs bereits vorgegeben sind. Für die Tasten Pin (0..2) und 
LEDs Pin (3..7), also befinden sich alle Komponenten am selben Port. 
Meine Frage lautet, lässt sich der Change Pin Interrupt so 
konfigurieren, dass dieser nur für Änderungen der 3 Pins aufgerufen wird 
(damit die ISR nicht in Konflikt mit den LEDs steht)? Oder sollte ich 
auf PCINT0 verzichten und die 3 Taster in einer Schleife im Code 
abfragen?
#7097996
Lesenswert?

Es ist sogar noch schlimmer:

- Ein ATtiny2313 hat den PIN CHANNGE INTERUPT nur für Port B.
- Ein ATtiny2313A hat ihn für alle PINS.

PCINT0 = Pin Change INTerrupt pin 0.

Das einfache Interrupt ist z.B. INT0 = external INTerrupt request 0. Der 
PIN ist hier fest vorgegeben.

Davon abgesehen, liest man Taster nie über einem Interrupt, da sie 
prellen.
Gast #7098529
Lesenswert?

Uwe K. schrieb:
> Es ist sogar noch schlimmer:
>
> - Ein ATtiny2313 hat den PIN CHANNGE INTERUPT nur für Port B.
> - Ein ATtiny2313A hat ihn für alle PINS.
>
> PCINT0 = Pin Change INTerrupt pin 0.
>
> Das einfache Interrupt ist z.B. INT0 = external INTerrupt request 0. Der
> PIN ist hier fest vorgegeben.
>
> Davon abgesehen, liest man Taster nie über einem Interrupt, da sie
> prellen.

In einer Aufgabe stand wir sollen für 2 Taster über ein PCINT0 Interrupt 
prüfen ob einer von denen gedrückt wurde und dann für jeden Taster den 
jeweiligen Flag im SRAM setzen. Eignet sich der PCINT0 also nicht so gut 
um auf einen Tasterdruck zu reagieren? Was wäre dann die alternative?
Gast #7098553
Lesenswert?

1 Punkt für Grifindor schrieb:
> Uwe K. schrieb:
>> Davon abgesehen, liest man Taster nie über einem Interrupt, da sie
>> prellen.

An der Aussage ist was dran aber viel zu pauschal. Es gibt immer 
Ausnahmen.

> In einer Aufgabe stand wir sollen für 2 Taster über ein PCINT0 Interrupt
> prüfen ob einer von denen gedrückt wurde und dann für jeden Taster den
> jeweiligen Flag im SRAM setzen. Eignet sich der PCINT0 also nicht so gut
> um auf einen Tasterdruck zu reagieren? Was wäre dann die alternative?

Wenn die Aufgabe das fordert, könnte man das auch so realisieren. Wenn 
für beide Tasten der PCINT0 am ATMega644 gefordert ist, müssen beide 
Tasten am PORTA angeschlossen werden. Da jeder Pin des PORTA den PCINT0 
triggern kann, muß in der ISR überprüft werden, welcher Pin (also welche 
Taste) der Auslöser war und dementsprechend das Flag gesetzt werden.

Da keine anderen Bedingungen genannt sind, kann man das Prellen der 
Taster wohl erst mal vernachlässigen.
#7098738
Lesenswert?

1 Punkt für Grifindor schrieb:

> In einer Aufgabe stand wir sollen für 2 Taster über ein PCINT0 Interrupt
> prüfen ob einer von denen gedrückt wurde und dann für jeden Taster den
> jeweiligen Flag im SRAM setzen. Eignet sich der PCINT0 also nicht so gut
> um auf einen Tasterdruck zu reagieren? Was wäre dann die alternative?

Es ist nicht zu empfehlen, einen Taster per Interrupt abzufragen. Aber 
möglich ist es. Besser ist es einen Timer zu verwenden. Der darf die 
Taster nicht schneller Abfragen, als die maximal zu erwartende 
Prellzeit. 100ms ist sehr sicher und schnell genug für die Abfrage eines 
Tasters.

Wenn dein Prof das so möchte, damit ihr den Interrupt kennen lernt, dann 
ist die Antwort:

Beitrag "Re: PCINT0 für Taster und LEDs am selben Port betreiben"

Mit dem Register PCMSK steuert man, welcher PIN einen Interrupt auslöst.

P.S.: Keine Regel ohne Ausnahme. §1: Benutze deinen gesunden 
Menschenverstand.

Ach ja, Du sagtest "Für die Tasten Pin (0..2)". Das sind drei Taster, 
nicht zwei. Ist aber für die Lösung egal.
Gast #7099435
Lesenswert?

Uwe K. schrieb:
> 100ms ist sehr sicher und schnell genug für die Abfrage eines
> Tasters.

Also du bist das, der die diversen Tastensteuerungen an Aufzügen, 
Kaffeemaschinen u.ä. programmiert! 😀
Nach 100ms habe ich den längst wieder los gelassen und nichts hat sich 
getan - unbrauchbar und lästig!

100ms mag zwar sicher sein für eine Entprellung, ist aber untauglich für 
eine Tastenabfrage - es ist problemlos möglich, für weniger als 50ms zu 
drücken und dann tut sich nichts.

Meine Erfahrung: ein einigermaßen ordentlicher Taster hat nach wenigen 
ms sein Prellen beendet. Wenn man schon den Code von PeDa nicht 
verwenden will: man kann auch mit einem 1ms-Timer und Schieberegister 
entprellen: wenn acht Mal aufeinanderfolgend der selbe Wert eingelesen 
wurde, dann steht die Variable auf 0xFF oder 0x00 und der Tastendruck 
ist sicher erkannt, selbst wenn er im Lauf seines Lebens schlechter wird 
und länger prellen sollte.
Bei einem sehr guten Taster hast du nach <10ms das Ergebnis und so 
schnell lässt den niemand wieder los.
Übrigens: PeDas Code funktioniert im Prinzip auch so, nur dass er 
mehrere Taster mit nur vier (?) Bit auf Gleichheit prüft, auch sonst 
noch ein paar Features eingebaut hat und das sehr elegant programmiert 
hat. Nur auf Anhieb schwerer verständlich 😀.
#7099820
Lesenswert?

HildeK schrieb:
> Uwe K. schrieb:
>> 100ms ist sehr sicher und schnell genug für die Abfrage eines
>> Tasters.
>
> Also du bist das, der die diversen Tastensteuerungen an Aufzügen,
> Kaffeemaschinen u.ä. programmiert! 😀

Erwischt.

100ms ist schon recht viel. Weniger ist sicher besser. Aber ich habe es 
auch schon bei dem einen oder anderen Gerät erlebt.

Beim Fahrstuhl ist es gar nicht so falsch, eine längere Verzögerung zu 
haben, um Fehlbedienung zu vermeiden. So ist es auch bei der 
Kaffeemaschine. Bei meiner FritzBox muss man auch etwas länger Drücken.

Beim Taschenrechner geht 100ms gar nicht.

Es kommt auch auf die Anwendung an. Und den Aufwand den man Treiben 
möchte. 100ms (10ms sollten auch gehen) ist einfacher umzusetzen als das 
mit einem Schieberegister. Die Qualität des Tasters spielt auch eine 
Rolle. Die Methode mit Schieberegister oder PeDa "high tricky code" ist 
schon das Beste was man machen kann, besonders bei „knirschenden“ 
Tastern.

... Aber der Professor möchte einen Interrupt für Lernzwecke.
Gast #7099936
Lesenswert?

Uwe K. schrieb:
> Beim Fahrstuhl ist es gar nicht so falsch, eine längere Verzögerung zu
> haben, um Fehlbedienung zu vermeiden. So ist es auch bei der
> Kaffeemaschine.

Genau da bin ich anderer Ansicht. Was soll denn an einer Ruftaste beim 
Aufzug an Fehlbedienung möglich sein? Ich sehe zwar, dass die eingebaute 
Bestätigungs-LED im Taster kurz aufleuchtet, aber sie müsste an bleiben, 
auch wenn ich nur sehr kurz drücke. Und wenn ich zu blöd bin, die 
richtige zu drücken (nach oben bzw. unten), dann helfen die 100ms Delay 
auch nicht.
Bei der FritBox magst du recht haben. Deren Tasten bediene ich in Wochen 
nicht, da ist es mir egal. Aber notwendig wär's auch dort nicht.
Was der Programmierer vermutlich bezweckte, ist, dass eine Einstreuung 
in die Tastenleitung nicht zur Auslösung führt. Aber eine ordentliche 
Tastenentprellung macht das genau so gut. Imho hat der einfach zu wenig 
nachgedacht.

> Es kommt auch auf die Anwendung an.
Ja, sicher. Allgemein will ich aber eine (schnelle) Reaktion, wenn ich 
irgendwo drauf drücke (selbst beim Auto, wenn ich Gas gebe 😉).
> Und den Aufwand den man Treiben möchte.
Eine Entprellroutine ist kein Aufwand. Im Anhang mal die, die ich oben 
beschrieben habe; für zwei Tasten (erweiterbar), mit 2ms-Rate beim 
1ms-Timer (veränderbar; anpassen an die Qualität der Taster).
Funktional ist die sehr ähnlich zu PeDas Version, jedoch ohne Repeat und 
ohne Unterscheidung für kurzes oder langes Drücken. Sie dürfte 
verständlicher zu lesen sein; ist nur weniger optimal umgesetzt. 😀

Ideal wäre imho, wenn die Tastenbetätigung sofort reagieren würde, aber 
Prellen, das dann ein mehrfaches Ein/Aus bedeutet, unterdrückt wird. Das 
wäre mit einem Taster an einem Interruptpin zu machen. Dann sind aber 
Störeinstreungen schwerer abzufangen und deshalb wird man immer eine 
gewisse Verzögerung benötigen - oder muss die mit HW vorverarbeiten.

Beim TO ging es aber eher um das Erkennen, welche Taste von mehreren 
bedient wurde, wenn alle den selben Interrupt auslösen. Da stand das 
Entprellen gar nicht im Vordergrund.
Angehängte Dateien:
#7099995
Lesenswert?

HildeK schrieb:
> Das
> wäre mit einem Taster an einem Interruptpin zu machen. Dann sind aber
> Störeinstreungen schwerer abzufangen und deshalb wird man immer eine
> gewisse Verzögerung benötigen - oder muss die mit HW vorverarbeiten.

Bei unserem Firmenaufzug wird der Interrupt benutzt. Beide 
Richtungsanzeigen gehen an, wenn ich eine Taste nur berühre. Als Abhilfe 
fasse ich vorher die Fahrstuhltür an, zum Entladen.
Interrupts nehme ich daher nur zum Aufwachen, nicht für die Abfrage.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren