www.mikrocontroller.net

Forum: Codesammlung LCD Ansteuerung im 4bit-Modus

Autor: Johannes K. (Gast)
Datum: 14.04.2006 10:21
Dateianhang: LCD4b_v1.1.rar (2,6 KB, 1156 Downloads)

Hallo,
Ich hab eine einfache LCD-Routine für KS0070 und HD44780 LCD-Controller
, welche im 4Bit Modus betrieben werden, geschrieben. Ich steuere damit
einen 2 Zeilen Display mit jeweils 16 Zeichen an.
Autor: Anfänger (Gast)
Datum: 14.01.2007 18:41

Hallo
Bei Einbinden hat soweit alles funktioniert aber er findet  die
avrinttypes.h die bei io.h aufgerufen wird nicht. Wer hat dieses
Programm schonmal zum laufen begracht? Ich habe so ne datei nicht habe
schon alle includes dursucht.

Ich benutze AVR Studio4 und\ oder CodeVisionAVR

Über eine schnelle Antwort würde ich mich freuen
Autor: Anfänger (Gast)
Datum: 14.01.2007 20:04

Das Problem ist schon geklärt es ist ein schreibfehler.
Es steht #include <avr/avrinttypes.h> im code(ka ob nur bei mir) doch es
soll  #include <avr/inttypes.h> heisen.
Autor: rennreh (Gast)
Datum: 15.01.2007 09:09

Guten Morgen,

ich wollte kein im Sinne der Wiederverwendbarkeit keinen neuen Thread
erstellen.
folgendes Assembler Programm habe ich geschreiben:
[code]
.include "m8def.inc"


.def  time =  r16

;  D4    D0
;  D5    D1
;  D6    D2
;  D7    D3
;  RS    D4
;  E    D5
;  RW

start:
  ldi    r16,  LOW(RAMEND)
  out    SPL,  r16
  ldi    r16,  HIGH(RAMEND)
  out    SPH,  r16

  ldi    r16,  0xff
  out    DDRD,  r16

  ; initialisierung
  ; mehr als 15 ms warten
  ldi    time,  250
  rcall delay


  ; function set
  ldi    r16,  0b00100011
  out    PORTD,  r16


  ldi    time,  250
  rcall   delay


  ; function set 2
  ldi    r16,   0x00
  out    PORTD,  r16

  ldi    r16,  250
  rcall  delay

  ldi    r16,  0b00100011
  out    PORTD,   r16

  ldi    r16,   250
  rcall  delay


  ; function set 3
  ldi    r16,   0x00
  out    PORTD,  r16

  ldi    r16,  250
  rcall  delay

  ldi    r16,  0b00100011
  out    PORTD,   r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00000011
  out    PORTD,  r16


  ; zeugs
  ldi    r16,   250
  rcall  delay

  ldi    r16,   0b00100010
  out    PORTD,  r16

  ldi    r16,  0b00000010
  out    PORTD,  r16





  ldi    r16,   250
  rcall  delay


  ldi    r16,  0b00100010
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00000010
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00101000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00001000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay






  ldi    r16,  0b00100000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0x00
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00101000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00001000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay






  ldi    r16,  0b00100000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0x00
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00100001
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0x00
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay





  ldi    r16,  0b00100000
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0x00
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00100111
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay

  ldi    r16,  0b00000111
  out    PORTD,  r16

  ldi    r16,   250
  rcall  delay



loop:
  rjmp loop



delay:
  delay_loop:
    dec    time    ;  1
    cpi    time,  1  ;  1
    nop

    brlt  delay_loop  ;   2
ret

[/code]

Das LCD Modul der Firma Batrom, habe ich enntsprechend angeschlossen.
Die datenleitunengen D0 - D3 des Controllers ATMEGA8 habe ich an LCD
angeschlossen: DB4 - DB7 ... Die Anderen Datenelietungen am LCD hab ich
auf Masse gesetzt (DB0 - DB3). Da ich kein Busy-Flag abfrage, benötige
ich das  den Pin E am LCD nicht, so setze ich ihn auf Masse.
RS hängt am D4 und R/W am D5.
Mit einem TC 7660 erzeuge ich eine negative Spannung, mit der ich den
Kontrast des LCD modifizieren kann.

Wenn ich das Programm auf den Kontroller übertrage, so zeigt mein LCD
nur zwei schwarze Balken an, mehr aber nicht.

Kann man die Funktion des LCD schrittweise Testen, sodass ich den Fehler
einkreisen kann ?
oder liegt es am Programm ?

Autor: Falk (Gast)
Datum: 15.01.2007 09:30

@rennreh

1.) Solche Quelltexte sind besser als Anhang aufgehoben.
2.)

>auf Masse gesetzt (DB0 - DB3). Da ich kein Busy-Flag abfrage, benötige
>ich das  den Pin E am LCD nicht, so setze ich ihn auf Masse.

DAS wage ich zu bezweifeln. Du musst R/W auf Masse legen, aber E wird
IMMER benötigt.

> Kann man die Funktion des LCD schrittweise Testen, sodass ich den Fehler
>einkreisen kann ?

Werstmal mit dem Simulator schauen, was an den Ports rauskommt. Dann die
Port auf gute und richtige Verbindung zum LCD prüfen.

> oder liegt es am Programm ?

Who knows?

MFG
Falk
Autor: Karl heinz Buchegger (kbucheg)
Datum: 15.01.2007 10:01

> @rennreh
>
> 1.) Solche Quelltexte sind besser als Anhang aufgehoben.

Und vor allen Dingen nicht in der Codesammlung.
Wie der Name (und das Kleingedruckte) schon sagt:
Hier geht es um Code der funktioniert, den man anderen
zur gefälligen Weiterbenutzung zur Verfügung stellt.

Ansonsten hat Falk schon alles gesagt:
Ohne E wird das nichts.
Hast du dir das LCD-Beispiel im Tutorial schon mal reingezogen?
Autor: rennreh (Gast)
Datum: 15.01.2007 11:39

ich danke für eure hilfe.
jap das tutorial habe ich mir angeschaut und ich habe den quellcode
einfach kopiert und auf den controller geschoben. die verbindungen habe
ich entsprechend angeschlossen.
so, nun hab ich die verbindungen alle mal durchgeklingelt ich hab nur
bei einem (DB1) 2 ohm gemessen der rest geht gegen 0.
sorry aber ... mein LCD zeigt immernoch zwei schwarze balken an, selbst
mit dem quellcode von dem tutorial.
Autor: Falk (Gast)
Datum: 15.01.2007 13:44

Was für einen Quarz hast du? Bist du sicher, dass dein uC auch läuft?
Lass mal ne LED blinken.

MfG
Falk
Autor: gast (Gast)
Datum: 18.01.2007 10:32

Mal ganz blöd....

zwei schwarze Balken?? Liegt das nicht vielleicht am Kontrast?? Nicht
das du wegen den Balken die Zeichen nicht siehst??

Grüße...
Autor: Paul (Gast)
Datum: 24.01.2007 21:14

Hallo
Ich steuere meine LCD auch im 4 bit modus an. Nach langem rumsuchen und
lesen compeliert mein Code jetzt ohne probleme doch ich kann nicht auf
den EEPROM schreiben es kommt immer eine fehlermeldung.

Die wäre "Extra precaution should be made when using the CKDIV fuse
and/or Clock Prescaler Register (CLKPR) on parts supportig this."

Davor steht noch das die ISP programming frequency 1/4 der frequenz sein
sollte das habe ich so auch gemacht. Ich traue mich nicht an die Fuses
dran kann mir jemang sagen was ich machen soll ich benutze AVR Studio 4.
Ach genau es gibt ja daten die man auf den fash schreiben muss und das
geht ohne probleme.

Danke für die Antworten
Autor: Johannes K (Gast)
Datum: 05.03.2007 19:19

Hallo,
Habe vor langer Zeit einmal die Software erweitert, damit man die 4
Datenbits am unteren oder oberen Half-Byte eine Ports ausgeben kann. Bin
bis jetzt leider noch nicht zum Testen gekommen, aber normal sollte
alles funktionieren.

mfg. Johannes
Autor: Johannes K (Gast)
Datum: 05.03.2007 19:20
Dateianhang: LCD4b_v1.2.rar (3,1 KB, 518 Downloads)

Ohne Kommentar.
Autor: Newbie ..... (Gast)
Datum: 06.07.2007 00:31

Wenn es auch ne dumme Frage ist, aber wo kann man den port und bit-nr.
einstellen? ich find irgentwie nicht ;)
Autor: Joachim B. (jar)
Datum: 06.07.2007 11:39

Newbie ..... wrote:
> Wenn es auch ne dumme Frage ist, aber wo kann man den port und bit-nr.
> einstellen? ich find irgentwie nicht ;)


in LCD4b.h ?

#ifndef F_CPU
#define F_CPU 16000000UL     //Prozessor Frequenz in Hz
#endif

#define lcd_e 3              //E Pinnummer
#define lcd_rs 2             //RS Pinnummer
#define HalfByteSel 0        //Oberes (0) oder Unteres Halbbyte (1) für
Datenübertragung
#define PORT PORTD
Autor: Wolfgang K. (Gast)
Datum: 13.08.2007 23:09

Hallo!

@ Johannes: Habe deine Quelltexte ausprobiert, funktioniert einwandfrei.
Danke

Meine Frage: Mit LCD_Data kann ich ein Zeichen laut Tabelle ausgeben und
mit LCD_Out eine String-Folge. Aber wie bekomme ich eine Variable
einfach hinaus? Will den ADC-Wert anzeigen lassen.

Vielen Dank jetzt schon mal!

Wolfgang
Autor: Wolfgang K. (Gast)
Datum: 27.08.2007 11:11

Habs rausgefunden ... ITOA
Autor: Martin (Gast)
Datum: 06.05.2008 23:23

Hallo,

@ Johannes
@ Wolfang

versuche seit lange mit ein LCD aber funktioniert leider nicht! in der
LCD4b_v1.2.rar Archiv gibt es 3 Dateien, .h .c und .txt (mit Beispiel),
meine Frage:
wenn ich alles so wie dort einpielen und kompilieren will wie soll ich
vorgehen?

ich habe folgendes mit "Notepad" gemacht:

1. ...c öffnen
2.   .h öffnen
3. ganz am ende von .c die Beispielprogram eingefügt also:

#include <avr/io.h>
#include "lcd4b.h"        //LCD-Routine einbinden

int main(void)
{
  DDRD |= 0b11111100;      //Pins 2-7 als Ausgänge
      lcd_linit();        //LCD Initialisieren
  lcd_clear();        //Display löschen
  lcd_out("Hallo Welt");      //Text ausgeben
  lcd_command(line2);      //2. Zeile
  lcd_out("!!!");        //Text ausgeben

  while(1);
}

4. Makefile generiert (für Atmega16 und ext. 147456 Quarz)
5. entsprechende Pins (RS, E und Port) angepasst
6. Kompiliert, ohne Fehler dann am Controller übertragen aber nichts !!!

was mache ich Falsch?
vielen Dank für die Hilfe

Gruß
Martin
Autor: Martin (Gast)
Datum: 07.05.2008 08:07

Hallo,

hat jemand eine idee für mich?
vielen Dank

Gruß
Martin

Antwort schreiben

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

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel





Hinweis: der Originalbeitrag ist mehr als 6 Monate alt.

webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net