Forum: Mikrocontroller und Digitale Elektronik Dezimale Umwandlung vor LCD Ausgabe


von Patricia (Gast)


Angehängte Dateien:

Lesenswert?

@ all,

Ich suche eine Rutine (Atmega8) für eine Umwandlung von hex in 2x 8
bits Register in einer dezimalen Zahlen für eine LCD Ausgabe.

Das Programm "patricia_lcd.asm" soll eine Spannung von 0 bis 5V
auslesen und am LCD ausgeben, ich kriege nur kommische Werte, und das
Problem liegt bei der Umwandlung vor der Ausgabe.

Danke im Voraus für Ihre Hilfe.

Patricia

von PatrickHH (Gast)


Lesenswert?

Hallo Patricia,

schau dir mal die Seite an:
http://www.avr-asm-tutorial.net/avr_de/rechnen/index.html

dort findest du Beispiele (in ASM), wie man mit dem AVR Rechnet. Ein
Beispiel für eine Umwandlung von einem ADC Wert für ein Display ist
auch dabei.

Gruß PatrickHH

von crazy horse (Gast)


Lesenswert?

hm, schon mal mit dem Simulator versucht?

von PatrickHH (Gast)


Lesenswert?

Ich habs bei mir Simuliert, um zu sehen was da vor sich geht, und dann
in mein Programm eingefügt. Klappt wunderbar.

von Patricia (Gast)


Lesenswert?

@llo PatrickHH

Kannst du Bitte mir zurück schicken, was du bei dir geändert hast?
was hast eigentlich als ergebnis an LCD bekommen?

Gruß.

von PatrickHH (Gast)


Lesenswert?

Kann morgen mal ein Beispiel posten.
Als Ausgabe habe ich den Spannungswert 0.000 bis 5.000 V im Display.

Gruß PatrickHH

von Patricia (Gast)


Lesenswert?

ok dann bis morgen

von gerd (Gast)


Lesenswert?

Hallo.

Habe nicht alles im Detail durchgegangen, aber einen gravierenden
Fehler gefunden: Du setzt zwar das ADC-Interrupt-Enable-Bit und das
Global-Int-Enable-Bit, hast aber gar keine Interrupt-Service-Routine
dafür. Stattdessen liest Du direkt den ADC, nachdem Du ihm die
Conversion befohlen hast. Das kann nur schief gehen, weil er noch gar
nicht fertig ist.
Stattdessen wird irgendwann, sehr viel später, der ADC-Interrupt
zuschlagen und Dein ganzes Programm von vorne starten. D.h., nicht ganz
von vorne, sondern nur ab da, wo die Int-Service-Routine des ADC stehen
müsste.

mfg
gerd

von ...HanneS... (Gast)


Lesenswert?

Ich beziehe mich auf das hier:
http://www.mikrocontroller.net/attachment.php/183626/patricia_Lcd.asm

Noch'n grober Fehler:

Das Programm beginnt mit Textkonstanten. Die stehen also da, wo
eigentlich die Reset- und Interrupt-Vektoren stehen sollten. Da das
Programm bei Adresse 0 gestartet wird (Reset-Vektor), versucht der AVR,
den Text "Uss= ",0 als Befehle abzuarbeiten. Das muss schief gehen!

Also: Texte (und andere Konstanten im Flash) gehören an das Ende.

An die erste Adresse kommt nunmal der Reset-Vektor (rjmp reset), danach
die Sprungtabelle für die Interrupt-Service-Routinen, und erst danach
"normaler Programmcode".

Den Rest habe ich auch nicht weiter analysiert, sieht mir arg nach
Copy&Paste aus.

...

von ...HanneS... (Gast)


Lesenswert?

Ich nochmal...

Hier siehst du, wie man ein einfaches Programm aufbauen kann. Es geht
dabei um das Grundgerüst, also Konstanten, Register usw. definieren,
Anordnung von Vektortabelle für Reset und Interrupt, Reset-Routine
(Initialisierung), Aufbau einer ISR (Interrupt-Servive-Routine), Aufbau
einer Mainloop,die per ISR über Flags gesteuert wird, usw:
http://www.mikrocontroller.net/attachment.php/183626/patricia_Lcd.asm

Und hier siehst du eine Sammlung von Ausgaberoutinen für das LCD. Hier
kannst du z.B. sehen, wie man einen Zahlenwert (deinen ADC-Wert für
Spannung) als ASCII-Ziffern an das LCD senden kann. Eine Routine zum
Skalieren deines ADC-Wertes ist zwar nicht dabei, aber die Ausgabe von
8- 16- und 24-Bit-Zahlen an ein LCD:
http://www.mikrocontroller.net/attachment.php/164028/LCDprint.inc

Den kompletten Thread, in dem es allerdings um ein 4x27-LCD mit 2
Controllern geht, findest du hier:
http://www.mikrocontroller.net/forum/read-1-164017.html#164017

Das aufmerksame Lesen dieses Threads dürfte einige deiner
Programmier-Probleme lösen.

...

von ...HanneS... (Gast)


Lesenswert?

Sorry, hier sind ein paar Links durcheinander geraten...

Programmgerüst ist im Anhang dieses Beitrags:
http://www.mikrocontroller.net/forum/read-1-164017.html#164207

LCD-Ausgabe ist im Anhang dieses Beitrags:
http://www.mikrocontroller.net/forum/read-1-164017.html#164028

Der gesamte Thread enthält auch diese beiden Beiträge, ist also ohne
weitere Links zu finden.

...

von PatrickHH (Gast)


Angehängte Dateien:

Lesenswert?

So, hab nochmal in meine Sammlung geschaut und dieses Testprogramm
gefunden. Es wird ein AD-Wert eingelesen und als Spannungswert am
Display ausgegeben. Habe das Programm vor einiger Zeit mal
zusammengestellt, um zu verstehen, wie so eine Umwandlung
funktioniert.

Gruß PatrickHH

von Patricia (Gast)


Lesenswert?

@llo PatrickHH
Mein Problem ist, dass ich keine UART auf meine Boart habe.meinst du
deine Quelle-code kann auch mit der Parallele-schnittstelle funtioniert

von ...HanneS... (Gast)


Lesenswert?

Bau doch das Programm so um, dass es das Ergebnis an das LCD sendet,
dann brauchst du keine serielle Schnittstelle.

...

von PatrickHH (Gast)


Lesenswert?

Mein Programm gibt es gleich auf das LCD aus. UART hatte ich zum
probieren mal dran gehabt, ist aber jetzt nicht mehr implementiert.
Kannst alles was den UART betrifft noch auskommentieren.

Gruß

von Bert (Gast)


Lesenswert?

dazu müsste man sich aber mit dem programm beschäftigen. man (frau?)
sucht aber vermutlich eine fertige lösung um die hausaufgaben nicht
selbst machen zu müssen.

von Patricia (Gast)


Lesenswert?

Danke PatrickHH !!!!

von Patricia (Gast)


Lesenswert?

he Bert

hast du nicht bessere zu tun?
sind wir hier im forum oder?????

von Patricia (Gast)


Lesenswert?

@llo
habe es geschaft aber möchte noch vor die spannung ausgabe am LCD an
der stelle 0x80 bis 0x85 "Uss= " schreiben aber wird von komische
dingue überschreiben. was ist da los?

mfg

von Thomas Forster (Gast)


Lesenswert?

Ohne deinen Code kann man das schlecht sagen...

von Patricia (Gast)


Angehängte Dateien:

Lesenswert?

@llo,

hier ist mein code.

will eigendlicht so was hier habe:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;       Uss= 0...5      V
;       0x80    0x85    0x86
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

wo man am poti den spanungswert varieren kann
bei mir geht nu bis 3,754 plus schwarze balken statt 5.000 volt

von Thomas Forster (Gast)


Lesenswert?

print:
  ldi     temp1,0x80   ; Set DDRAM Adress to 0x40
  rcall   lcd_command

  ldi ZL, LOW(text*2)     ; Adresse des Strings in den
        ldi ZH, HIGH(text*2)         ; Z-Pointer laden
print2:
        lpm                 ; Erstes Byte des Strings nach R0 lesen
        tst R0                     ; R0 auf 0 testen
        breq print_end             ; wenn 0, dann zu print_end
        mov r16, r0                ; Inhalt von R0 nach R16 kopieren
        rcall lcd_data             ; LCD-Sendefunktion aufrufen
        adiw ZH,ZL, 1          ; Adresse des Z-Pointers um 1 erhöhen
        rjmp print2              ; wieder zum Anfang springen

print_end:

: Ich habs nicht getestet!

von Andi (Gast)


Lesenswert?

Hier eine etwas optimiertere Version:

  ldi     temp1,0x80   ; Set DDRAM Adress to 0x40
  rcall   lcd_command

  ldi ZL, LOW(text*2)     ; Adresse des Strings in den
  ldi ZH, HIGH(text*2)         ; Z-Pointer laden
  rcall print
  .....                  ;Weiter im Programm

print:
        lpm r16,z+          ; Erstes Byte des Strings nach R0 lesen
        tst R16                    ; R0 auf 0 testen
        breq print_end             ; wenn 0, dann zu print_end
        rcall lcd_data             ; LCD-Sendefunktion aufrufen
        rjmp print               ; wieder zum Anfang springen
print_end:
        ret

MfG
Andi

von Patricia (Gast)


Angehängte Dateien:

Lesenswert?

@llo
habe noch versuch habe an der stelle von "Uss= " ist nur komische
sache zu sehen scheint es mehr mal zu schreiben obwohl der ADC wert
stimmt neben an.
hat jemand es versuch zu simulieren? Bitte Hilfe

von Thomas Forster (Gast)


Lesenswert?

du definierst:
.def temp1 = r25

Aber dann kommt:

print:
        lpm r16,z+          ; Erstes Byte des Strings nach R0 lesen
        tst R16

lcd_data erwartet das Zeichen in temp1=r25, aber es steht in r16.

Ändere also beide "r16" in "temp1", damit das Zeichen auch richtig
übergeben wird.

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.