Geschätztes Forum,
als Anfänger habe ich versucht, mich mit folgenden Themen vertraut zu
machen:
ADC
LCD mit CGRAM
Timer
Ich benutze einen ATMEGA8A-PU und programmiere in Assembler in Studio 4.
Aktuell arbeite ich am Modell eines DVM. Die gemessene Spannung wird in
Line 1 angezeigt. In Line 2 wird eine Quasi-Analoganzeige mit 0 bis 80
'Balken' ausgegeben. Das ergibt sich aus 16 Zeichen pro Zeile zu je 5
Punkten bei 5x7 Dot Matrix.
Bei Verwendung des LCD CP594V-0 funktioniert das auch prima. Weil dieses
LCD aber so hässlich und klobig ist, würde ich gerne ein LCD DOGM162W-A
verwenden. Schon bei der Initialisierung desselben musste ich mich ganz
schön quälen (wer keine anderen Sorgen hat der macht sich welche), habe
es aber schliesslich hinbekommen. Bei der 4-Bit-Verdrahtung sowie
Assembler findet man praktisch keine Hilfe im Internet, im Gegensatz zur
SPI-Verdrahtung und C. Mit SPI möchte ich mich erst später beschäftigen,
mit C gar nicht.
------------------------------------------------------------------------
---
Hilferuf:
Was mir aber beim DOGM162W-A trotz aller Mühen nicht gelingt, das ist
die Quasi-Analoganzeige in Line 2. Dabei gibt es aber kein Problem mit
der Line 2 selbst: Ausgaben dahin gelingen einwandfrei. Das Problem
liegt mit grosser Sicherheit beim CGRAM. Entweder beschreibe ich es
nicht richtig oder lese es nicht richtig aus oder beides. Wenn mir hier
jemand helfen würde, wäre ich wirklich dankbar.
DOGM162W-A.asm, Labels 'CGRam' bis 'Symbole': Beschreiben des CGRAM
DOGM162W-A.asm, Labels 'Loop70' bis 'Loop780': Definition der
auszugebenden 'Felder', 'Balken' und Blanks
DOGM162W-A.asm, Labels 'Loop80' bis 'Loop85' : Ausgabe der 'Felder',
'Balken' und Blanks in die Line 2
Der Controller des LCD DOGM162W-A heisst ST7036. Die Adressierung des
CGRAM ist im Datenblatt auf Seite 34 zu finden:
* Set CGRAM Address
RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0
Set CGRAM address to AC.
This instruction makes CGRAM data available from MPU.
Weil mir diese Adressierung offensichtlich nicht gelingt, habe ich den
Text zu den o.g. Labels gegenüber dem Text CP594V-0.asm hier unverändert
gelassen. Beim LCD CP594V-0 funktioniert es genau so, beim LCD
DOGM162V-0 aber nicht. Hier muss man demnach noch die Adressierung
einfliessen lassen. Das habe ich natürlich auf jede Weise, die mir
eingefallen ist, versucht. Ohne jeden Erfolg.
------------------------------------------------------------------------
---
Bisher realisierte Funktionen des DVM:
DC Range: AUTO
DC Range: 0.25 V
DC Range: 2.5 V
DC Range: 25 V
DC Range: 250 V
AC Range: AUTO
AC Range: 0.25 V
AC Range: 2.5 V
AC Range: 25 V
AC Range: 250 V
Diese Funktionen sind mittels einer Taste wählbar. Falls nicht 'AUTO'
gewählt wurde und die zu messende Spannung den Maximalwert [(2 ^ 10 – 1)
* 25 = 25575] erreicht oder überschreitet, erscheint 'OVERFLOW' in der
Line 2 statt der Quasi-Analoganzeige. Bei der Wahl von 'AUTO' wird
natürlich jeweils der nächst höhere Messbereich eingeschaltet.
'OVERFLOW' erscheint dann erst bei Erreichen von 255.75 V.
Noch zu realisierende Funktionen (nach vorläufigem Stand):
* Vielfachablesung der zu messenden Spannung ohne Änderung der
Auflösung.
* Korrekturberechnungen derart, dass die "Genauigkeit" von 10 Bit
möglichst erreicht wird.
* Überwachung der Versorgungsspannung (Alkali-Zellen oder Akkus).
* Durchgangs-Prüfer.
Insbesondere der lt. Literatur angeblich "ideale" Gleichrichter für die
AC Messung verschiebt und verbiegt die Kalibrierkurven erheblich. Auch
der Multiplexer CD4066 ist umso stärker an Ungenauigkeiten beteiligt, je
niederohmiger die OP Rückkopplung ist, weil die Schalter des CD4066
einen nicht ganz stabilen Innenwiderstand von ca. 130 Ohm haben. Der ADC
der MPU selbst ist auch nicht gerade von BURR-BROWN.
Kalibrierung und Ausgleichsberechnungen aufgrund der Ergebnisse sind
aber erst nach Aufbau eines fest verdrahteten Modells möglich. Die
Kontakte des bis jetzt verwendeten Steckbrett-Modells verändern ihre
Übergangswiderstände bei jeder Bewegung erheblich.
Die ASM-Dateien sind sehr sorgfältig kommentiert sowie in primitivster
Logik ohne alle Tricks erstellt. Einem erfahrenen Programmierer dürften
die Haare zu Berge stehen, aber so ist halt mein gegenwärtiger
Wissensstand.
Nach dem Entzippen der Datei <DVM mit Quasi-Analoganzeige.zip> in einem
Directory ergibt sich folgende Anordnung von Dateien:
\CP594V-0\AvrBuild.bat
\CP594V-0.aps
\CP594V-0.asm
\CP594V-0.aws
\CP594V-0.hex
\CP594V-0.map
\CP594V-0.obj
\DOGM162W-A\AvrBuild.bat
\DOGM162W-A.aps
\DOGM162W-A.asm
\dogm162w-a.aws
\DOGM162W-A.hex
\DOGM162W-A.map
\DOGM162W-A.obj
\DSC22492.pdf
\DSC22493.pdf
\DVM mit Quasi-Analoganzeige.zip
\Versuchsaufbau 1.pdf
\Versuchsaufbau 2.pdf
\Versuchsaufbau 3.pdf
\Versuchsaufbau.spl7
Die Datei 'Versuchsaufbau.spl7' kann mittels des Programms ABACOM sPlan7
editiert werden. Sie enthält die Schaltpläne entspr. Versuchsaufbau
1.pdf bis Versuchsaufbau 3.pdf.
Die ZIP-Datei wurde mittels 7-Zip erstellt.
Der 'sPlan 7.0 Viewer' ist kostenlos erhältlich bei
www.abacom-online.de/
Ich hoffe sehr auf Eure Hilfe bei menem Problem mit dem CGROM des LCD
DOGM162W-A.
Für jede Mühe danke ich ganz herzlich.
Klaus
Warst Dir jetzt nicht sicher, was Du machen sollst, Projektvorstellung oder Frage? Deine Frage ging dabei weitestgehend unter. Klaus D. schrieb: > Entweder beschreibe ich es > nicht richtig oder lese es nicht richtig aus oder beides. Da die Routine CGRam in DOGM162W-A.asm nirgends aufgerufen wird, enthält das Icon Ram auch nichts. Und hierzu: Klaus D. schrieb: > Einem erfahrenen Programmierer dürften > die Haare zu Berge stehen Ja. ;D
Hallo MWS,
vielen Dank für Deine Antwort. Der eigentliche Grund meines Beitrags ist
die Frage nach dem Schreiben ins und dem Auslesen aus dem CGRAM des LCDs
DOGM162W-A. Mit der Vorstellung des Gesamtprojektes bin ich sicherlich
übers Ziel hinausgeschossen.
Deine Rüge, im File DOGM162-A.asm würde die Routine CGRam nirgends
aufgerufen, ist korrekt. Der Grund dafür ist aber einfach: Wenn sie
aufgerufen wird, dann funktioniert sie nicht oder, falls sie doch
funktionieren sollte, dann funktioniert meine Version des Auslesens
nicht.
Der Aufruf würde wie folgt erfolgen:
rcall LCD_init
rcall LCD_clear
rcall CGRam ; <---
rjmp Loop010 ; First check of the Measuring Range
;-----------------------------------------------------------------------
; Main Loop
Loop:
sei ; Allow Interrupt
nur funktioniert es beim LCD DOGM162W-A leider nicht.
Beim LCD CP594V-0 funktioniert es einwandfrei.
Unterschiedlich sind die Controller der LCDs:
DOGM162W-A Controller: ST7036
CP594V-0 Controller: KS0070B
Für Hilfe bei meinem Problem wäre ich wirklich sehr dankbar.
Nachfolgend die relevanten Programmzeilen:
;-----------------------------------------------------------------------
; Zeichen ins CGRAM des LCD schreiben
CGRam:
sbi PORTD , 4 ; RS
ldi R16 , 0b00000000
out PORTD , R16
ldi ZL , LOW(Symbole*2)
ldi ZH , HIGH(Symbole*2)
CGRam1:
lpm R16 , Z+
cpi R16 , 253
breq CGRam2
rcall LCD_cmd
lpm R16 , Z+
cpi R16 , 253
breq CGRam2
rcall LCD_data
rjmp CGRam1
CGRam2:
cbi PORTD , 4 ; RS
ret
;-----------------------------------------------------------------------
; Zeichen fürs CGRAM des LCD
Symbole:
.db 64,0,65,0,66,0,67,0,68,0,69,0,70,0,71,0
.db 72,0,73,0,74,0,75,16,76,16,77,16,78,0,79,0
.db 80,0,81,0,82,0,83,24,84,24,85,24,86,0,87,0
.db 88,0,89,0,90,0,91,28,92,28,93,28,94,0,95,0
.db 96,0,97,0,98,0,99,30,100,30,101,30,102,0,103,0
.db 104,0,105,0,106,0,107,31,108,31,109,31,110,0,111,0,253,0
;-----------------------------------------------------------------------
;-----------------------------------------------------------------------
; Ausgabe LCD Zeile 2: Löschen der LCD Zeile 2 durch Ausgabe von Blanks
; wenn R22 = 0 und R23 = 0 bzw. Ausgabe der Balken, falls U_Mess > 0
Loop80:
tst R23 ;
brne Loop81 ; R23 > 0 oder/und R22 > 0 ?
tst R22 ; dann ist U_Mess > 0
brne Loop81 ; und Balken werden in der LCD Zeile 2
; ausgegeben
rcall LCD_line2
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
ldi R16 , ' '
rcall LCD_data
rjmp Loop
Loop81:
cbr R19 , 0b11000000
rcall LCD_line2
Loop82: ; Felder, 0 ... 15
cpi R19 , 0
breq Loop83
ldi R16 , 5
rcall LCD_data
dec R19
tst R19
brne Loop82
Loop83: ; Balken, 1 ... 5
cpi R20 , 1
breq Loop831
cpi R20 , 2
breq Loop832
cpi R20 , 3
breq Loop833
cpi R20 , 4
breq Loop834
cpi R20 , 5
breq Loop835
Loop831: ; 1 Balken
ldi R16 , 1
rcall LCD_data
rjmp Loop84
Loop832: ; 2 Balken
ldi R16 , 2
rcall LCD_data
rjmp Loop84
Loop833: ; 3 Balken
ldi R16 , 3
rcall LCD_data
rjmp Loop84
Loop834: ; 4 Balken
ldi R16 , 4
rcall LCD_data
rjmp Loop84
Loop835: ; 5 Balken
ldi R16 , 5
rcall LCD_data
rjmp Loop84
Loop84: ; Blanks, 15 ... 0
cpi R21 , 0
breq Loop85
ldi R16 , 0
rcall LCD_data
dec R21
tst R21
brne Loop84
Loop85:
rjmp Loop
;-----------------------------------------------------------------------
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.