Hallo Zusammen, Ich versuche seit Tagen vergebens (wenigstens) mal ein Ack von einem LC-Display zu bekommen. Bei dem Display handelt es sich um ein 3x12 I2C Display. http://www.lcd-module.de/pdf/doma/t123-i2c.pdf Als µC-Plattform benutze ich den eZ430-F2013. Code-Grundlage bildet die Applicationnote von TI zur Verwendung des USI-Moduls. http://focus.ti.com/general/docs/litabsmultiplefilelist.tsp?literatureNumber=slaa368a Ich habe schon erfolgreich einen i2c temperatursensor damit angesteuert. Funktioniert also grundsätzlich. Zu meinem Problem: Nach compilieren und flashen des angehängten Codes liefert das Display kein Ack. Heist in diesem Fall die LED blinkt ewig weiter. Zunächst habe ich vermutet, dass die 3,6V Highpegel des MSP nicht ausreichen um dem Display "high" zu signalisieren. Also Pegelwandler eingebaut (2x MOSFET, I2C Specification, S. 42). Der I2C pegel beträgt jetzt auf der Displayseite 4,08V. Nicht gerade 5V wie erwartet, aber die Pegelhürde sollte genommen sein. Risetime beträgt ~600ns. Sollte reichen oder? Ein Angeschlossener Logicanalyzer und auch mein Oszi bestätigen das richtige datenformat. Wo ist also mein Problem? Mir ist aufgefallen, dass die "Target Voltage"-Option in der IAR-Workbench keinerlei auswirkung auf meinen Controller hat. ich messe immer 3,97 V was bedenklich nahe am maximumrating ist. was kann daran schuld sein? Ich bin für jeden Tipp dankbar! VG Peter
Hallo, nach einigen Stunden Probieren und analysieren bin ich weiter gekommen. Ich bekomme ein ACK vom Display unter verwendung der im Datenblatt angegeben Adresse 0x74. ABER ich muss dafür in der I2C-Bibliothek von TI diese Zeile auskommentieren:
1 | rla.b R12 ; Slave address < 1 |
diese rotiert das Register mit der Slaveadresse einmal nach Links. Ich gehe davon aus, dass diese Operation durchaus Sinn macht, sonst wäre sie wohl kaum in der Bibliothek enthalten. Der niedrige Ausgangspegel vom Pegelwandler (4,08 statt 5V) kam durch den angeschlossenen Logicanalyser, der hat wohl sowas wie z-dioden an den eingängen... Kann mir jemand Licht ins Dunkle bringen was die Registerrotiererei angeht? Ich werde wohl kaum von vornherein so etwas wie:
1 | #define LCD_ADDR 0x74/2
|
schreiben müssen oder? Vielen Dank Gruß Peter
Hallo Peter, ohne jetzt das Display zu kennen kann ich folgendes sagen. Das LSB ist das R/W Bit. Vorher kommt die Adresse. somit ist die Rotation (*2 nicht /2!) richtig. Das kannst Du aber im Detail in der I2C Spec. nachlesen. Es kommt nun darauf an, wie genau die Bezeichnung 0x74 im Datenblatt zum Display zu verstehen ist. Nicht alle Hersteller haben hier richtige Bezeichungen im Datenblatt. Manche geben eine Lese und eine Scheibadresse an, manche nur die Basisasdresse, wobei man dann das Lese/Schreib Bit erst noch mit einrechnen muss. Gruss, avrGerd
Lass die Zeile
1 | rla.b R12 ; Slave address < 1 |
drin und setze lieber die Slave Adresse richtig.
1 | #define LCD_ADDR 0x3A
|
So sollte es jetzt funktionieren. Wie es Aussieht ist da ein PCF2103 - PCF2116 verbaut. Also Address-Group7 wie hier zu sehen: [[http://www.classic.nxp.com/acrobat_download2/selectionguides/SELGUIDE.PDF]] LG Steffen
hi, vielen Dank für die Antworten. Mit #define LCD_ADDR 0x74/2 wollte der späteren shift operation entgegenwirken. Ist natürlich unnötig, wenn ich die asm anweisung auskommentiere. Im LCD arbeitet ein PCF2116. Die Adresse des LCD habe ich aus dem Datenblatt. BTW das schlechtestes Datenblatt, dass ich jemals gesehen habe :D VG Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.