Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum geht das Programm nicht? ...
H3llGhost
28.11.2007, 09:20
Hallo Leute,
folgendes Programm macht mir Probleme.
Ich habe gerade mit den Interrupts angefangen.
Hier das Programm:
.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
Ich habe vor die Status-LED mit den Interrupts zu togglen.
Was habe ich falsch gemacht?
damaltor
28.11.2007, 16:30
was passiert denn wenn das programm läuft?
Hast Du vielleicht prellende Taster?
Oder woher kommt der IRQ?
Gruß
Sternthaler
29.11.2007, 00:37
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
damaltor
29.11.2007, 01:50
ich denke die quarz-pins werden ignoriert wenn der externe quarz durch fuses eingestellt ist.
H3llGhost
29.11.2007, 10:36
Habe nun folgenden 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
Der funktioniert auch!
Nun eine Frage am Rande, warum kann ich keinen rcall im int1_handler genutzen?
Und was bringt der int0_handler?
Sternthaler
29.11.2007, 20:26
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
damaltor
29.11.2007, 21:16
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.
H3llGhost
29.11.2007, 21:59
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.
[...]
Oh ...
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 (http://www.mikrocontroller.net/articles/AVR-Tutorial:_Interrupts).
Und da ich den Sinn nicht verstanden hatte, fragte ich nach ...
Aber ich bin ja anscheinend nicht die einzige Person ...
Sternthaler
29.11.2007, 23:27
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
damaltor
01.12.2007, 20:36
hrhr.. das wär ja auch geil, man initialisiert ein paar ports und der prozi bleibt stehn..=) mann wäre das ne fehlersuche... aber da haben die guten leute bei atmel schon mitgedacht.
versuche mal ein anderes testprogramm mit rjumps.
mal was ganz anderes.. ich meine mich zu erinnern, dass die frontled nicht an PD0 sodern an PD2 hängt... kann mal einer nachschaun? das wäre die einfachste lösung deines problems, aber ich bin gerade mal wieder mit dem pda online.
edit: hab grad gesehn, dass ich vor ewigkeiten mal adobe reader auf dem pda installiert habe... die frontled hängt an PORTD6!!!
edit2: vergiss meinen post. du bist ja bei der statusled. :(
Sternthaler
02.12.2007, 03:55
@damaltor
Ist doch ne ganz lustige Kiste :mrgreen: Zumindest wurde schon vor ca. 100 Jahren davor gewarnt, jedes Pogramm aus dem Netz einfach so zu starten. Es gab Bösewichte, die haben dir die Bildwiederholrate so umprogrammniert, dass dir der Monitor um die Ohren flog. So ein Mist geht heute nicht mehr, da die Monitore mittlerweile selber aufpassen.
Aber der Asuro? Ich glaube, dass ich da ein wenig forschen muß.
Tschaui Sternthaler
P.S.: Was benutzt du eigendlich als PDA? Mein in die Jahre gekommener Psion macht mittlerweile beim Akku Probleme, und ich suche Ersatz.
damaltor
02.12.2007, 13:49
ich habe einen acer n50 premium mit 520 mhz und 128 mb ram. mir war wichtig dass wlan und bluetooth integriert sind, und dass wowohl compactflash und sd-karten gelesen werden können (spiegelreflexkamera hat noch CF-karten, und sd sind billig XD) nicht zu verwechseln mit dem "normalen" acer n50, der nur etwa die hälfter der prozessorleistung hat.
allerdings hat auch der so siene macken, zB ist die (eigentlich wiederaufladbare) sicherungsbatterie leer, und wird nicht geladen. so ist es nicht möglich den akku zu wechseln. scheint ein bekanntes problem zu sein (google) aber acer hat mir trotzdem nur 30 euro für einen kostenvoranschlag angeboten. schade. ansonsten: schönes teil =)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.