Forum: Mikrocontroller und Digitale Elektronik PCINT0 für Taster und LEDs am selben Port betreiben


von 1 Punkt für Grifindor (Gast)


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?

von Mike (Gast)


Lesenswert?

Gibt es eigentlich so wie "Anonyme Alkoholiker" auch ein Zusammenschluss 
der Anonymen Prozessoren?

von Peter D. (peda)


Lesenswert?

Entweder Du nennst uns den konkreten Chip oder Du mußt selber ins 
Datenblatt schauen.

1 Punkt für Grifindor schrieb:
> Oder sollte ich
> auf PCINT0 verzichten und die 3 Taster in einer Schleife im Code
> abfragen?

Wenn Du die Tasten noch entprellen mußt, ist ein Timerinterrupt 
sinnvoller.

von Carsten-Peter C. (carsten-p)


Lesenswert?

Hallo, wenn es ein AVR ist, suche im Datenblatt nach PCMSK.
Mit dem Register kannst legst Du fest, welcher Pin einen INT auslösen 
soll.
Gruß Carsten

von 1 Punkt für Grifindor (Gast)


Lesenswert?

Genau es handelt sich um einen Atmega644.

Carsten-Peter C. schrieb:
> Hallo, wenn es ein AVR ist, suche im Datenblatt nach PCMSK.
> Mit dem Register kannst legst Du fest, welcher Pin einen INT auslösen
> soll.
> Gruß Carsten

Danke ich werde mal im Datenblatt nachsehen

von Peter D. (peda)


Lesenswert?

Carsten-Peter C. schrieb:
> Hallo, wenn es ein AVR ist, suche im Datenblatt nach PCMSK.
> Mit dem Register kannst legst Du fest, welcher Pin einen INT auslösen
> soll.

Kann man so generell nicht sagen, z.B. der ATtiny26 hat kein PCMSK. Es 
hängt also immer vom konkreten Chip ab.

von Uwe K. (ukhl)


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.

: Bearbeitet durch User
von 1 Punkt für Grifindor (Gast)


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?

von Tinte (Gast)


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.

von Stefan F. (Gast)


Lesenswert?

1 Punkt für Grifindor schrieb:
> In einer Aufgabe stand ...

sage doch endlich um welchen Mikrocontroller es geht, damit wir dir aus 
dem richtigen Datenblatt vorlesen können.

von Tinte (Gast)


Lesenswert?

1 Punkt für Grifindor schrieb:
> Genau es handelt sich um einen Atmega644.

Stefan ⛄ F. schrieb:
> sage doch endlich um welchen Mikrocontroller es geht, damit wir dir aus
> dem richtigen Datenblatt vorlesen können.

Wie oft brauchst du es?

von Uwe K. (ukhl)


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.

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

1 Punkt für Grifindor schrieb:
> Eignet sich der PCINT0 also nicht so gut
> um auf einen Tasterdruck zu reagieren?

Nun, der sagt nur, daß sich was geändert hat, aber nicht was und in 
welche Richtung. Du sparst also nichts ein, gegenüber einer Auswertung 
in der Mainloop.

von Helge S. (topflappen)


Lesenswert?

https://www.youtube.com/watch?v=wIcC8-g9Lnw

... wenn Du Englisch kannst ...

von Stefan F. (Gast)


Lesenswert?

Tinte schrieb:
> Wie oft brauchst du es?

Einmal reicht wohl, und einer der mir die Gurken von den Augen nimmt.

von Carsten-Peter C. (carsten-p)


Lesenswert?

Hallo, ich möchte kurz auf eine Möglichkeit hinweisen, mit der man 
schnell eine Flanke in der ISR "filtern" kann. Das lässt sich natürlich 
leicht erweitern.

  sbic PINB, 2  ;bzw. sbis PINB, 2
  reti

  push AL
  in AL,SREG
  push AL
;tu was
  pop  AL
  out  SREG,AL
  pop  AL
  reti

Gruß Carsten

von HildeK (Gast)


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 😀.

von Stefan F. (Gast)


Lesenswert?

Ich habe das mal durchgespielt und war mit 100ms Intervallen auch gar 
nicht zufrieden. 20ms wäre mein Maximum.

von Uwe K. (ukhl)


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.

von HildeK (Gast)


Angehängte Dateien:

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.

von Peter D. (peda)


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.

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.