Forum: Mikrocontroller und Digitale Elektronik LCD Test funktioniert nur in C, nicht in ASM!


von Maximilian W. (milka2009)


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...

von Stefan Frings (Gast)


Lesenswert?

Versuche es nochmal mit dem originalen Quelltext. Es schadet der 
Funktion nicht, wenn Deine Delays durch die niedrigere Taktfrequenz 4x 
länger dauern, als notwendig.

von Stefan Frings (Gast)


Lesenswert?

Schau Dir mal die Sprungziele der brne Befehle an. In der zweiten 
Verzögerungs-Routine sprigst Du die falschen Ziele an (nämlich die der 
ersten Routine).

von Maximilian W. (milka2009)


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...!

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
Noch kein Account? Hier anmelden.