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
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
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
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.
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
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
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.
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