Forum: Mikrocontroller und Digitale Elektronik ATMEGA168 Repeat Taste an Port PB1 und PB2


von Hubert B. (hubib)


Lesenswert?

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

von Gerd F. (gerd_f)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Gerd F. (gerd_f)


Lesenswert?

Wo soll denn dann das Problem sein?

von Hubert B. (hubib)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Hubert B. (hubib)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Hubert B. (hubib)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

1
TCCR0B = (1<<CS02)|(1<<CS00);      // divide by 1024


Peter

von Hubert B. (hubib)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.