Datum:
Hallo zusammen, Bin noch relativer Mikrocontroller-Neuling, und habe mich jetzt mit dem PIC18LF4520 beschäftigt. Soweit habe ich bis jetzt auch alles hinbekommen, meine Aufgabe ist es aber jetzt ein Batron LCD (BT96040AV1) per I2C anzusteuern. Die Pins für SDA und SCL wurden mit den entsprechenden Pins am µC verbunden und mit einem Pullup(2,2k) auf Versorgungsspannung gezogen, der Reset-Anschluss wurde ebenfalls verbunden, sowie natürlich Masse und Versorgung. Controller und Display werden beide an 3V Spannung betrieben. Programmiert wird das ganze in C (CCS C-Compiler). Problem ist nun dass sich einfach garnichts tut. Habe mich bei der Initialisierung bzw. dem Vorgehen an Referenzcode aus dem Inet gehalten, mir würde es schon reichen ein ACK vom Display zu kommen um dann selber weiterprobieren zu können. Verbindungen habe ich alle mehrfach geprüft, die Größe der Pullup-Widerstände habe ich auch schon variiert. Wäre sehr nett, wenn ihr mal einen Blick auf meine Code werfen könntet oder ein paar Tipps geben, was ich noch überprüfen könnte (mir würde auch ein Tipp reichen, wo ich mich weiter informieren kann). Vielen Dank schonmal für eure Hilfe main.h
#include <18F4520.h> #device ICD=TRUE #device adc=16 #FUSES NOWDT //No Watch Dog Timer #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode) |
main.c
#include <main.h> #define LCD_RST PIN_C2 #define LCD_SCL PIN_C3 #define LCD_SDA PIN_C4 #define LCD_ADDRESS_W 0x78 #define LCD_ADDRESS_R 0x79 int8 ack_status = 3; #use delay(clock=20000000) #use i2c(MASTER,FAST,SDA=LCD_SDA,SCL=LCD_SCL) //Initialisierungssequenz void init_io(){ output_low(LCD_RST); delay_ms(500); output_high(LCD_RST); } void main(){ init_io(); i2c_start(); ack_status = i2c_write(LCD_ADDRESS_W); i2c_stop(); } |
Datum:
push Habe die Hardware nochmal komplett neu aufgebaut, um einen Verdrahtungsfehler siche ausschließen zu können, Problem ist aber weiterhin das Selbe. Würde mich über jede Hilfe freuen. Gruß
Datum:
Bislang geht es bei dir ja nur um die Frage ob überhaupt eine Kommunikation zwischen Master und Slave statt findet (ACK Bit). Hierfür ist dein Code ausreichend und sollte (muss) auch funktionieren. Wenn es schon wie deinem Fall an dieser Hürde scheitert, bleibt dir nix anderes übrig als mit einem Oszilloskop die Kommunikation zu überprüfen.
Datum:
@highlow Okay, danke dir, habe ich jetzt so langsam fast schon befürchtet. Muss ich wohl schauen dass ich irgendwo ein Oszi auftreiben kann...
Datum:
Hallo zusammen, habe das ganze jetzt mit Hilfe des Bus Pirate getestetet (Ack ok) und anschließend nochmals mit dem PIC aufgebaut, die Kommunikation funktioniert. Soweit die gute Nachricht ;) Habe mich jetzt bei der Initialisierung an das Datenblatt und auch an einem anderen Thread orientiert. Bekomme zwar ACKs, aber leider keinerlei Anzeige; die eingestellte LCD Spannung (~13V) kann ich messen. Kann mir jemand sagen, ob sich in meinem Code ein Fehler eingetan hat? Habe ich vielleicht irgendwas übersehen? Vielen Dank schonmal, wie immer würde ich mich über jede hilfe freuen :) Gruß Nador
#include <main.h> #define LCD_RST PIN_B3 #define LCD_SCL PIN_C3 #define LCD_SDA PIN_C4 #define LCD_ADDRESS 0x7E int ack_status; #use delay(clock=20000000) #use i2c(MASTER,FAST,SDA=LCD_SDA,SCL=LCD_SCL) void command (unsigned int8 command) { i2c_write(0x80); // 0b10000000 i2c_write(command); } void setFunction (unsigned int8 page, unsigned int8 cmd) { command(0x20+page); // 0b00100000 page selector, power down management command(cmd); } void init_io() { output_low(LCD_RST); delay_ms(100); output_high(LCD_RST); } void main(){ init_io(); i2c_start(); ack_status = i2c_write(LCD_ADDRESS); setFunction(1,0x12); // Bias Ratio = 4 setFunction(0,0x05); // set VLCD setFunction(0,0x17); // Charge pump automatic setFunction(0,0x0C); // normal LCD mode setFunction(1,0x01); // checkerboard i2c_stop(); output_high(PIN_B0); delay_ms(10); output_low(PIN_B0); } |