Hallo AVR Freaks, ich habe da mal eine Frage an die Experten. Ich muß bei bei einem Atmega168 an den Port PB1 und PB2 jeweils einen Taster abfragen der als Repeat-Taste funktionieren soll. Jetzt habe ich schon versucht mit den Funktionen von Peter Dannegger die Tasten zubekommen, leider sind die PB1 u. PB2 PCINT1 und PCINT2 Interupteingänge und ich beommme die Tasten nur wenn ich die ISR(PCINT0_vect) Interruptroutine abfrage. Ich hätte aber gerne wenn die Tasten gedrückt sind, das sie eine Repeat-Funktion haben, damit ich zum Beispiel UP und Down Regelung machen kann,wie z.B. Lautstärkeregelung einer Fernbedienung. Hat jemand eine Idee oder Codebeispiel wie so etwas gehen kann. Hubert
Schalte doch einen normalen IO-Port mit dazu, dann kannst Du den Port mit einer while Schleife abfragen und solange der taster gedrückt ist eben Deine repeat Funktion ausführen.
Hi >leider sind die >PB1 u. PB2 PCINT1 und PCINT2 Interupteingänge und ich beommme die >Tasten nur wenn ich die ISR(PCINT0_vect) Interruptroutine abfrage. Blödsinn. Die kannst du auch normal abfragen. MfG Spess
Hallo, danke für die schnellen Antworten. Das Problem ist wenn ich die Ports über get_key_press( 1<<PB1 ) bzw. get_key_rpt( 1<<PB2 ) Abfrage bekomme ich die Tasten nicht. Ich muß natürlich sagen das alle Interupts aktviert sind, da ich mir die Tastenwerte über die RS232 auf Hyperterminal anzeigen lasse. Ich habe aber schon versucht die PCINT1 und PCINT2 aus zu maskieren das nützt allerdings nichts. Es funktioniert nur über die ISR(). Vielleicht hat jemand ein Beispiel ? Hubert
Hubert B. schrieb: > Ich muß natürlich sagen das alle Interupts > aktviert sind, Was soll das für einen Sinn haben? Hast Du denn auch alle 25 Interrupthandler aufgesetzt? So ein Programm habe ich noch nie gesehen, halte ich auch nicht für lauffähig. Da kriegt das Main einfach keine Zeit mehr ab. Oder ein Handler fehlt und Du resettest ständig. Peter
Hubert B. schrieb: > Ich muß natürlich sagen das alle Interupts > > aktviert sind, da ich mir die Tastenwerte über die RS232 auf > > Hyperterminal anzeigen lasse. Ich glaube, du bist da völlig auf dem Holzweg. Wahrscheinlich bist du dir nicht über die Funktion sei() im Klaren. Damit wird das Global Interrupt Bit gesetzt. Aber es werden nicht alle vorhandenen Interrupts freigeschaltet, sondern der Controller führt überhaupt erst irgendwelche Interrupts aus, wenn dieses Bit gesetzt ist. Und zwar die Interrupts, die du vorher in den entsprechenden Registern freigeschaltet hast. Und dann werden alle gleichzeitig freigegeben, damit nicht irgendeiner schon ausgeführt wird, bevor der Controller vollständig initialisiert ist. Das ist wie beim Rennen. Erst wenn alle ihren Startplatz eingenommen haben, erfolgt der Startschuss. PB1 und PB2 sind ganz normale Ports, die du mit PIN2 abfragst. Solange sie als Port geschaltet sind, besser gesagt bleiben. Denn nach dem Reset sind fast alle Pins als Porteingang geschaltet. Die Funktion des Pin Change Interrupts ist nur eine Zusatzfunktion, die bei einem Wechsel von High auf Low oder umgekehrt einen Interrupt auslöst. Das ändert aber nichts daran, dass das immer noch stinknormale Ports sind. mfg.
Hallo Peter, ich hänge am besten einfach mein Problem einmal an. Vieleicht kannst Du mir sagen warum das hier nicht funktioniert mit der Tastenabfrage und der Repeatfunktion ? Gruß Hubert
Hubert B. schrieb: > Vieleicht kannst Du > mir sagen warum das hier nicht funktioniert Puh, wo anfangen, Du hast massig Fehler drinne. Liest Du Programme auch mal Korrektur, bevor Du sie compilierst? Short auf eine Taste, long auf ne andere ist Mumpitz. Entweder short/long oder press/rpt auf eine Taste, wobei short/long immer zusammen benötigt werden. Warum hast Du die Timerinitialisierung rausgeschmissen? Dann kanns natürlich nicht gehen. Was soll der Mumpitz mit dem pin_change? Interrupts ohne Handler stürzen ab!!! Und die "_delay_ms(1000);" machen natürlich auch alles kaputt, raus damit. Peter
Hallo Peter, entschuldige bitte, ich habe das Programm kurz vor Feierabend in 5 Minuten noch einfach schnell zurück gebaut auf den ursprünglichen Code und habe dann anscheinend einige Sachen übersehen, zu dem ist das mein erstes Projekt mit dem Atmega168. Aber danke für Deine Tipps, aber leider Funktioniert immer noch nicht. Ich habe den Orginalcode von Deiner Webseite noch einmal genommen und habe es für den Atmega168 abgeändert. Wenn ich die Tasten betätige bekomme ich keine Response. Ich verwende AVR Studio kannst Du mir mal einen Tip geben wie man solche Programme auf dem Atmega am besten Debugged das man solche Fehler findet ? Ich sende Dir noch einmal den neuen Code zu, es wäre nett wenn Du mir Deinen korregierten Code einmal anhängst. Hubert
1 | TCCR0B = (1<<CS02)|(1<<CS00); // divide by 1024 |
Peter
Hallo Peter, toll, jetzt funzt ! Danke für Deine Hilfe. Vieleicht kannst Du auf deiner Webseite einmal einen Vermerk für den Atmega168 anbringen. Ich glaube viele haben das Problem einen Code von Atmega8 auf Atmega168 zu portieren. Besser wäre noch eine Seite wo man beschreibt was zu beachten ist bei der Portierung von Atmega8 zu Atmega88, Atmeg168. ... Serie. Da das mein erstes Projekt mit Atmega168 ist und in diesem Forum, bin ich natürlich ersteinmal in alle "Fettnäpfchen" hinein getreten. Also ersteinmal Danke an alle Experten. Hubert PS: Eins habe ich hier im Forum noch gelernt: "Schreiben ist Silber, nichts schreiben ist besser". Also bis bald.
Hi >Besser wäre noch eine Seite wo man beschreibt was zu beachten >ist bei der Portierung von Atmega8 zu Atmega88, Atmeg168. Gibt es bei ATMEL: http://www.atmel.com/dyn/resources/prod_documents/doc2553.pdf http://www.atmel.com/dyn/resources/prod_documents/doc2554.pdf MfG Spess
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.