was passiert denn wenn das programm läuft?
Hallo Leute,
folgendes Programm macht mir Probleme.
Ich habe gerade mit den Interrupts angefangen.
Hier das Programm:
Ich habe vor die Status-LED mit den Interrupts zu togglen.Code:.include "m8def.inc" .def temp = r16 .def temp2 = r17 .org 0x000 rjmp main ; Reset Handler .org INT0addr rjmp int0_handler ; IRQ0 Handler .org INT1addr rjmp int1_handler ; IRQ1 Handler main: ; hier beginnt das Hauptprogramm ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp2, 0x00 ldi temp, 0x00 out DDRD, temp ldi temp, 0xFF out DDRB, temp ldi temp, 0b00001010 ; INT0 und INT1 konfigurieren out MCUCR, temp ldi temp, 0b11000000 ; INT0 und INT1 aktivieren out GICR, temp sei ; Interrupts allgemein aktivieren loop: rjmp loop ; eine leere Endlosschleife int0_handler: sbi PORTB, 0 reti int1_handler: sbrs temp2, 0 rcall f_led_on sbrc temp2, 0 rcall f_led_off reti f_led_on: sbi PORTB, 0 ldi temp2, 0xFF ret f_led_off: cbi PORTB, 0 ldi temp2, 0x00 ret
Was habe ich falsch gemacht?
was passiert denn wenn das programm läuft?
Hast Du vielleicht prellende Taster?
Oder woher kommt der IRQ?
Gruß
Hallo H3llGhost,
läuft das Programm im Asuro?
Wenn ja, frage ich mich wofür du den int0-Handler hast. Wenn hier ein 'Input' kommt, dann schaltest du ja die Status-LED (Grün-Seite) immer aus.
Auch habe ich Probleme mit der Initialisierung vom DDRB-Register.
Im Asuro werden mit:
DDRB = IRTX | LEFT_DIR | PWM | GREEN_LED;
die Pin's 0, 1, 2, 3, 4 und 5 als Output konfiguriert. Du machst alle 8 Pin's mit "ldi temp, 0xFF" und "out DDRB, temp"" zum Output.
Funktioniert dann noch der Quarz?
Die von Gock vermuteten prellenden Taster, müsste man testen können. Einfach häufig einen Taster drücken. Per Zufall sollten beide LED-Zustände dann sichtbar werden.
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
ich denke die quarz-pins werden ignoriert wenn der externe quarz durch fuses eingestellt ist.
Habe nun folgenden Code:
Der funktioniert auch!Code:.include "m8def.inc" .def temp = r16 .org 0x000 rjmp main ; Reset Handler .org INT0addr rjmp int0_handler ; IRQ0 Handler .org INT1addr rjmp int1_handler ; IRQ1 Handler main: ; hier beginnt das Hauptprogramm ldi temp, LOW(RAMEND) out SPL, temp ldi temp, HIGH(RAMEND) out SPH, temp ldi temp, 0x00 out DDRD, temp ldi temp, 0xFF out DDRB, temp ldi temp, 0b00001010 ; INT0 und INT1 konfigurieren out MCUCR, temp ldi temp, 0b11000000 ; INT0 und INT1 aktivieren out GICR, temp sei ; Interrupts allgemein aktivieren loop: rjmp loop ; eine leere Endlosschleife int0_handler: sbi PORTB, 0 reti int1_handler: sbis PORTB, 0 rjmp f_led_on rjmp f_led_off f_led_on: sbi PORTB, 0 reti f_led_off: cbi PORTB, 0 reti
Nun eine Frage am Rande, warum kann ich keinen rcall im int1_handler genutzen?
Und was bringt der int0_handler?
Hallo H3llGhost,
sag einmal, liest du eigendlich die Post's, die auf deine Fragen geschrieben werden?
Eigendlich hatte ich DICH gefragt, wofür DU den int0_handle eingebaut hast.
Außerdem wäre es ganz nett, wenn du Hilfe suchst, dass du dann auch mal die Fragen beantwortest, die dir gestellt werden, um DIR zu helfen.
@damaltor
Ich bin mir nicht sicher was die Pin's für den Quarz angeht.
Ich glaube, hier im Forum mal eine Erweiterung, oder die Idee dazu, gesehen zu haben, dass der Quarz ausgelötet wird, und die beiden Pin's dann auf eigenen Erweiterungen genutzt werden sollen. Da liegt doch SPI, wenn ich mich jetzt ohne Handbuch erinnern sollte? Das wäre ja sehr interessant.
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
wenn der quarz rausgenommen wird, muss in den fusebits "interner takt" eingestellt werden, sonst macht der prozessor ohnehin gar nichts. und dann sind die pins frei verfügbar und können genutzt werden.
die pins haben folgende funktionen:
PB6, XTAL1, TOSC1
PB7, XTAL2, TOSC2
also kein spi =)
die sache ist, sowie der quarz in den fuses eingestellt ist, aber keiner angeschlossen ist, macht der prozessor ohnehin gar nichts. und wenn der quarz nicht eingestellt wurde, sind die pins frei und dürfen verwendet werden. man lönnte dann entweder mit dem internen tgaktgenrator arbeiten (beide pins sind dann frei), mit einem externen taktsignal (ein ne555 reicht aus, dann wird nur ein pin am prozessor verbraten). wenn irgendwo in derf schaltung schon ein taktsignal vorliegt, kann dieses angezapft werden. oder man arbeitet mit einem R-C-Glied, das ist allerdings recht ungenau (genau wie der interne oszillator der auch bloss aus R und C besteht. diese kombination braucht auch nur einen pin am prozessor.
Oh ...Zitat von Sternthaler
tut mir Leid, dass habe ich überlesen ...
Ich weiß es selber nicht warum der int0_handle benutzt wird.
Ich habe den Code von hier Klick.
Und da ich den Sinn nicht verstanden hatte, fragte ich nach ...
Aber ich bin ja anscheinend nicht die einzige Person ...
Hallo H3llGhost,
alles klar.
In dem Beispiel auf der von dir angegeben Seite werden tatsächlich beide Interrupts benutzt. Die gehen ja nicht davon aus, dass der Code unbedingt im Asuro spielen soll.
Dort wird Int-0 zum EIN-schalten von Pin 0 an Port B, und Int-1 zum AUS-schalten vom Pin 0 an Port B benutzt.
Du kannst somit den Int-0-Interrupt bei dir ohne Probleme löschen, da du ja über Int-1 deine Status-LED (Grün) EIN- und AUS-schaltest.
Warum aber rcall nicht gehen sollte, kann ich nicht sagen. Ich finde jedenfalls keine Einschränkung dazu.
@damaltor
Na die Sache mit der Initialisierung scheint ja wirklich keine Auswirkungen zu haben.
Wenn also nun das Programm mit den rjmp-Befehlen funktioniert, taktet da ja wohl auch irgendetwas in der CPU rum.
Hast du wohl Recht.
Gruß Sternthaler
Lieber Asuro programieren als arbeiten gehen.
Lesezeichen