-         

Ergebnis 1 bis 5 von 5

Thema: probleme mit ausgabe auf lcd

  1. #1

    probleme mit ausgabe auf lcd

    Anzeige

    hallo,
    ich habe aus einer Assemblervorlage den im Anhang befindlichen C-Quelltext agbeleitet.
    Die Initialisierung des LC-Displays funktioniert auch, zumindest kann ich den Kontrast in beiden Zeilen verändern.
    Wenn ich jedoch einen Buchstaben ausgeben möchte wird das komplette Display beschrieben, teils mit unsinnigen Symbolen und teils mit dem gewünschten Buchstaben. Lediglich eine Stelle des Displays zu beschreiben ist mir noch nicht gelungen, hoffe jemand findet eine Lösung.
    Gruss Steffen
    Angehängte Dateien Angehängte Dateien

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Mahlzeit

    Ne Lösung kann ich dir nicht wirklich anbieten, nur ein paar Gedanken, wobei mein c etwas eingerostet ist...

    Das viele hinundher gespringsel ist aufm PC ganz ok, auf nem AVR kostet sowas eeeeleend Zeit.

    Wasn das?
    Code:
    void LCD_string(char *string)
    {
    	while(*string)
    	{
    		LCD_data(*string);
    		string++;
    	}
    }
    Hat aber eher nix mit dem einzelnen Zeichen zu tun

    In lcd_enable wartest 3us, erscheint mir was wenig, kann mich aber auch irren.

    Du führst in LCD_init schon LCD_on/clear aus, brauchst nicht nochmal in lcd_asm.

    Schreib das init für den 4 bit modus 2mal, nutz deine lcd_cmd Funktion dafür, aber frag mich nie warum.... Schau ins Datenblatt vom Controller, ob 5ms nachm modus setzen reichen tun, dito für alle anderen cmds.

    Klingt insgesamt nach nem Timing oder init Problem, schreibst ja mit LCD-data nur ein byte. Probier das mitm Modus 2x setzen und danach mit länger warten bei den einzelnen cmds/datenbytes.

    Viel Glück

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    26.08.2006
    Beiträge
    84
    Du schreibst leider nicht, was für ein Display du hast, bzw. was für ein Controller drauf ist. Auch wird nicht klar warum du den 4-Bit Modus nimmst.

    Für den Anfang tät ich normal 8Bit in einem Schritt rüberreichen, mit der selben Schaltung kannst du später immer noch auf 4Bit gehen.

    Dein code ist für ein Standard LCD mit HD44780, so du bereit bist nochmal code von asm zu c zu portieren nimm das hier in 8Bit. Wartet immer nur solange bis das Display fertig ist und springt nicht soviel in der Gegend rum (machts auch irgendwie übersichtlicher, IMHO):
    Code:
    lcdtxbytei:
    	; write single byte instruction to lcd
    	; rgtmp haelt instruction
    
    	; prepare to write instruction
    	CBI portb, 6				; rs to low
    
    	; write the byte
    	RCALL lcdwritebyte
    
    	RET
    
    lcdtxbyted:
    	; write single byte data to lcd
    	; rgtmp haelt databyte
    
    	; prepare to write data
    	SBI portb, 6				; rs to high
    
    	; write the byte
    	RCALL lcdwritebyte
    
    	RET
    
    lcdwritebyte:
    	; prepare for write
    	SBI portb, 0				; execute to high
    	CBI portb, 7				; rw to low
    
    	; portd to output (data bits)
    	LDI rgtmp2, 0xff
    	OUT DDRD, rgtmp2
    	; copy byte to port
    	OUT PORTD, rgtmp
    
    	; lower execute, exec instruction
    	CBI portb, 0				; execute to low
    
    		; --- check busy flag
    		; portd to input
    		LDI rgtmp2, 0x00
    		OUT portd, rgtmp2			; shut down pullups
    		OUT DDRD, rgtmp2			; switch to input
    
    		; prepare for busy read
    		SBI portb, 7				; rw to high
    		CBI portb, 6				; rs to low
    
    		busyloop:
    			; if busy low, don't run in circles
    			SBIS PIND, 7
    			RJMP busyend
    			SBI portb, 0				; execute to high
    			RJMP busyloop
    
    		; end of busy
    		busyend:
    
    	RET
    
    lcdinit:
    	; config execute
    	SBI DDRB, 0					; PC0 is output
    	SBI PORTB, 0				; and set it to high
    	; config rw (read/write, low for write, high for data/status read)
    	SBI DDRB, 7					; PC1 is output
    	SBI PORTB, 7				; and set it to high
    	; config rs (register select, low for instruction, high for data)
    	SBI DDRB, 6					; PC2 is output
    	SBI PORTB, 6				; and set it to high	
    
    	; init display
    	; - 8bit, 2 zeilen
    	LDI rgtmp, 0x38
    	RCALL lcdtxbytei
    	; - 8bit, 2 zeilen
    	LDI rgtmp, 0x38
    	RCALL lcdtxbytei
    	; - display an, cursor an, blink (?)
    	LDI rgtmp, 0x0e
    	RCALL lcdtxbytei
    	; - clear and home display
    	LDI rgtmp, 0x01
    	RCALL lcdtxbytei
    	; - autoincrement
    	LDI rgtmp, 0x06
    	RCALL lcdtxbytei
    
    	RET
    Sorry, hab irgendwie keinen Beispielcode in c...

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Warum nimmst du nicht den Standard Code von Peter Fleury, man muss das Rad nicht unbedingt neu erfinden.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #5
    ich habe mir den ganzen quelltext heute nochmal vorgenommen und jetzt läuft es, aber danke für die Bemühungen.

Berechtigungen

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