-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: ATMEL AT89s8252 und 16x2 LCD HD 44780 comp.

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.04.2005
    Beiträge
    12

    ATMEL AT89s8252 und 16x2 LCD HD 44780 comp.

    Anzeige

    Hi Folgendes ich habe ein Programm für meinen MC und mein Display geschrieben jedoch bekomme ich das LCD nicht initialisiert vieleicht kann mir jemand von euch helfen.
    Pin1 GND
    Pin2 VCC
    Pin3 V0
    Pin4 P1.0
    Pin5 GND
    Pin6 P1.1
    Pin7 --
    Pin8 --
    Pin9 --
    Pin10 --
    Pin11 P1.2
    Pin12 P1.3
    Pin13 P1.4
    Pin14 P1.5
    Pin15
    Pin16

    So habe ich die Beiden Teile miteinander Verbunden

    und mein Assembler Programm
    ; Autor : Zunker
    ; Projekt : LCD
    ; Datum : Thu Apr 28 13:59:12 UTC+0200 2005
    ; Quarz : 12.288 MHz
    ;---------------------------------------------------------------

    ; Konstanten-, Speicher- und Portbelegung
    ;---------------------------------------------------------------
    LCD_RAM CODE 0Ah

    LCD_RS EQU P1.0
    LCD_RW EQU P1.1
    LCD_ENABLE EQU P3.7
    LCD_D4 EQU P1.2
    LCD_D5 EQU P1.3
    LCD_D6 EQU P1.4
    LCD_D7 EQU P1.5

    ; Programmbeginn
    ;---------------------------------------------------------------
    ORG 0000h
    jmp start

    ; Interruptroutinen
    ;---------------------------------------------------------------

    ; Funktionen
    ;---------------------------------------------------------------

    ; LC-Display Ansteuerung

    ; LCD initialisieren
    LCD_init:

    ; warten, bis sich das Display initialisiert hat
    mov a,#50
    LCD_init_sleepsometime:
    call LCD_ws
    djnz Acc,LCD_init_sleepsometime

    ; Steuercodes senden
    clr LCD_RS
    clr LCD_RW
    clr LCD_ENABLE
    mov a,#00101000b
    call LCD_send_b
    setb LCD_ENABLE
    clr LCD_ENABLE
    mov a,#00101000b
    call LCD_send_b
    mov a,#1100b
    call LCD_send_b
    call LCD_clear

    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_returnhome:
    push ACC
    mov a,#128
    call LCD_send_b
    mov LCD_RAM,#0
    pop ACC
    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_clear:
    push ACC
    mov a,#1
    call LCD_send_b
    mov LCD_RAM,#0
    pop ACC
    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_printc:
    ; Ausgabe eines Charakters aus ACC
    inc LCD_RAM

    push ACC ; bei Überlauf der Spalten in
    mov a,LCD_RAM ; nächste Zeile weitersetzen
    cjne a,#17,LCD_no_change
    mov a,#168
    call LCD_send_b
    LCD_no_change:
    pop ACC
    ; Zeichen ausgeben
    call LCD_send_d
    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_prints:
    ; Ausgabe eines mit 0 terminierten Strings aus DPTR
    push ACC
    LCD_prints_anf:
    clr a
    movc a,@A+DPTR
    jz LCD_prints_weiter
    inc DPTR
    call LCD_printc
    jmp LCD_prints_anf
    LCD_prints_weiter:
    pop ACC
    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_send_b:
    ;sendet Befehle aus ACC an Datenport des LCD (interne Funktion)
    clr LCD_RS
    clr LCD_RW
    jmp LCD_send
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ;sendet Daten aus ACC an Datenport des LCD (interne Funktion)
    LCD_send_d:
    clr LCD_RW
    setb LCD_RS
    LCD_send:
    mov c,ACC.7 ; high-nibble ausgeben
    mov LCD_D7,c
    mov c,ACC.6
    mov LCD_D6,c
    mov c,ACC.5
    mov LCD_D5,c
    mov c,ACC.4
    mov LCD_D4,c

    setb LCD_ENABLE
    call LCD_ws
    clr LCD_ENABLE

    mov c,ACC.3 ; low-nibble ausgeben
    mov LCD_D7,c
    mov c,ACC.2
    mov LCD_D6,c
    mov c,ACC.1
    mov LCD_D5,c
    mov c,ACC.0
    mov LCD_D4,c

    setb LCD_ENABLE
    call LCD_ws
    clr LCD_ENABLE

    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ; Warteschleife für das LC-Display: 1.64ms
    ; Anzahl Maschinenzyklen: 1679.36
    LCD_ws:
    push psw
    push 0
    mov 0,#185
    LCD_ws_labelA:
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    djnz 0,LCD_ws_labelA
    nop
    pop 0
    pop psw
    ret
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    LCD_msg: db "LCD Ok.",0
    ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    ; Initialisierung
    ;---------------------------------------------------------------
    start:

    ; die SFR's initialisieren
    mov SP, #20h

    ; LC-Display initialisieren
    call LCD_init

    mov DPTR,#LCD_msg
    call LCD_prints

    ; Hauptprogramm
    ;---------------------------------------------------------------
    main:
    ; [...]

    ; Programmende
    ;---------------------------------------------------------------
    ende:
    jmp ende
    END

    Vieleicht kann einer von euch nen Fehler finden. Wäre nett wenn ihr mich auf mögliche Fehkler hinweisst.

    MFG
    Zunker

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Ok, habs noch nicht komplett analysiert.

    Aber die erste Zeile die mir auffällt ist die:
    LCD_RAM CODE 0Ah
    Mein Assembler versteht das garnicht. Gibst du damit nicht der Adresse 0Ah im Programmspeicher den Namen LCD_RAM?
    Ich denke das sollte IDATA heißen.

    Das zweite ist das du beim initialisieren bereits im 4-Bit Modus sendest. Das darf nicht sein. Zum initilasisieren mußt du das Highnibble so anlegen als wärst du im 8-Bit-Modus und dann Enable pulsen.

    Sollte in etwa so aussehen:
    Code:
    lcd-reset:
    	CLR	en
    	CLR	rs
    	CLR	rw
    	
    	CLR	db7
    	CLR	db6
    	SETB	db5
    	SETB	db4
    	call	wait-long
    	
    	SETB	en
    	CLR	en
    	call	wait-long
    	
    	SETB	en
    	CLR	en
    	call	wait-long
    	
    	SETB	en
    	CLR	en
    	call	wait
    	
    	CLR	DB4		;hier schon im 8-Bit Modus auf 4-Bit umstellen
    	SETB	en
    	CLR	en
    RET

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    28.04.2005
    Beiträge
    12
    Das Problem ist dass mein Compiler den Befehl DATA nicht kennt desshalb habe ich gedacht mit CODE gehts auch da dieser ja das ganze register anspricht ?
    Und Ich hab doch nur 4 Bit angeschlossen dann kann ich doch auch nur 4 bit senden oder ?

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Wie gesagt, mein Assembler versteht dieses CODE garnicht. Aber ich denke das du damit nur den CODEspeicher deklarieren kannst. Versuch doch mal ein EQU. Bei mir geht das.

    Und das du nur 4-Bit angeschlossen hast ist klar. Aber bei der initialisierung tust du einfach so als wären es 8.

    Leg einfach nur das Highnibble ans Display an und pulse Enalble. So wie in dem Code den ich oben geschrieben hab. Das Bitmuster zum Reset war bei dir auch nicht richtig. Du mußt genau das Bitmuster aus dem Datenblatt senden.
    Nach dem Reset mußt du dann das Bit für den 4-Bit Modus stellen und wieder Enable pulsen.

    Ab jetzt kannst du im 4-Bit-Modus arbeiten.
    Und als erstes sendest du den "Function Set"-Befehl. Der wird nämlich nur an dieser Stelle akzeptiert.

    Und ein kleiner Fehler ist mir gerade noch aufgefallen:
    Code:
    LCD_send:
    	call	LCD_ws ;hier muß noch eine Wartezeit rein da du das Busy nicht abfragst
    
    	MOV C,ACC.7 ; high-nibble ausgeben
    	MOV LCD_D7,C
    	MOV C,ACC.6
    	MOV LCD_D6,C
    	MOV C,ACC.5
    	MOV LCD_D5,C
    	MOV C,ACC.4
    	MOV LCD_D4,C
    
    	SETB LCD_ENABLE
    ;	call LCD_ws	 ;bei mir ist das nicht nötig, prozessor so schnell?
    	CLR LCD_ENABLE
    
    	call	LCD_ws ;hier muß noch eine Wartezeit rein da du das Busy nicht abfragst
    
    	MOV C,ACC.3 ; low-nibble ausgeben
    	MOV LCD_D7,C
    	MOV C,ACC.2
    	MOV LCD_D6,C
    	MOV C,ACC.1
    	MOV LCD_D5,C
    	MOV C,ACC.0
    	MOV LCD_D4,C
    
    	SETB LCD_ENABLE
    ;	call LCD_ws
    	CLR LCD_ENABLE
    
    RET
    Hab reingeschrieben was mir noch aufgefallen ist.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    28.04.2005
    Beiträge
    12
    Also ich muss sagen ich bin eher ein leihe was sagen Assembler angeht und ich kann dir leider nicht ganz folgen. Würdest du mir den code so ändern dass er funktioniert ? wäre seh sehr nett

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Das du dich noch nicht so gut auskennst macht ja nichts. Vieleicht hab ich mich auch nicht klar genug ausgedrückt.
    Ändern möchte ich deinen Code allerdings nicht.
    Der Lerneffekt ist viel größer wenn du es selbst schaffst.
    Aber wenn du wirklich nicht weiterkommst kann ich dir Code von mir schicken an dem du dich orientieren kannst.
    Wenn du das willst dann schreib mir.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.04.2005
    Beiträge
    12
    Das wäre nicht schön, denn wenn ich was durchlese verstehe ich es meist leicher.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Gut.
    Ich hab mal bisschen was rausgesucht.
    Damit sollte die Initialisierung und das Senden schonmal funktionieren.
    Ist aber kein vollständiges Programm.

    Code:
    INCLUDE .......		;dein prozessor
    
    ;-------------------------------------------------------------------------------
    ;variablendeklaration
    rs		EQU	px.x
    rw		EQU	px.x
    en		EQU	px.x
    DB4		EQU	px.x
    db5		EQU	px.x
    db6		EQU	px.x
    db7		EQU	px.x
    ;-------------------------------------------------------------------------------
    
    
    
    ;-------------------------------------------------------------------------------------
    lcd-com:
    ;sendet einen Befehl im ACC ans LCD
    	CLR	rs
    	CLR	rw
    JMP	lcd-write
    ;-------------------------------------------------------------------------------------
    lcd-out:
    ;sendet ein Zeichen im ACC ans LCD
    	SETB	rs
    	CLR	rw
    ;-------------------------------------------------------------------------------------
    lcd-write:
    ;beeinflusst ACC,Carry und R0-R2
    	MOV	R2,#02h	;zwei durchläufe da zwei nibbles
    lcd-write1:
    	call	wait		;es könnte kurz vorher gesendet worden sein also lieber
    				;mal etwas warten bis das lcd bereit ist
    	RLC	A		;daten
    	MOV	db7,C		;schrittweise
    	RLC	A		;in carry schieben
    	MOV	db6,C		;und an datenport
    	RLC	A		;anlegen
    	MOV	db5,C
    	RLC	A
    	MOV	db4,C
    	
    	SETB	en		;schreibimpuls
    	CLR	en
    
    	DJNZ	R2,lcd-write1	;wiederholen wenn es der erste durchlauf war
    RET
    ;-------------------------------------------------------------------------------------
    
    
    ;-------------------------------------------------------------------------------------
    lcd-ini:
    	CLR	en
    	CLR	rs
    	CLR	rw
    	
    	CLR	db7		;lcd
    	CLR	db6		;8-bit
    	SETB	db5		;modus
    	SETB	db4		;
    	call	wait-long	;länger warten
    	
    	SETB	en		;
    	CLR	en		;senden
    	call	wait-long	;länger warten
    	
    	SETB	en		;nochmal
    	CLR	en		;senden
    	call	wait-long	;länger warten
    	
    	SETB	en		;nochmal
    	CLR	en		;senden
    	call	wait		;länger warten
    	
    	CLR	DB4		;4-bit modus
    	SETB	en		;senden
    	CLR	en
    
    ;-------------------------------------------------------------------------------------
    ;dispalyfunktionen initialisieren
    	MOV	A,#28h	;4bit, 2lines, 5x7
    	call	lcd-com
    	MOV	A,#01h	;clr
    	call	lcd-com
    	MOV	A,#02h	;home
    	call	lcd-com
    	MOV	A,#06h	;inc	no shift
    	call	lcd-com
    	MOV	A,#0ch	;disp. on ,curs. off ,blink off
    	call	lcd-com
    RET
    ;-------------------------------------------------------------------------------------
    wait-long:
    ;evtl die register retten wenn du sie brauchst
    	MOV	R0,#00h
    	MOV	R1,#00h
    wait-long1:
    	DJNZ	R0,wait-long1
    	DJNZ	R1,wait-long1
    RET
    ;-------------------------------------------------------------------------------------
    wait:
    ;evtl register retten wenn du sie brauchst
    	MOV	R0,#00h
    wait1:
    	DJNZ	R0,wait1
    RET
    ;-------------------------------------------------------------------------------------
    Damit solltest du schon weiterkommen.
    Ist aus einem funktionstüchtigen Programm. Sollte also klappen.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    28.04.2005
    Beiträge
    12
    Was bedeutet das include Prozessor ?

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    Das ist eine include-Anweisung.
    Der Assembler, oder besser der Präprozessor, geht vor dem assemblieren das Programm durch und sucht nach solchen Anweisungen.
    Diese soll die Header-datei des verwendeten Prozessors mit einbinden. Darin sind dann die ganzen SFRs bezeichnet. Machst du das nicht würde der Assembler nicht verstehen was du z.B. mit P1 meinst.
    Musst du das nicht machen?
    Mein Assembler beschwert sich wenn es nicht da seht. Welchen benutzt du?

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •