Forum: Mikrocontroller und Digitale Elektronik PIC18 & Batron LCD


von Jul R. (nador)


Lesenswert?

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
1
#include <18F4520.h>
2
#device ICD=TRUE
3
#device adc=16
4
5
#FUSES NOWDT                   //No Watch Dog Timer
6
#FUSES WDT128                  //Watch Dog Timer uses 1:128 Postscale
7
#FUSES HS                      //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
8
#FUSES NOBROWNOUT              //No brownout reset
9
#FUSES NOLVP                   //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
10
#FUSES NOXINST                 //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

main.c
1
#include <main.h>
2
#define LCD_RST PIN_C2
3
#define LCD_SCL PIN_C3
4
#define LCD_SDA PIN_C4
5
#define LCD_ADDRESS_W 0x78
6
#define LCD_ADDRESS_R 0x79
7
int8 ack_status = 3;
8
9
#use delay(clock=20000000)
10
#use i2c(MASTER,FAST,SDA=LCD_SDA,SCL=LCD_SCL)
11
12
//Initialisierungssequenz
13
void init_io(){
14
      output_low(LCD_RST);   
15
      delay_ms(500);
16
      output_high(LCD_RST);   
17
}
18
19
20
void main(){
21
   init_io();
22
   i2c_start();
23
   ack_status =  i2c_write(LCD_ADDRESS_W);
24
   i2c_stop();     
25
}

von Jul R. (nador)


Lesenswert?

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ß

von Mick M. (highlow)


Lesenswert?

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.

von Jul R. (nador)


Lesenswert?

@highlow

Okay, danke dir, habe ich jetzt so langsam fast schon befürchtet.
Muss ich wohl schauen dass ich irgendwo ein Oszi auftreiben kann...

von Jul R. (nador)


Lesenswert?

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

1
#include <main.h>
2
#define LCD_RST PIN_B3
3
#define LCD_SCL PIN_C3
4
#define LCD_SDA PIN_C4
5
#define LCD_ADDRESS 0x7E
6
7
int ack_status;
8
#use delay(clock=20000000)
9
#use i2c(MASTER,FAST,SDA=LCD_SDA,SCL=LCD_SCL)
10
11
void command (unsigned int8 command) {
12
i2c_write(0x80);   // 0b10000000
13
i2c_write(command);
14
}
15
16
void setFunction (unsigned int8 page, unsigned int8 cmd) {
17
command(0x20+page); // 0b00100000 page selector, power down management
18
command(cmd);
19
}
20
21
void init_io() {
22
output_low(LCD_RST);   
23
delay_ms(100);
24
output_high(LCD_RST); 
25
}
26
27
void main(){
28
   init_io();
29
   i2c_start();
30
   ack_status =  i2c_write(LCD_ADDRESS);
31
   setFunction(1,0x12);      // Bias Ratio = 4
32
   setFunction(0,0x05);      // set VLCD
33
   setFunction(0,0x17);      // Charge pump automatic
34
   setFunction(0,0x0C);      // normal LCD mode
35
   setFunction(1,0x01);      // checkerboard
36
   i2c_stop(); 
37
     
38
   output_high(PIN_B0);   
39
   delay_ms(10);
40
   output_low(PIN_B0);      
41
}

von Uzunkaya (Gast)


Lesenswert?

Hallo
Ich habe Batron 4x40 LCD display wie kann ich benützen
Ich bin für jeder hilfe dankbar,

Beitrag #7296219 wurde vom Autor gelöscht.
von uff basse (Gast)


Lesenswert?

Uzunkaya schrieb:
> Ich bin für jeder hilfe dankbar,

Diese 40x4 Displays bestehen aus zwei unabhängigen Einheiten.

Wer suchet der findet:

https://forum.arduino.cc/t/info-on-how-to-use-40x4-lcd/537453

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
Noch kein Account? Hier anmelden.