Forum: Mikrocontroller und Digitale Elektronik PinChange-Problem!


von Ghost F. (Firma: Student) (ghost1979)


Angehängte Dateien:

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

von spess53 (Gast)


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

von Peter D. (peda)


Lesenswert?

Es erhöht die Lesechancen drastisch, wenn man Dateien mit den originären 
Endungen postet, also *.asm, *.inc, *.c, *.h usw.

von Ghost F. (Firma: Student) (ghost1979)


Lesenswert?

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

oder?
Und wenn ich PCINT24 und PCINT25 aktivieren will dann eben:

ldi r17, 0b00000011
sts PCMSK3, r17

Ich danke Dir!!!

von Cyblord -. (cyblord)


Lesenswert?

Ghost Face schrieb:
> Ich habe mir nun das Datenblatt zur Hand genommen

Na dann lies doch mal schnell den Absatz zum PCMSK und allgemein zum Pin 
Change Interrupt. Dann sollte schnell klar sein, warum man dort Bits 
setzen sollte wenn man den PCI nutzt.

gruß cyblord

von spess53 (Gast)


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

von Ghost F. (Firma: Student) (ghost1979)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Ich benutze immer
>Binärzahlen, deswegen stand ich da ja ein wenig auf dem Schlauch.

Das solltest du dir abgewöhnen.

MfG Spess

von Cyblord -. (cyblord)


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

von Ghost F. (Firma: Student) (ghost1979)


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.

von spess53 (Gast)


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

von Ghost F. (Firma: Student) (ghost1979)


Lesenswert?

Oh das ist ein guter Tip!
Danke Dir Spess. Freut mich!

von Ghost F. (Firma: Student) (ghost1979)


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.

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.