LCD Test funktioniert nur in C, nicht in ASM!

OP #2710076
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...
Gast
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.
Gast
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).
OP
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.