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?
Gibt es eigentlich so wie "Anonyme Alkoholiker" auch ein Zusammenschluss der Anonymen Prozessoren?
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.
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
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
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.
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
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?
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.
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.
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?
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
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.
Tinte schrieb: > Wie oft brauchst du es? Einmal reicht wohl, und einer der mir die Gurken von den Augen nimmt.
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
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 😀.
Ich habe das mal durchgespielt und war mit 100ms Intervallen auch gar nicht zufrieden. 20ms wäre mein Maximum.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.