PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Warum geht das Programm nicht? ...



H3llGhost
28.11.2007, 08: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, 15:30
was passiert denn wenn das programm läuft?

Gock
28.11.2007, 16:49
Hast Du vielleicht prellende Taster?
Oder woher kommt der IRQ?
Gruß

Sternthaler
28.11.2007, 23: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, 00:50
ich denke die quarz-pins werden ignoriert wenn der externe quarz durch fuses eingestellt ist.

H3llGhost
29.11.2007, 09: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, 19: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, 20: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, 20: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, 22: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, 19: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, 02: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, 12: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 =)