PinChange-Problem!

OP (Firma: Student) #3403148
Lesenswert?

Hallo liebe Mikrocontrollergemeinde!

Ich bin gerade an einem kleinen Projekt beschäftigt, in dem es quasi 
darum geht, ein Einganssignal mit einem Atmega zu kopieren. Das heisst, 
so lange das Signal anliegt, leuchtet eine RGB-Led-Leiste. Diese wird 
mit 3 Transistoren angesteuert. Als Controller verwende ich den 
Atmega644. Ich habe mir nun das Datenblatt zur Hand genommen und mich 
zusätzlich im Internet schlau gemacht, wie das nun mit den 
PinchangeInterrupts funktioniert. Desweiteren habe ich mir erst einmal 
eine kleine Testschaltung gebaut mit 2 Tastern ( einer an PORTD,0= 
PCINT24 und einer an PORTD,1=PCINT25).Ich habe dann ein Programm 
geschrieben, dass erstmal nur den einen Taster (PCINT24) verwendet und 
entsprechend den Ausgang steuert. Das bedeutet, so lange ich den Taster 
drücke, leuchten die Leds. Dies hat soweit funktioniert. Das Programm 
heisst Taster1.
Das Programm macht also folgendes: Wenn ein PinchangeInterrupt auftritt, 
wird in der ISR der Eingang des Port D eingelesen und jenachdem das Bit 
des Eingangspins 1 oder 0 ist werden entweder die Transistoren ein- bzw. 
ausgeschaltet. Alles ganz gut soweit und funtkitoniert auch.
So nun wollte ich das ganze um einen zweiten Taster erweitern. Nur 
keider bekomme ich das nicht hin. Um die Hardware zu testen habe ich den 
zweiten Taster mal statt des ersten drangehängt und das funktioniert 
auch.
Nun möchte ich beide Pins für die Pinchangeinterrupts aktivieren.
Klappt das mit den Befehlen hier?
ldi r17, (1<<PCINT24) | (1<<PCINT25)
sts PCMSK3, r17
Ich versuche Schritt für Schritt meinen Fehler einzukreisen.
Nur noch zum kurzen Verständnis, kann mir jemand bitte diese beiden 
Befehlszeilen genau erklären.:
ldi r17, (1<<PCINT24)
sts PCMSK3, r17
Ich habe dies aus einem Beispiel übernommen. Ich glaube da liegt noch 
das letzte Verständnisproblem.
Vielen Dank für Eure Hilfe
Angehängte Dateien:
Gast #3403166
Lesenswert?

Hi

>Nur noch zum kurzen Verständnis, kann mir jemand bitte diese beiden
>Befehlszeilen genau erklären.:

>ldi r17, (1<<PCINT24)

In deiner m644def.inc steht

.equ  PCINT24  = 0  ; Pin Change Enable Mask 24

also bedeutetet das ldi r17, (1<<0). Eine 1 0x nach links geschoben 
ergibt binär 0b00000001. Also

  ldi r17,0b00000001

>sts PCMSK3, r17

Das Register PCMSK3 wird mit 0b00000001 (in r17) geladen.

MfG Spess
Gast #3403192
Lesenswert?

Hi

>Ach ja das ist ein Shift-Left! Dann kann ich aber auch direkt schreiben
>:
>ldi r17, 0b00000001
>sts PCMSK3, r17

Kannst du. Aber mit der anderen Schreibweise weißt du auch in einem Jahr 
noch ohne Datenblatt, was der Befehl machen soll.

MfG Spess
OP (Firma: Student) #3403193
Lesenswert?

Das habe ich gelesen, es liegt ja an der Ausführung der Informationen.
Ich brauche manchmal ein kleines Beispiel zur Orientierung.
Das ich im PCICR das Bit  PCIE3 setzen muss um Port D als 
Pinchangeeingänge zu nutzen und das ich im PCMSK3 die Bits für die PINS 
D0-7 sprich PCINT24 - PCINT 31 setzen muss, weiß ich ja.
Das mit dem Shift war ja das VerständnisProblem. Ich benutze immer 
Binärzahlen, deswegen stand ich da ja ein wenig auf dem Schlauch.
#3403197
Lesenswert?

Naja nun, dann beschränkt sich das Problem auf das Setzen einzelner Bits 
und hat mit dem ganzen Interrupt Geraffel absolut nichts zu tun. Aber 
kann man ja mal zur allgemeinen Verwirrung einstreuen.

Die Schreibweise (1<<X) ist wohl allerunterste Grundlage sowohl in 
Assembler als auch in C.

gruß cyblord
OP (Firma: Student) #3403230
Lesenswert?

Ich entschuldige mich dafür dass es wohl etwas verwirrend war, in welche 
Richtung das Thema geht. Da ich nicht genau wusste worin das Problem 
lag, habe ich es nicht genau eiinkreisen können. Ich werde mir natürlich 
die Shiftoperation nochmal genau anschauen.
Aber das Problem lag ja genau darin 2 Bits zu setzen. Und das geht doch 
mit den Binärzahlen in meinen Augen einfacher. Wenn es zu einem guten 
Programmierstil gehört dies mit der Shiftoperation zu machen, lasse ich 
mich ja auch gerne eines Besseren belehren. Ich stehe ja erst am Anfang 
des µC-Programmierens. Ich kenne ja noch nicht alle Befehle.
Ebenso ging es mir darum erst einmal das grundlegende Problem zu finden. 
Es ist ja auch möglich, das jetzt bei der weiteren Umsetzung noch 
Probleme auftreten, die sich meiner Meinung ja nur um das Thema 
PinChange drehen.
Gast #3403235
Lesenswert?

Hi

>Ich stehe ja erst am Anfang
>des µC-Programmierens. Ich kenne ja noch nicht alle Befehle.

Dann sieh dir mal in der Studio-Hilfe zum Assembler

Users Guide->Expressions

und

Users Guide->Assembler directives

an.

MfG Spess
OP (Firma: Student) #3404247
Lesenswert?

Hallo,

nur als kleine Rückmeldung, ich habe das Programm fertigstellen können 
und es funktioniert einwandfrei. Beide Taster lösen einen 
PinchangeInterrupt aus, die ISR unterscheidet welcher Taster 
gedrückt/losgelassen wurde und handelt dementsprechend.
Danke nochmal Spess, dass Du mich mit der Nase auf den ShiftLeft 
gestossen hast. Ich habe erst einmal noch die Binärvariante verwendet, 
da ich mir den Shift-Befehl noch nicht genauer anschauen konnte, um dann 
mehrere Pins gleichzeitig zu aktivieren. Aber das kommt dann ganz zum 
Schluss wenn ich das Programm Stück für Stück erweitert habe und alles 
funktioniert.

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