LCD Routinen aus Tutorial

Gast #147579
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
Gast #147581
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
Gast #147582
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
Gast #147584
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
Gast #147586
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
Gast #147589
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren