mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Routinen aus Tutorial


Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
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:
.include "m8def.inc"

.def temp1 = r16
.def temp2 = r17
.def temp3 = r18


           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten
RAM-Adresse
           out SPH, temp1

           ldi temp1, 0xFF    ;Port D = Ausgang
           out DDRC, temp1

           rcall lcd_init     ;Display initialisieren
           rcall lcd_clear    ;Display löschen

           ldi temp1, 'T'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 'e'     ;Zeichen anzeigen
           rcall lcd_data
           
           ldi temp1, 's'     ;Zeichen anzeigen
           rcall lcd_data

           ldi temp1, 't'     ;Zeichen anzeigen
           rcall lcd_data

loop:
           rjmp loop

.include "lcdrou.asm"            ;LCD-Routinen werden hier eingefügt



Hier die Routinen
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;                 LCD-Routinen                ;;
;;                 ============                ;;
;;              (c)andreas-s@web.de            ;;
;;                                             ;;
;; 4bit-Interface                              ;;
;; DB4-DB7:       PD0-PD3                      ;;
;; RS:            PD4                          ;;
;; E:             PD5                          ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 
 
 ;sendet ein Datenbyte an das LCD
lcd_data:
           mov temp2, temp1             ;"Sicherungskopie" für
                                        ;die Übertragung des 2.Nibbles
           swap temp1                   ;Vertauschen
           andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
           sbr temp1, 1<<4              ;entspricht 0b00010000
           out PORTC, temp1             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
                                        ;2. Nibble, kein swap da es
schon
                                        ;an der richtigen stelle ist
           andi temp2, 0b00001111       ;obere Hälfte auf Null setzen 
           sbr temp2, 1<<4              ;entspricht 0b00010000
           out PORTC, temp2             ;ausgeben
           rcall lcd_enable             ;Enable-Routine aufrufen
           rcall delay50us              ;Delay-Routine aufrufen
           ret                          ;zurück zum Hauptprogramm

 ;sendet einen Befehl an das LCD
lcd_command:                            ;wie lcd_data, nur ohne RS zu
setzen
           mov temp2, temp1
           swap temp1
           andi temp1, 0b00001111
           out PORTC, temp1
           rcall lcd_enable
           andi temp2, 0b00001111
           out PORTC, temp2
           rcall lcd_enable
           rcall delay50us
           ret

 ;erzeugt den Enable-Puls
lcd_enable:
           sbi PORTC, 5                 ;Enable high
           nop                          ;3 Taktzyklen warten
           nop
           nop
           cbi PORTC, 5                 ;Enable wieder low
           ret                          ;Und wieder zurück             
       

 ;Pause nach jeder Übertragung
delay50us:                              ;50us Pause
           ldi  temp1, $42
delay50us_:dec  temp1
           brne delay50us_
           ret                          ;wieder zurück

 ;Längere Pause für manche Befehle
delay5ms:                               ;5ms Pause
           ldi  temp1, $21
WGLOOP0:   ldi  temp2, $C9
WGLOOP1:   dec  temp2
           brne WGLOOP1
           dec  temp1
           brne WGLOOP0
           ret                          ;wieder zurück

 ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           ldi  temp3,50
powerupwait:
           rcall  delay5ms
           dec  temp3
           brne  powerupwait
           ldi temp1, 0b00000011        ;muss 3mal hintereinander
gesendet
           out PORTC, temp1             ;werden zur Initialisierung
           rcall lcd_enable             ;1
           rcall delay5ms
           rcall lcd_enable             ;2
           rcall delay5ms
           rcall lcd_enable             ;und 3!
           rcall delay5ms
           ldi temp1, 0b00000010        ;4bit-Modus einstellen
           out PORTC, temp1
           rcall lcd_enable
           rcall delay5ms
           ldi temp1, 0b00101000        ;noch was einstellen...
           rcall lcd_command
           ldi temp1, 0b00001100        ;...nochwas...
           rcall lcd_command
           ldi temp1, 0b00000100        ;endlich fertig
           rcall lcd_command
           ret

 ;Sendet den Befehl zur Löschung des Displays
lcd_clear:
           ldi temp1, 0b00000001   ;Display löschen
           rcall lcd_command
           rcall delay5ms
           ret



Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lass mal das [code] am Anfang weg und setzt den richtigen Kontroller ein

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert (Gast)
Datum:

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

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hubert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HanneS (Gast)
Datum:

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

Autor: Ingo Uhlemann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.