PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M-Unit 2.0 und I2C Display Problem



JensB
03.08.2007, 23:42
Vielleicht habe ich nur was übersehen....
Also: Das I2C Display Modul ist korrekt mit der Unit verbunden. Die Jumper von A0-A2 sind alle gesetzt und so sollte der PCF die Adresse 64 haben. Dieses entspräche dem Byteport[8]. Um es auszutesten habe ich die Beispiele von der CC Support Seite benutzt, die allerdings von Haus aus schon fehlerhaft sind.(Wurde natürlich korrigiert). Das Display reagiert aber nicht. Beim Testen mit den IIC Routinen habe ich allerdings per Bitmanipulation auf das LCD schreiben können. Was ist da faul?
B++ ist für mich etwas neues, da ich mich mehr mit dem Propeller beschäftige, vielleicht habe ich auch nur was vergessen. Ich arbeite mit WB++. Importiert habe ich die ASCII TABLE und den Treiber für das LCD, sollte also laufen,oder?

Wem fällt was ein?

Gruß

Jens

JensB
05.08.2007, 23:06
OK, weil bis jetzt niemand gepostet hat (war ja auch Wochenende) vielleicht etwas mehr Infos.
Der Code ist der aus den Beispielen von der Seite von Stefan.


'------ I/O PORTS ---------
'--------------------------
'--- IIC INTERFACE -------
define SDA port[9]
define SCL port[10]
'--------------------------
'------ SYSTEM MEMORY -----
'--------------------------

Import "..\Lib\ASCII_TABLE.blib"
Import "..\Lib\IIC_LCD_DRIVE.blib"





'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'II PCF 8574 POERWEITERUNG FÜR LCD II
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
LCD.INIT
LCD.OFF
'---------- IICBUS INIT ------------------------
SDA=on
SCL=on
'----------------------------------------------
pause 2
LCD_INIT()

'----- WRITE CHARACTERS LINE 1 ---------------
LINE1(4)
LCD_WRITE(20h,U)
LCD_WRITE(20h,N)
LCD_WRITE(20h,I)
LCD_WRITE(20h,T)

LCD_WRITE(20h,BLANK)
LCD_WRITE(20h,M)
LCD_WRITE(20h,BLANK)
LCD_WRITE(20h,Z2)
LCD_WRITE(20h,DOT)
LCD_WRITE(20h,Z0)

#LOOP
goto LOOP
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

In der IIc_LCD_DRIVE.blib habe ich den byteport auf 8 gesetzt
, da alle drei Adressjumper am Modul gesetzt sind. Die Pullups sind ebenfalls aktiviert.
Der Code :
'--- PCF 8574 LCD DRIVER AT ADDR 5 / EXT BYTEPORT 8 ---
'-------------------------------------------------------
FUNCTION LCD_WRITE(BUF as byte,LCDDATA as byte)
define EXTPORT byteport[8]
define OUTBYTE as byte
'--------- ------WRITE HI NIBBLE ------------------------
OUTBYTE=BUF or (LCDDATA shr 4)
EXTPORT=OUTBYTE or 01000000b
EXTPORT=OUTBYTE and 10111111b
'--------------- WRITE LO NIBBLE ------------------------
OUTBYTE=BUF or (LCDDATA and 0Fh)
EXTPORT=OUTBYTE or 01000000b
EXTPORT=OUTBYTE and 10111111b
END FUNCTION
'-----------------------------------------------------
FUNCTION LCD_CLR()
LCD_WRITE(0,02h)
LCD_WRITE(0,01h)
pause 2
END FUNCTION
'----------------------------------------------------
FUNCTION LCD_INIT()
define EXTPORT byteport[8]
EXTPORT=0
LCD_WRITE(0,38h)'0=WRITE CMD
EXTPORT= 00000010b
EXTPORT= 01000010b
EXTPORT= 00000010b
LCD_WRITE(0,28h)
LCD_WRITE(0,0Ch)
LCD_CLR()
END FUNCTION
'----------------------------------------------------
FUNCTION LINE1(POS as byte)
LCD_WRITE(0,7Fh+POS)
END FUNCTION
'----------------------------------------------------
FUNCTION LINE2(POS as byte)
LCD_WRITE(0,BFh+POS)
END FUNCTION
Warum geht das ganze nicht?
Eine Frage anbei: Ich habe die Unit geschenkt bekommen und habe gelesen, daß es Updates des OS gibt, könnte das der Grund für ein NICHTfunktionieren der Unit sein?

MfG

Jens

Suggarman
06.08.2007, 14:00
Hallo,
Du könntest mal die Demo I2C_device_seek probieren um zu sehen, ob das Display erkannt wird. Sind Pullups am Bus? Zeigt das Display irgendeine Regung bei Anlegen der Versorgungsspannung?

mfg

Stefan

JensB
06.08.2007, 15:07
Hallo,
danke erstmal für die Antwort.
Ja, es sind Pullups am Bus, an SDA und SCL liegen jeweils 5V über 10K an.
Beim anlegen von Ub sieht man, daß das Display eingeschaltet ist, dabei ist die erste reihe etwas Kotrastreicher als die zweite.

Ich habe das Display allerdings mal über das IIC Objekt angesteuert (Adresse 64) und habe den letzten Port (LED Hintergrundleuchte) mal ein und ausschalten lassen. Das funzte einwandfrei.

Eine Grundlegende Frage zu B++: Anscheinend ist die Sprache modular aufgebaut, ähnlich wie beim Propeller, d.h. man kann Objekte in sein eigenes Projekt einbinden und nutzen. Kann es sein, daß ich hier etwas vergessen habe?

MfG

Jens

Suggarman
07.08.2007, 07:03
Der byteport ist 10 und nicht 8 !

mfg

Stefan

Dierk
07.08.2007, 09:01
Ich weiß nicht, ob bei dem I2C-Display mit gesetzten Jumper die Adressleitung auf high oder low gezogen wird, aber hier ist mal eine Tabelle einer Relaisplatine für die C-Control zur Übersicht, bei der aber mit gesetzten Jumper die Leitung auf low gezogen wird.

http://www.csslabs.de/ccontrol/project/PortTable.gif

Suggarman
07.08.2007, 14:38
So jetzt habe ich mir die Datenblätter nochmal genauer angesehen. Das Conrad-LCD-Modul schaltet per Jumper auf Masse. Wenn also alle 3 Jumper gesetzt sind, ergibt sich die genannte Adresse 64. Dies ist gemäß Programmbeispiel die Adresse 0, die wiederum dem Byteport 3 zugeordnet ist. Ich habe selber die Adapterplatine nachgebaut und das Beispielprogramm hat funktioniert.

mfg

Stefan

JensB
08.08.2007, 16:08
Jau, jetzt funzt es, habe es jetzt auch nach Conrad Datenblatt kapiert, da die Unit ja 2 Byteprts hat ist jeder weitere angeschlossene PCF ein weiterer Byteport. Ich bin davon ausgegangen, daß der BP 8 (Ports 57 -64) der Port meines Verlangens sei, aber so wies imDatenblatt steht ists echt verwirrend.

Danke für die Hilfe, ich denke jetzt komm ich klar.

Gruß

Jens