Forum: Mikrocontroller und Digitale Elektronik LCD Routinen aus Tutorial


von Ingo Uhlemann (Gast)


Lesenswert?

Hallo,

ich habe jetzt meine Schaltung zur Ansteuerung meines Displays fertig
und habe versucht die ASM Routinen für die Ansteuerung des Displays zu
benutzen. Ich habe die Kopiert und den Port geändert. aber es kommt
beim Assemplieren folgender Fehler.
1
m8def.inc(41) : error : Illegal device name

Ich habe auch schon versucjt die Bibliothek zu ersetzten m128def.inc da
kommt aber auch eine Fehlermedlung.
Ich muß dazu sagen ich habe einen ATmega128 und keinen 8er wie im Tut.
Ich bin in sachsen Assembler Blutiger Anfänger und versuche mich
dahingehend einzuarbeiten.

Mit besten Dank

Ingo
Das Programmbeispiel:
1
.include "m8def.inc"
2
3
.def temp1 = r16
4
.def temp2 = r17
5
.def temp3 = r18
6
7
8
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
9
RAM-Adresse
10
           out SPL, temp1
11
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten
12
RAM-Adresse
13
           out SPH, temp1
14
15
           ldi temp1, 0xFF    ;Port D = Ausgang
16
           out DDRC, temp1
17
18
           rcall lcd_init     ;Display initialisieren
19
           rcall lcd_clear    ;Display löschen
20
21
           ldi temp1, 'T'     ;Zeichen anzeigen
22
           rcall lcd_data
23
24
           ldi temp1, 'e'     ;Zeichen anzeigen
25
           rcall lcd_data
26
           
27
           ldi temp1, 's'     ;Zeichen anzeigen
28
           rcall lcd_data
29
30
           ldi temp1, 't'     ;Zeichen anzeigen
31
           rcall lcd_data
32
33
loop:
34
           rjmp loop
35
36
.include "lcdrou.asm"            ;LCD-Routinen werden hier eingefügt


Hier die Routinen
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                 LCD-Routinen                ;;
3
;;                 ============                ;;
4
;;              (c)andreas-s@web.de            ;;
5
;;                                             ;;
6
;; 4bit-Interface                              ;;
7
;; DB4-DB7:       PD0-PD3                      ;;
8
;; RS:            PD4                          ;;
9
;; E:             PD5                          ;;
10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
12
 
13
 
14
 ;sendet ein Datenbyte an das LCD
15
lcd_data:
16
           mov temp2, temp1             ;"Sicherungskopie" für
17
                                        ;die Übertragung des 2.Nibbles
18
           swap temp1                   ;Vertauschen
19
           andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
20
           sbr temp1, 1<<4              ;entspricht 0b00010000
21
           out PORTC, temp1             ;ausgeben
22
           rcall lcd_enable             ;Enable-Routine aufrufen
23
                                        ;2. Nibble, kein swap da es
24
schon
25
                                        ;an der richtigen stelle ist
26
           andi temp2, 0b00001111       ;obere Hälfte auf Null setzen 
27
           sbr temp2, 1<<4              ;entspricht 0b00010000
28
           out PORTC, temp2             ;ausgeben
29
           rcall lcd_enable             ;Enable-Routine aufrufen
30
           rcall delay50us              ;Delay-Routine aufrufen
31
           ret                          ;zurück zum Hauptprogramm
32
33
 ;sendet einen Befehl an das LCD
34
lcd_command:                            ;wie lcd_data, nur ohne RS zu
35
setzen
36
           mov temp2, temp1
37
           swap temp1
38
           andi temp1, 0b00001111
39
           out PORTC, temp1
40
           rcall lcd_enable
41
           andi temp2, 0b00001111
42
           out PORTC, temp2
43
           rcall lcd_enable
44
           rcall delay50us
45
           ret
46
47
 ;erzeugt den Enable-Puls
48
lcd_enable:
49
           sbi PORTC, 5                 ;Enable high
50
           nop                          ;3 Taktzyklen warten
51
           nop
52
           nop
53
           cbi PORTC, 5                 ;Enable wieder low
54
           ret                          ;Und wieder zurück             
55
       
56
57
 ;Pause nach jeder Übertragung
58
delay50us:                              ;50us Pause
59
           ldi  temp1, $42
60
delay50us_:dec  temp1
61
           brne delay50us_
62
           ret                          ;wieder zurück
63
64
 ;Längere Pause für manche Befehle
65
delay5ms:                               ;5ms Pause
66
           ldi  temp1, $21
67
WGLOOP0:   ldi  temp2, $C9
68
WGLOOP1:   dec  temp2
69
           brne WGLOOP1
70
           dec  temp1
71
           brne WGLOOP0
72
           ret                          ;wieder zurück
73
74
 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
75
lcd_init:
76
           ldi  temp3,50
77
powerupwait:
78
           rcall  delay5ms
79
           dec  temp3
80
           brne  powerupwait
81
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
82
gesendet
83
           out PORTC, temp1             ;werden zur Initialisierung
84
           rcall lcd_enable             ;1
85
           rcall delay5ms
86
           rcall lcd_enable             ;2
87
           rcall delay5ms
88
           rcall lcd_enable             ;und 3!
89
           rcall delay5ms
90
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
91
           out PORTC, temp1
92
           rcall lcd_enable
93
           rcall delay5ms
94
           ldi temp1, 0b00101000        ;noch was einstellen...
95
           rcall lcd_command
96
           ldi temp1, 0b00001100        ;...nochwas...
97
           rcall lcd_command
98
           ldi temp1, 0b00000100        ;endlich fertig
99
           rcall lcd_command
100
           ret
101
102
 ;Sendet den Befehl zur Löschung des Displays
103
lcd_clear:
104
           ldi temp1, 0b00000001   ;Display löschen
105
           rcall lcd_command
106
           rcall delay5ms
107
           ret

von Hubert (Gast)


Lesenswert?

lass mal das [code] am Anfang weg und setzt den richtigen Kontroller ein

von Ingo Uhlemann (Gast)


Lesenswert?

Das [code] hatte ich hier erst eingetragen da ich gedacht habe das
dieses Forum diesen Text dann Farblich Markiert wie es in andern Foren
üblich ist aber ist egal. Ich habe auch schon den m128def.inc
eingesetzt aber ohne erfolg.

TSchau Ingo

von Ingo Uhlemann (Gast)


Lesenswert?

Ich habe jetzt AVR-Studio genommen und da funktioniert es. Ich habe
jetzt das hex-File mit PonyProg auf meinen ATmega geschoben und nach
dem Schreibvorgang hat sich das Display auch Initialisiert. Aber wie
von mir schon zu erwarten erscheint nicht eine einzige Ausgabe.
Ich habe natürlich vorher den richtigen µC eingesetzt (m128def.inc).
Könnte es sein das ich durch die Portänderung noch die Regiser ändern
muß oder spielt dies keine rolle.

TSchau Ingo

von Hubert (Gast)


Lesenswert?

Bist du sicher das sich das Display initialisiert. Kontrast? sonst teste
das mal im AVR-Studio, ist ja nicht so riesig, schau was sich auf den
Ports tut.

von Ingo Uhlemann (Gast)


Lesenswert?

Wenn ich das Display einschalte erscheinen 2 Balken 1Zeile und dritte
Zeile. Nach dem Start des ATmega sind diese Zeilen weg und alles Felder
leicht schimmernd sichtbar. Ich gehe davon aus das damit das Display
Initialisert ist.

Also ich habe jetzt mal den Emu drüber laufen lassen, und da kann man
auch sehen das der Port C angesprochen wird aber damit kann ich
momentan noch nichts richtig anfangen. Ich hatte irgendwo eine Tool für
das Studio gesehen wo das Display mit emuliert werden kann mal sehen ob
ich das finde.

Tschau Ingo

von Hubert (Gast)


Lesenswert?

Du könnstest auch noch ein Zeitproblem haben wenn dein Quarz schneller
als 4MHz ist.

von Ingo Uhlemann (Gast)


Lesenswert?

Hallo,

ja mein ATmega läuft mit 16MHz da ich die Geschwindigkeit für
echtzeiterfassung von mehreren Meßdaten benötige. Wo könnten denn dann
noch Warteschleifen eingebaut werden.

TSchau Ingo

P.S.: Ich merke doch aller Anfang ist Schwer :-) ABer besten Dank für
die Hilfe

von Hubert (Gast)


Lesenswert?

Die Enable und Delayzeiten mal 4 würde ich sagen. Ist schon eine Weile
her das ich das Programm ausprobiert habe.
Im Enable 12 NOP und den Registerwert in den Delayschleifen auch mal 4.

von HanneS (Gast)


Lesenswert?

Was für LC-Display hast du? Diese Tutorial ist für LC-Display 4x20
gedacht.

von Ingo Uhlemann (Gast)


Lesenswert?

Hallo,

ich habe ein 4x20.
Ich habe jetzt alle Wartezyklen 4x eingefügt und jetzt Funktioniert es,
ist zwar nicht sehr elegand aber für den Anfang reicht es Optimieren
kann man ja allemal noch.

Tschau Ingo

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.