LCD Test funktioniert nur in C, nicht in ASM!

OP #2710076
Lesenswert?

Hallo,

bin neu hier im Forum und habe auch neulich erst mit der 
AVR-Programmierung (in Assembler) angefangen.

Ich habe mich bis zum LCD-Tutorial 
(http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD) 
vorgearbeitet. Leider bekomme ich es nicht hin, dass "Test" auf dem LCD 
erscheint. Wenn ich mit der C-Version 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung) 
des Tutorials arbeite, dann funktioniert es sofort.
Dazu sei gesagt, dass ich den internen Oszillator von 1MHz benutze.
Deswegen musste ich die Delay5ms und Delay50us auf 1 MHz anpassen (sind 
eigentlich für 4MHz). Diese habe ich mithilfe des Programms "AVR delay 
loop generator" 
(http://www.home.unix-ag.org/tjabo/avr/AVRdelayloop.html) erzeugt und 
eingefügt. Ich habe dieses Programm benutzt, da ich nicht wirklich 
wusste, wie ich die vorgebenen Werte umrechnen kann.

Ich weiß nicht was ich falsch mache. Könnt ihr mir vielleicht helfen und 
evtl. Tipps geben?

µC: ATMega8A
Oszillator: 1MHz interner Oszillator
Software geschrieben mit: AtmelStudio 6 (erstelle auch die .hex-Datei 
hiermit)
Flashing-Software: PonyProg2000

veränderte Stelle in der lcd-routines.asm:
1
; Pause nach jeder Übertragung
2
delay50us:                              ; 50µs Pause (bei 1 MHz)
3
           ldi  temp1, $10
4
WGLOOP0:   dec  temp1
5
           brne WGLOOP0
6
       nop
7
       nop
8
           ret                          ; wieder zurück
9
 
10
 ; Längere Pause für manche Befehle
11
delay5ms:                               ; 5ms Pause (bei 1 MHz)
12
           ldi  temp1, $07
13
WGLOOP1:   ldi  temp2, $ED
14
WGLOOP2:   dec  temp2
15
           brne WGLOOP1
16
           dec  temp1
17
           brne WGLOOP0
18
       nop
19
       nop
20
           ret                          ; wieder zurück

Mit freundlichen Grüßen
Maximilian

PS: Es tut mir leid, falls bereits ein ähnliches Thema existiert. Ich 
konnte keine Lösung für mein Problem finden...
OP #2710189
Lesenswert?

Danke Stefan...
Die Delay-Funktion hat die Schwierigkeiten gemacht.
Musste jediglich:
1
 ; Längere Pause für manche Befehle
2
delay5ms:                               ; 5ms Pause (bei 1 MHz)
3
           ldi  temp1, $07
4
WGLOOP1:   ldi  temp2, $ED
5
WGLOOP2:   dec  temp2
6
           brne WGLOOP1
7
           dec  temp1
8
           brne WGLOOP0
9
       nop
10
       nop
11
           ret                          ; wieder zurück
in das hier ändern:
1
 ; Längere Pause für manche Befehle
2
delay5ms:                               ; 5ms Pause (bei 1 MHz)
3
           ldi  temp1, $07
4
WGLOOP1:   ldi  temp2, $ED
5
WGLOOP2:   dec  temp2
6
           brne WGLOOP2 ;<---- Das hier!
7
           dec  temp1
8
           brne WGLOOP1 ;<---- Und das hier!
9
       nop
10
       nop
11
           ret                          ; wieder zurück

Hatte aber auch n Brett vorm Kopf :)

Naja danke nochmal...!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren