Hallo,
habe ein dickes Problem mit LCD-Anzeige "DOGM162M-A".
Auf meinem Mustergerät ist alles in Ordnung.
Inzwischen sind mehrere kleine Serien gebaut worden.
Von jeweils 10 Stück sind ca. drei in Ordnung.
Bei ca. vier treten sporadisch Fehler auf.
Beim Rest Funktioniert eigentlich nichts.
Hardwarefehler schließe ich nach intensivem Testen inzwischen aus.
Es liegt definitiv an der Software und zwar nicht am Code.
Sondern vermute stark am LCD-Treiber der sich mit was anderem beißt oder "so".
Eine andere Erklärung habe ich nicht mehr.
Habe verschieden Treiber weggelassen, der oder die Fehler ist immer noch da!
Habe Harry der mir die Initialisierung geschrieben hat den Code schon vor einer Weile gesendet.
Er findet nichts "unpassendes".
Im Anhang ist der Initialisierungs-Code.
Bitte um mal "drüberschauen".
Wer was entdeckt und für Tipps bin ich dankbar.
Danke
Gruß
Mathias
//--------------------------------------------------------------;
Device = mega328p, VCC=3.3;
{ $BOOTRST $03800} {Reset Jump to $03800}
Define_Fuses
Override_Fuses;
NoteBook = A;
COMport = USB;
LockBits0 = [];
FuseBits0 = [CKSEL0, CKSEL2, CKSEL3, SUT1]; // Oszillator=intern 8MHz
FuseBits1 = [BODLEVEL1]; // Reset bei 2,5-2,9V
FuseBits2 = [];
ProgMode = SPI;
ProgFuses = true;
ProgLock = false;
ProgFlash = true;
ProgEEprom = false;
Import SysTick, WatchDog, SerPort, SPIdriver1, ADCPort, LCDPort, SwitchPort_G, BeepPort;
From System Import LongWord, Float;
Define
ProcClock = 8000000; // Hertz
SysTick = 10; // msec
WatchDog = msec250; // presc = 4
StackSize = $0064, iData;
FrameSize = $0064, iData;
SerPort = 19200, Stop1; // Baud, StopBits|Parity
RxBuffer = 8, iData;
TxBuffer = 8, iData;
ADCchans = [7, 8], iData;
ADCpresc = 128;
LCDPort = LCDUserPort; // SPI_Soft
LCDrows = 2; // rows
LCDcolumns = 16; // columns per line
LCDtype = 66712;
LCDBargraph1 = LCDport;
SPIdriver1 = PortD, 5, 4, 1, 7; // SCK, MOSI, MISO, SS.
SPIorder1 = MSB;
SPIcPHA1 = 1;
SPIcPol1 = 1;
BeepPort = PortB, 1;
SwitchPort_G = [T_ModePlus, PinC, 3] [T_ModeMinus, PinC, 2] [T_WertPlus, PinC, 5] [T_WertMinus, PinC, 4], %00001111;
PolarityP_G = %00000000; // Polarity SwitchPort_G.
Debounce = 2; // debounce every 2 SysTicks.
//--------------------------------------------------------------;
Procedure pDOGM_Init; // 8 Bit / 3,3V
Begin
LCDCtrl($39); // 8-Bit, 2 Zeilen, InstructionSet 1
LCDCtrl($14); // BS: 1/5, 2 Zeilen
LCDCtrl($55); // Booster ein, Contrast C5 & C4 Bit0&1
LCDCtrl($6D); // Follower-Control
LCDCtrl($71); // Contrast C3, C2, C1 & C0 Bit 0-3
LCDCtrl($38); // 8-Bit, 2 Zeilen, InstructionSet 0
LCDCtrl($0C); // Display on, Cursor off
LCDCtrl($01); // Clear Display
LCDCtrl($06); // Cursor AutoIncrement
End pDOGM_Init;
Procedure pDOGM_Kontrast; //(Kontrast:Byte); // Kontrast-Werte 0-63
Var HC, LC :Byte;
Begin
MDelay(1);
HC:=(Kontrast and %00110000) Div 16; // Contrast C5 & C4
LC:=Kontrast and %00001111; // Contrast C3, C2, C1 & C0
LCDCtrl($29); // 8 Bit, 2 Zeilen, InstructionSet 01
LCDCtrl($70 or LC); // Contrast C3, C2, C1 & C0
LCDCtrl($5C or HC); // Booster ein, Contrast C5 & C4
LCDCtrl($28); // 8 Bit, 2 Zeilen, InstructionSet 00
End pDOGM_Kontrast;
Procedure pDOGM_CharSet(CNum,B0,B1,B2,B3,B4,B5,B6,B7:Byte);
Begin
LCDCtrl($40 or (CNum*8)); // CGRAM-Adress, ICON=Zeichen 0..7
LCDOut(Char(B0)); // Bitmuster schreiben Adresse
LCDOut(Char(B1)); // Bitmuster schreiben Adresse+1
LCDOut(Char(B2)); // Bitmuster schreiben Adresse+2
LCDOut(Char(B3)); // Bitmuster schreiben Adresse+3
LCDOut(Char(B4)); // Bitmuster schreiben Adresse+4
LCDOut(Char(B5)); // Bitmuster schreiben Adresse+5
LCDOut(Char(B6)); // Bitmuster schreiben Adresse+6
LCDOut(Char(B7)); // Bitmuster schreiben Adresse+7
End pDOGM_CharSet;
Procedure pDOGM_BargraphInitialisieren;
Begin
LCDbarInit_P;
LCDbarSet1 (0, 0, 16, 80);
End pDOGM_BargraphInitialisieren;
{ functions }
{$D-}
UserDevice LCDIOS(cmd:Byte;Data:Byte):Byte;
Begin
(* commands passed to user defined function "LCDIOS" *)
(* 0 init data = none result = none init user's hardware *)
(* 1 select display data = 0/1 result = none select display 1 or 2 *)
(* 2 write dataport data = byte result = none character output *)
(* 3 read dataport data = none result = byte character input *)
(* 4 write controlport data = byte result = none command to display *)
(* 5 read controlport data = none result = byte get display state *)
Case cmd of
0: // hardware init
|
1: // select display
|
2: // write to data port
Incl(LCD_RS); // Daten
uDelay(40);
SPIOutByte1(Data);
uDelay(50);
Excl(LCD_RS);
|
3: // read from dataport
|
4: // write to control port
Excl(LCD_RS); // Befehl
uDelay(40);
SPIOutByte1(Data);
|
5: // read from control port
|
EndCase;
Return(cmd);
End;
{$D+}
Procedure pLCD_DOGM162Initialisieren; // Start des LCDs.
Begin
excl (LCD_RS); // 0 = Befehl, 1 = Daten
LCDSetup;
pDOGM_Init;
pDOGM_Kontrast; //(Kontrast);
pDOGM_BargraphInitialisieren;
LCDon;
LCDCLR;
// DOGM_CharSet($04, $00, $00, $09, $16, $1C, $0C, $00, $00); { Öl }
// DOGM_CharSet($05, $00, $00, $0A, $1F, $11, $11, $1F, $00); { Batterie}
End pLCD_DOGM162Initialisieren;
//--------------------------------------------------------------;
habe ein dickes Problem mit LCD-Anzeige "DOGM162M-A".
Auf meinem Mustergerät ist alles in Ordnung.
Inzwischen sind mehrere kleine Serien gebaut worden.
Von jeweils 10 Stück sind ca. drei in Ordnung.
Bei ca. vier treten sporadisch Fehler auf.
Beim Rest Funktioniert eigentlich nichts.
Hardwarefehler schließe ich nach intensivem Testen inzwischen aus.
Es liegt definitiv an der Software und zwar nicht am Code.
Sondern vermute stark am LCD-Treiber der sich mit was anderem beißt oder "so".
Eine andere Erklärung habe ich nicht mehr.
Habe verschieden Treiber weggelassen, der oder die Fehler ist immer noch da!
Habe Harry der mir die Initialisierung geschrieben hat den Code schon vor einer Weile gesendet.
Er findet nichts "unpassendes".
Im Anhang ist der Initialisierungs-Code.
Bitte um mal "drüberschauen".
Wer was entdeckt und für Tipps bin ich dankbar.
Danke
Gruß
Mathias
Code
//--------------------------------------------------------------;
Device = mega328p, VCC=3.3;
{ $BOOTRST $03800} {Reset Jump to $03800}
Define_Fuses
Override_Fuses;
NoteBook = A;
COMport = USB;
LockBits0 = [];
FuseBits0 = [CKSEL0, CKSEL2, CKSEL3, SUT1]; // Oszillator=intern 8MHz
FuseBits1 = [BODLEVEL1]; // Reset bei 2,5-2,9V
FuseBits2 = [];
ProgMode = SPI;
ProgFuses = true;
ProgLock = false;
ProgFlash = true;
ProgEEprom = false;
Import SysTick, WatchDog, SerPort, SPIdriver1, ADCPort, LCDPort, SwitchPort_G, BeepPort;
From System Import LongWord, Float;
Define
ProcClock = 8000000; // Hertz
SysTick = 10; // msec
WatchDog = msec250; // presc = 4
StackSize = $0064, iData;
FrameSize = $0064, iData;
SerPort = 19200, Stop1; // Baud, StopBits|Parity
RxBuffer = 8, iData;
TxBuffer = 8, iData;
ADCchans = [7, 8], iData;
ADCpresc = 128;
LCDPort = LCDUserPort; // SPI_Soft
LCDrows = 2; // rows
LCDcolumns = 16; // columns per line
LCDtype = 66712;
LCDBargraph1 = LCDport;
SPIdriver1 = PortD, 5, 4, 1, 7; // SCK, MOSI, MISO, SS.
SPIorder1 = MSB;
SPIcPHA1 = 1;
SPIcPol1 = 1;
BeepPort = PortB, 1;
SwitchPort_G = [T_ModePlus, PinC, 3] [T_ModeMinus, PinC, 2] [T_WertPlus, PinC, 5] [T_WertMinus, PinC, 4], %00001111;
PolarityP_G = %00000000; // Polarity SwitchPort_G.
Debounce = 2; // debounce every 2 SysTicks.
//--------------------------------------------------------------;
Procedure pDOGM_Init; // 8 Bit / 3,3V
Begin
LCDCtrl($39); // 8-Bit, 2 Zeilen, InstructionSet 1
LCDCtrl($14); // BS: 1/5, 2 Zeilen
LCDCtrl($55); // Booster ein, Contrast C5 & C4 Bit0&1
LCDCtrl($6D); // Follower-Control
LCDCtrl($71); // Contrast C3, C2, C1 & C0 Bit 0-3
LCDCtrl($38); // 8-Bit, 2 Zeilen, InstructionSet 0
LCDCtrl($0C); // Display on, Cursor off
LCDCtrl($01); // Clear Display
LCDCtrl($06); // Cursor AutoIncrement
End pDOGM_Init;
Procedure pDOGM_Kontrast; //(Kontrast:Byte); // Kontrast-Werte 0-63
Var HC, LC :Byte;
Begin
MDelay(1);
HC:=(Kontrast and %00110000) Div 16; // Contrast C5 & C4
LC:=Kontrast and %00001111; // Contrast C3, C2, C1 & C0
LCDCtrl($29); // 8 Bit, 2 Zeilen, InstructionSet 01
LCDCtrl($70 or LC); // Contrast C3, C2, C1 & C0
LCDCtrl($5C or HC); // Booster ein, Contrast C5 & C4
LCDCtrl($28); // 8 Bit, 2 Zeilen, InstructionSet 00
End pDOGM_Kontrast;
Procedure pDOGM_CharSet(CNum,B0,B1,B2,B3,B4,B5,B6,B7:Byte);
Begin
LCDCtrl($40 or (CNum*8)); // CGRAM-Adress, ICON=Zeichen 0..7
LCDOut(Char(B0)); // Bitmuster schreiben Adresse
LCDOut(Char(B1)); // Bitmuster schreiben Adresse+1
LCDOut(Char(B2)); // Bitmuster schreiben Adresse+2
LCDOut(Char(B3)); // Bitmuster schreiben Adresse+3
LCDOut(Char(B4)); // Bitmuster schreiben Adresse+4
LCDOut(Char(B5)); // Bitmuster schreiben Adresse+5
LCDOut(Char(B6)); // Bitmuster schreiben Adresse+6
LCDOut(Char(B7)); // Bitmuster schreiben Adresse+7
End pDOGM_CharSet;
Procedure pDOGM_BargraphInitialisieren;
Begin
LCDbarInit_P;
LCDbarSet1 (0, 0, 16, 80);
End pDOGM_BargraphInitialisieren;
{ functions }
{$D-}
UserDevice LCDIOS(cmd:Byte;Data:Byte):Byte;
Begin
(* commands passed to user defined function "LCDIOS" *)
(* 0 init data = none result = none init user's hardware *)
(* 1 select display data = 0/1 result = none select display 1 or 2 *)
(* 2 write dataport data = byte result = none character output *)
(* 3 read dataport data = none result = byte character input *)
(* 4 write controlport data = byte result = none command to display *)
(* 5 read controlport data = none result = byte get display state *)
Case cmd of
0: // hardware init
|
1: // select display
|
2: // write to data port
Incl(LCD_RS); // Daten
uDelay(40);
SPIOutByte1(Data);
uDelay(50);
Excl(LCD_RS);
|
3: // read from dataport
|
4: // write to control port
Excl(LCD_RS); // Befehl
uDelay(40);
SPIOutByte1(Data);
|
5: // read from control port
|
EndCase;
Return(cmd);
End;
{$D+}
Procedure pLCD_DOGM162Initialisieren; // Start des LCDs.
Begin
excl (LCD_RS); // 0 = Befehl, 1 = Daten
LCDSetup;
pDOGM_Init;
pDOGM_Kontrast; //(Kontrast);
pDOGM_BargraphInitialisieren;
LCDon;
LCDCLR;
// DOGM_CharSet($04, $00, $00, $09, $16, $1C, $0C, $00, $00); { Öl }
// DOGM_CharSet($05, $00, $00, $0A, $1F, $11, $11, $1F, $00); { Batterie}
End pLCD_DOGM162Initialisieren;
//--------------------------------------------------------------;