PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD über I²C an ATmega 32: Dringend Hilfe benötigt!!!



Herculesheld
14.10.2009, 17:09
Hi. Ich versuche ein 16*2 LC Display über den I²C Anschluss meines RN-controls zu betreiben. Der Aufbau erfolgt gemäß AN_118 von der MCS electronics Seite mit dem Porterweiterungsbaustein PCF8574P.Die Library ist auch in Bascom eingefügt. Zunächst einmal habe ich versucht das demoprogramm auf von der Seite ablaufen zu lassen. Leider tut sich nix. Das einzige was auf dem Display zu sehen ist, dass zuerst die erste und die Hälfte der zweiten Zeile dunkel werden und danach der Cursor (scheinbar) wahrlos auf dem Dislpay herumspringt.
Ich habe die Schaltung schon mehrmals neu aufgebaut um eventuelle Fehler auszuschließen.Sogar einmal auf dem Steckbrett. Schaltung über ein anderes Controllerboard betrieben. Display ist auch nicht defekt, da es funktioniert, wenn ich es normal mit 6 Leitungen vom Controller betreibe.
Ich werde wahnsinnig ](*,)
Brauche dringend Hilfe

Ratber
14.10.2009, 19:57
Ich gehe mal davon aus das du das Display vorher mal "normal" angeschlossen hast und es in Ordnung ist.
Dann bleiben eigentlich nur zwei Möglichkeiten.

Entweder Verdrahtungsfehler, Nicht abgeschlossener I2C Bus oder Software wie zb. fehlende Initialisierung bzw. zuwenig speicher für Umgebung.



An der Lib liegt es jedenfalls nicht, die Nutze ich seit einigen jahren.


Überprüf nochmal in Ruhe alles.

Herculesheld
14.10.2009, 20:09
verdrahtungsfehler ist auszuschließen, da ich die schlatung sehr oft^^über prüft und sogar komlett neu aufgebaut habe.
aber ich glaube mit deinem tipp komme ich der lösung schon etwas näher.
was bedeutet fehlende initialisierung? ich dachte die wird sozusagen automatisch vorgenommen wenn ich die .lib verwende?
was könnte ich an einem gegebenen speicherproblem machen?
lg vielen dank

021aet04
14.10.2009, 20:22
Es gibt normalerweise gibt es einen oder mehrere Befehle, mit dem man das LCD initialisiert. Was das für ein Befehl ist müsstest du in der Dokumentation nachlesen.

Herculesheld
14.10.2009, 20:41
laut Autor der lcd_i2c.lib genügt es folgendes zusäzlich am angang eines programmes zu schreiben:

$lib "Lcd_i2c.lib"
Const Pcf8574_lcd = &H40
Config Scl = Portd.6
Config Sda = Portd.7
Dim _lcd_e As Byte
_lcd_e = 128

ist natürlich angepasst auf atmega32.
das display zeigt nichts (bzw. nichts sinnvolles^^)

Ratber
14.10.2009, 20:48
Da fehlt noch was


Config I2cdelay = 9

...um den bustakt anzupassen
(Wert anpassen)



Config Lcd = 20 * 4
...um anzugeben welches Display man hat.
(Wer anpassen)


Dann noch CLS zum Initialisieren.


Danach kannst du deine ausgaben starten

Herculesheld
14.10.2009, 21:08
so hab ich hinzugefügt.ich hab i2cdelay variiert. --lcd funkioniert immer noch nicht :evil:
ich schreib mal meinen bascom code. vielleicht findet jemand den fehler:

$regfile = "m32def.dat"
$hwstack = 32
$framesize = 32
$swstack = 32
$crystal = 16000000
$baud = 9600


$lib "lcd_i2c.lib"
Config I2cdelay = 4
Const Pcf8574_lcd = &H40
Config Scl = Portc.0
Config Sda = Portc.1
Enable Interrupts
Dim _lcd_e As Byte
_lcd_e = 128
Config Lcd = 16 * 2
Waitms 700
Cls


Locate 1 , 1
Lcd "Hello world."


ich verwende übrigens ein Display von Conrad mit einem KS0066 Controller. liebe grüße

Ratber
14.10.2009, 21:15
Hmmm...seltsam.

ab und an gibt es LCDs die etwas länger für den Init brauchen.

Füge hinterm CLS noch ein Waitms 300 ein und schau obs klappt


Den i2cdelay sehe ich jetzt nicht aber ich denke den hast du schon drinne ja ?
einfach mal auf 15 (Je höher desto langsamer) stellen um sicher zu gehen.
Config Lcd mit drinn ?


Edit:

Hab grad erst gelesen welchen Controller dein display hat.
Bascom sollte mit dem klar kommen.

Ich hatte oben mal gefragt ob du das LCD "normal" getestet hast.
Hast du ?

Herculesheld
14.10.2009, 21:44
klappt leider immer noch nicht.i2c delay ist auch mit drin.config lcd auch.
ich hab auch schon gedacht das vielleicht das display oder der controller davon kaputt ist, da hab ichs "normal" gestestet; also normal 4 bit ansteuerung mit insgesamt 6 portleitungen. hat einwandfrei geklappt. ich versteh es mittlerweile auch nicht mehr.

Ratber
14.10.2009, 22:04
Wenn es "Normal" geht dann liegt es nicht am Display.

Bleiben also nur software oder ein Verdrahtungsfehler.

die Pullups am I2C sind drann ja ?

Herculesheld
14.10.2009, 22:36
da ich das rn-control nutze sind 10k pullups gegen 5V+ sozusagen serienmäßig. ich habs aber auch schon an einem eigenen controllerboard mit 4,7k pullups versucht.hat sich rein optisch, also bei dem was man sieht, nix verändert. Wenn ein Verdrahtungsfeher vorliegt, muss er schon in der Schaltskizze im rn-wiki sein.
http://www.rn-wissen.de/index.php/LCD-Modul_am_AVR (bei Ansteuerung über I²C schaun)
ich hab die Schaltung auf einer Platine aufgebaut und um Fehler beim löten auszuschließen, habe ich die ganze Schaltung aufm Steckbrett nochmal aufgebaut.tut sich nix.das gleiche funkioniert alles nicht.kontrastregelung funkioniert auch einwandfrei.

021aet04
15.10.2009, 09:06
Hast du wirklich den PCF8574 oder den PCF8574A? Sind A0 bis A2 auf GND? Miss einmal nach, vielleicht hast du ein Kontaktproblem. Du konntest eine normale Datenausgabe probieren. LCD abschließen und LEDs (mit Vorwiderstand) anschließen.
Der PCF8574 hat die Adresse 0x40 und der PCF8574A hat die Adresse 0x70, wenn A0-A2 auf GND ist.

Herculesheld
15.10.2009, 10:48
ich habe den PCF8574P. Es passiert ja auch was, also kann die addresse ja nicht falsch sein sonst würde sich ja nix tun.A0,A1,A2 sind an Masse angeschlossen.
eine andere Frage: da ich das Display im 4bit modus betreibe habe ich 4 anschlüsse am lcd frei. manche sagen die müssten auf masse gelegt werden und manche sagen sie müssten so bleiben.ich hab die anschlüsse frei gelassen. kann das etwas mit meinem problem zu tun haben?

021aet04
15.10.2009, 10:52
Versuche es auf Masse zu legen.

Herculesheld
15.10.2009, 11:04
habs grad ausprobiert. hab D0-D3 auf Masse gelergt. es hat sich nach wie vor nichts verändert. so langsam nehme ich an das mein display und die library nicht kompatibel sind. kann das sein? ich habe jetzt schon des öfteren gelesen, dass displays mit einem KS0066 controller nicht so leicht zu initialisieren sind.

Crazy Harry
15.10.2009, 11:28
Was ist das genau für ein Display ?

Was ich schon öfter gelesen habe:


the KS0066 is a Samsung controller which claims to be 44780 compatible
But as with all Samsung controllers they are not really so.
I don't have any displays with them so I can not do any tests. Maybe it is
the same problem as with most other Samsung types: the busy output is
very delayed so the driver gets false readings.

Herculesheld
15.10.2009, 11:38
Das Display ist von ANAG VISION die Bezeichnung lautet AV1624. Zu beziehen gibt es das teil bei conrad.
http://www2.produktinfo.conrad.com/datenblaetter/175000-199999/181651-da-01-en-LCD_MOD_STN_BLAU_NEG_LED_WEISS_16X2.pdf
hätte ich vorher gewusst das das nix taugt, hätte ich ein billiges von pollin genommen

Crazy Harry
15.10.2009, 11:42
Das hat nichts mit "nix taugen" zu tun. Ich weiß nicht in wieweit du in das Timing des Treibers eingreifen kannst .... evtl. hilft es den PCF8574 mit geringerer Geschwindigkeit anzusteuern (100kHz anstatt 400kHz I²C-Speed). Bei meinem Compiler stell ich nur als Controller den KS0066 ein und das Timing paßt :)

Herculesheld
15.10.2009, 11:49
wenn ich damit richtig liege, dass ich die geschwindigkeit mit i2cdelay variiere, habe ich das betreits getan.ich habe mich da in einem bereich von 1-15 bewegt. das problem ist ja das ich die fertige .lib benutze. das timing wird ja gewissermaßen von ihr vorgegeben.wenn ich mich nicht irre.
ich glaube bei meinem compiler kann man nichs einstellen.ich verwende den compiler der schon in bascom-avr drin steckt

021aet04
15.10.2009, 12:21
Das i2cdelay ist vermutlich nur eine Wartezeit. Das hat nichts mit dem Takt zutun. Laut meinem DB vom PCF ist der max. Takt 100kHz. Da du es auf einem Breadboard aufgebaut hast würde ich mit Leds testen, ob du die einzelnen Ports ansteuern kannst.

Herculesheld
15.10.2009, 12:31
gut.das mach ich. also einfach nur an alle ports P0-P7 des PCF8574P eine LED mit Vorwiderstand z.B. 240Ohm anklemmen. Soll ich dann das programm von dem LCD benutzen und schaun ob sich was an den led´s tut oder ein anderes programm schriben um die led´s einzeln anzusteuern (da wüsste ich nämlich nicht wie das geht^^)

021aet04
15.10.2009, 12:44
Wie die Datenübertragung unter Bascom funktioniert weiß ich nicht. Ich muss in C nur schreiben (für R8Ctiny)

starti2c(); //Übertragen starten
sendbytei2c (0x40); //Adresse des PCF8574 senden
sendbytei2c (0xFF); //Alle Ausgänge ein (Leds leuchten)
stopi2c(); //Übertragung stoppen

Herculesheld
15.10.2009, 12:51
ja ich denke da werde ich für bascom hinbekommen
danke
ich werds gleich probieren

Crazy Harry
15.10.2009, 13:17
Wie die Datenübertragung unter Bascom funktioniert weiß ich nicht. Ich muss in C nur schreiben (für R8Ctiny)

starti2c(); //Übertragen starten
sendbytei2c (0x40); //Adresse des PCF8574 senden
sendbytei2c (0xFF); //Alle Ausgänge ein (Leds leuchten)
stopi2c(); //Übertragung stoppen

Bei AVRCo geht das noch einfacher :)


I2COut($40,$FF);

021aet04
15.10.2009, 13:45
@Crazy Harry
Ich könnte mir auch eine Funktion schreiben, in der ich das so schreibe wie du es machst. Aber das hilft Herculesheld nicht wirklich, wenn du es so schreibst ohne Erklärung.

Herculesheld
15.10.2009, 13:50
ich hab grad im rn-wiki einen Artikel gefunden, wie man mit dem PCF8574 led´s ansteuert.brauch ich mir gar nicht so viel arbeit machen.
http://www.rn-wissen.de/index.php/Bascom_I2C_Master

Herculesheld
15.10.2009, 14:30
also ich habe jetzt das programm aus dem wiki verwendet um mit dem PCF8574 die led´s einzeln anzusteuern.(http://www.rn-wissen.de/index.php/Bascom_I2C_Master).hat funkioniert. ich kann die ports einzeln ohne probleme ansteuern.

021aet04
15.10.2009, 14:49
Ich glaube, dass es an der Initialisierung des LCDs liegt. Unterscheidet Bascom Groß und Kleinschreibung, mir ist aufgefallen, dass im Bsp im Artikelbereich so geschrieben wurde $lib "Lcd_i2c.lib". In deinem Bsp steht aber $lib "lcd_i2c.lib". C unterscheidet zw. Groß und Kleinschreibung. Du könntest auch nach der Initialisierung in der Lib suchen. Ich habe eine Initialisierung für 4Bit LCD hier.

Herculesheld
15.10.2009, 15:23
an groß oder kleinschreibung liegt es nicht hab ich eben ausprobiert. durch die .lib steige ich ehrlich gesagt nicht durch.wenn ich das richtig verstehe liegt das problem in der initialisierung?alle anderen fehlerquellen kann ich jetzt eigentlich auch ausschließen. kanst du die initialisierung posten?vielleicht bekomme ich das irgendwie hin die .lib für meine zwecke zu ändern.

021aet04
15.10.2009, 16:56
Ich schreibe es als Pseudocode, da du in Bascom programmierst.


warte_ms(15)
sende(0x28)
warte_ms(5)
sende(0x28)
warte_ms(1)
sende(0x28)
warte_ms(1)
sende(0x0C)
warte_ms(1)
sende(0x01)
warte_ms(5)


Hier habe ich auch etwas über Displays und deren Ansteuerung gefunden.
http://www.sprut.de/electronic/lcd/index.htm#2x16

mycroc
15.10.2009, 18:08
Ich hatte das Problem auch mal, ist schon eine weile her. Nach einiger zeit habe ich es aufgegeben mich mit dem LCD zu beschäftigen um mich im selben Programm anderer funktionen zu widmen. Nach dem das Programm die 4K grenze der Demo version erreicht hatte habe ich mir die vollversion gekauft und das LCD funktionierte ohne das ich etwas am code geändert habe.

Max Hinze
15.10.2009, 18:25
Hallo Herculesheld,


probier mal diesen code aus. Bei meinem Atmega 32 funktionier er perfekt



$regfile = "m32def.dat"
$crystal = 16000000

Config Scl = Portc.0
Config Sda = Portc.1

Const Pcf8574_lcd = &H40
$lib "Lcd_i2c.lib"
Dim _lcd_e As Byte
_lcd_e = 128
Waitms 200
Config Lcd = 16 * 2
Cls

Wait 1

Do

Locate 1 , 1 : Lcd "Hello World"

Loop
End


Gruß Max

Herculesheld
15.10.2009, 21:25
vielen dank 021aet04 für die internetseite.(sehr informativ, deshalb hilfreich) dort stand ja auch das der controller den mein lcd verwendet ein anderes timing hat als der standardcontroller HD44780 und deshalb nur eingeschräkt kompatibel ist und nicht zu 100%, wie der Hersteller sagt.
@max: danke für den code erstmal.leider hat er mein lcd immer noch nicht zum laufen gebracht.
mir ist aber eben noch was aufgefallen. wenn ich den controller anschalte und der contrast am display so eingestellt ist, dass die felder leicht dunkel sind, dann sieht man, dass erst alle dunkler sind und dann nur noch die erste zeile.(ich verwende das programm von max, bei dem in der ersten zeile etwas stehen sollte).wenn ich aber nun einen reset am controller durchführe, wird erst nur die erste zeile dunkler und dann die obere hälfte der zweiten zeile auch.und die bleibt dann so. vielleicht kann da jemand etwas mit anfangen.

guenter1604
15.10.2009, 21:44
Hallo Hercules,

letztes Jahr habe ich mal die Lib für den PCA9555D umgebaut. Auf meiner Internetseite habe ich ein kleines Beispielprogramm:

http://www.gerold-online.de/cms/uc-projekte/microcontroller/display-ueber-i2c-bus.html

Herculesheld
17.10.2009, 15:07
hi.
also ich hab mich jetzt mal (als als totaler assembler-neuling) versucht in die .libs von Mcs und von guenter1604 reinzudenken und etwas rumprobiert. jetzt habe ich denk ich auch einen kleinen teilerfolg erziehlen können. ich habe in die lcd_12c.lib einen wait befehl eingebaut, was zur folge hat, dass ich bei start eines programms einen blinkenden cursor auf dem display habe.leider wars das auch schon.mehr passiert dann nicht.egal welchen ablauf das programm hat. jetzt wo ich selbst weiter bin kann mir an dieser stelle jemand weiterhelfen?

guenter1604
18.10.2009, 13:07
Hallo hercules,
wenn du Fehler in der Verdrahtung und im Code ausschließen konntest, wirds wohl an der Displayansteuerung liegen. Da dein Display direkt am ATMega läuft, bleibt dir nichts anderes übrig, als die Datenblätter der Displaytreiber zu vergleichen und in der Lib den Code an der richtigen Stelle zu bremsen. Den blinkenden Cursor würde ich als erfolgreiche Initialisierung deuten! Glückwundsch.
Schau dir jetzt noch den Bereich [_CLS] und [_Write_lcd] an.
Füge einfach mal ein paar waits ein ;-)

Herculesheld
18.10.2009, 20:53
danke für den Tipp.
ich habe den wait- Befehl an das ende von [_write_lcd] gehängt.
mein display hängt gar nicht direkt am atmega sondern läuft über i2c mit hilfe des pcf8574p.
also im Prinzip sieht der entsprechende bereich in der .lib bei mir jetzt so aus:
...
_Write_lcd_nibble:
Cbr _temp1,&HF0 ; E1, E2, RW, RS low
*BASIC: waitms 5 ; der eingefügte wait- befehl

_Send_to_LCD:
push r26
push r27
ldi r25,3
...

die länge der wartezeit scheint jedoch keine rolle zu spielen. ich hab den wert verschieden variiert. der blinkende cursor ist zwar da aber sonst passiert nichts.
Der Bereich [_Cls] ist in der .lib ja gar nicht aufgeführt.welches ist bzw. sind denn die assembler befehle die dem entsprechen?
ich hab meine veränderungen in der "original library" von kent andersson von der mcs electronics seite durchgeführt.

guenter1604
18.10.2009, 21:43
Hallo hercules,

setze mal in deinem Basiccode:

_lcd_e = 128 auf

_lcd_e = 0

Günter

Herculesheld
19.10.2009, 00:10
hallo günter,
hat leider nicht geklappt.
ich weiß nicht mehr was ich machen soll.
lg

guenter1604
19.10.2009, 08:11
Hallo Hercules,
nimm dir die Datenblätter der beiden Chips vor und vergleiche die Init Routinen. Sende nacheinander per I2C (z.B. auf Tastendruck) die angegebenen Befehle und kontrolliere die Anzeige am Display. Ganz ohne die Highlevelbefehle, dann müsste der Fehler doch zu finden sein...

Herculesheld
19.10.2009, 12:32
hallo günter,
ich habe datenblätter von beiden chips vorliegen.
leider weiß ich nicht, wie ich die darin enthaltenen daten in meinem bascom-code verwenden muss. kenn mich damit leider noch nicht so gut aus. hab bisher nur motoren&sensoren mit meinem atmega angesteuert. das "projekt" mit dem display sollte eigentlich der einstieg etwas tiefer in die materie sein.

guenter1604
19.10.2009, 13:28
Wenns nur zum Einstieg sein soll, warum dann der ganze Aufwand?
Kauf die ein Display mit HD44780-Chip und es läuft!

Herculesheld
20.10.2009, 18:31
ja, das teil hat 20 euro gekostet und ich finde das ist zu viel um es einfach in die ecke zu schmeißen. leider kannte ich zum zeitpunkt des kaufs die internetseite pollin.de, wo man displays ab 1,50 euro bekommt, was zum "einstieg" ausgereicht hätte.
andererseits ist der lerneffekt bei den problemen, die jetzt bei mir aufgetreten sind größer, als wenn alles direkt geklappt hätte.
deshalb bin ich da so hartnäckig, das es endlich funkioniert.