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
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
Es erhöht die Lesechancen drastisch, wenn man Dateien mit den originären Endungen postet, also *.asm, *.inc, *.c, *.h usw.
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!!!
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
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
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.
Hi >Ich benutze immer >Binärzahlen, deswegen stand ich da ja ein wenig auf dem Schlauch. Das solltest du dir abgewöhnen. MfG Spess
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.