Hallo Zusammen,
vielleicht etwas seltsam, daß ich mich wegen eines Displays an euch (Rolf ) wende, aber ich verstehs nicht.
Ich habe, um Displays (DOGM163) zu testen, eine uralte Platine (PCA9555 für I2CMultiPort) heraus gekramt und an diese einen Mega8 via I2C angeschlossen. Gleiche Konstellation hatte ich vor rund 10 Jahren genau so verwendet. Nun geht nichts mehr . Beim ersten LCDCtrl_M(LCD_m1,$39); stellt sich das Programm in den Wald. Im Programm befindet sich natürlich eine I2CStat-Abfrage und die bestätigt, daß der PCA9555 gefunden wird.
Ich verstehs nicht ...... TWI hab ich ebenfalls getestet: Gleiches Ergebnis.
Program DOGM163Test;
{ }
{ Version 1: 31.05.2020 DOGM163-Test via I2C; Hardware I2CTrans2 }
{ }
{ }
{ }
{ }
{ }
{$NOSHADOW}
{ $WG} // {global Warnings off
Device = mega8, VCC=5; // µC ATMega8, 5V
{ $BOOTRST %00C00} // Reset Jump to %00000000C00
Import SysTick, I2Cport, LCDmultiPort; // Import SysTick und TWI-Treibers
From System Import ; // braucht man hier nicht
Define
ProcClock = 8000000; // Frequenz in Hz
SysTick = 10; // ms
StackSize = $0100, iData; // Stack-Größe 256 Byte
FrameSize = $0100, iData; // Frame-Größe 256 Byte
I2Cport = PortC;
I2Cdat = 4;
I2Cclk = 5;
LCDmultiPort = I2C_Soft;
LCDrows_M = 4; { rows }
LCDcolumns_M = 16; { columns per line }
LCDtype_M = 66712;
Implementation
{$IDATA}
{------------------------------------------------------------------------------}
{ Type Declarations }
Type // braucht man hier nicht
{------------------------------------------------------------------------------}
{ Const Declarations }
Const // Konstanten
PCA : Byte = $20;
{------------------------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
Var // Variablen
LEDred[@PortC,0] : Bit; // LED rot true=on
Counter : Byte;
{------------------------------------------------------------------------------}
{ functions }
Procedure DOGM_Init;
Begin
LEDred:=true; // ***** hier folgend hängt er sich auf *****
LCDCtrl_M(LCD_m1,$39); // 8 Bit, 3 Zeilen, InstructionSet 01
LEDred:=false;
LCDCtrl_M(LCD_m1,$1D); // BIAS 1/4, 3 Zeilen
LCDCtrl_M(LCD_m1,$50); // Booster aus, Contrast C5 & C4
LCDCtrl_M(LCD_m1,$6C); // Follower-Control
LCDCtrl_M(LCD_m1,$7C); // Contrast C3, C2, C1 & C0
LCDCtrl_M(LCD_m1,$38); // 8 Bit, 3 Zeilen, InstructionSet 00
LCDCtrl_M(LCD_m1,$0C); // Display On, Cursor & Cursor Position Off
LCDCtrl_M(LCD_m1,$01); // Clear Display
LCDCtrl_M(LCD_m1,$06); // Cursor AutoIncrement
mDelay(1000);
LEDred:=false;
End DOGM_Init;
Procedure InitPorts;
Begin
DDRC:= %00100011; // DDR=DataDiRection 0=Eingang, 1=Ausgang
PortC:=%00000000; // x x SCK SDA x x GND LEDred
DDRD:= %00000000; // DDR=DataDiRection 0=Eingang, 1=Ausgang
PortD:=%00000000; //
End InitPorts;
Procedure SigRed(C:Byte);
Begin
For Counter:=0 to C do
LEDred:=true;
mDelay(25);
LEDred:=false;
mDelay(25);
EndFor;
End SigRed;
{------------------------------------------------------------------------------}
{ Main Program }
{$IDATA}
Begin
EnableInts;
InitPorts;
LEDred:=false; // LED aus
If I2CStat(PCA)=true // PCA9555 gefunden?
then
SigRed(9);
EndIf;
DOGM_Init; // Init DOGM
LCDCLR_M(LCD_m1);
LCDXY_M(LCD_m1,0,0);
Write(LCDOut_M,'Test 1234567890');
LCDXY_M(LCD_m1,0,1);
Write(LCDOut_M,'Test abcdefghij');
LCDXY_M(LCD_m1,0,2);
Write(LCDOut_M,'Test ABCDEFGHIJ');
Loop
EndLoop;
End DOGM163Test.
Gruss
Harry
[Edit] Kann man es einrichten, daß man 3 Zeilen definieren kann? Es ist nur 1, 2 und 4 möglich. Es gibt aber inzwischen mehrere Displays mit 3 Zeilen zu kaufen.
vielleicht etwas seltsam, daß ich mich wegen eines Displays an euch (Rolf ) wende, aber ich verstehs nicht.
Ich habe, um Displays (DOGM163) zu testen, eine uralte Platine (PCA9555 für I2CMultiPort) heraus gekramt und an diese einen Mega8 via I2C angeschlossen. Gleiche Konstellation hatte ich vor rund 10 Jahren genau so verwendet. Nun geht nichts mehr . Beim ersten LCDCtrl_M(LCD_m1,$39); stellt sich das Programm in den Wald. Im Programm befindet sich natürlich eine I2CStat-Abfrage und die bestätigt, daß der PCA9555 gefunden wird.
Ich verstehs nicht ...... TWI hab ich ebenfalls getestet: Gleiches Ergebnis.
Code
Program DOGM163Test;
{ }
{ Version 1: 31.05.2020 DOGM163-Test via I2C; Hardware I2CTrans2 }
{ }
{ }
{ }
{ }
{ }
{$NOSHADOW}
{ $WG} // {global Warnings off
Device = mega8, VCC=5; // µC ATMega8, 5V
{ $BOOTRST %00C00} // Reset Jump to %00000000C00
Import SysTick, I2Cport, LCDmultiPort; // Import SysTick und TWI-Treibers
From System Import ; // braucht man hier nicht
Define
ProcClock = 8000000; // Frequenz in Hz
SysTick = 10; // ms
StackSize = $0100, iData; // Stack-Größe 256 Byte
FrameSize = $0100, iData; // Frame-Größe 256 Byte
I2Cport = PortC;
I2Cdat = 4;
I2Cclk = 5;
LCDmultiPort = I2C_Soft;
LCDrows_M = 4; { rows }
LCDcolumns_M = 16; { columns per line }
LCDtype_M = 66712;
Implementation
{$IDATA}
{------------------------------------------------------------------------------}
{ Type Declarations }
Type // braucht man hier nicht
{------------------------------------------------------------------------------}
{ Const Declarations }
Const // Konstanten
PCA : Byte = $20;
{------------------------------------------------------------------------------}
{ Var Declarations }
{$IDATA}
Var // Variablen
LEDred[@PortC,0] : Bit; // LED rot true=on
Counter : Byte;
{------------------------------------------------------------------------------}
{ functions }
Procedure DOGM_Init;
Begin
LEDred:=true; // ***** hier folgend hängt er sich auf *****
LCDCtrl_M(LCD_m1,$39); // 8 Bit, 3 Zeilen, InstructionSet 01
LEDred:=false;
LCDCtrl_M(LCD_m1,$1D); // BIAS 1/4, 3 Zeilen
LCDCtrl_M(LCD_m1,$50); // Booster aus, Contrast C5 & C4
LCDCtrl_M(LCD_m1,$6C); // Follower-Control
LCDCtrl_M(LCD_m1,$7C); // Contrast C3, C2, C1 & C0
LCDCtrl_M(LCD_m1,$38); // 8 Bit, 3 Zeilen, InstructionSet 00
LCDCtrl_M(LCD_m1,$0C); // Display On, Cursor & Cursor Position Off
LCDCtrl_M(LCD_m1,$01); // Clear Display
LCDCtrl_M(LCD_m1,$06); // Cursor AutoIncrement
mDelay(1000);
LEDred:=false;
End DOGM_Init;
Procedure InitPorts;
Begin
DDRC:= %00100011; // DDR=DataDiRection 0=Eingang, 1=Ausgang
PortC:=%00000000; // x x SCK SDA x x GND LEDred
DDRD:= %00000000; // DDR=DataDiRection 0=Eingang, 1=Ausgang
PortD:=%00000000; //
End InitPorts;
Procedure SigRed(C:Byte);
Begin
For Counter:=0 to C do
LEDred:=true;
mDelay(25);
LEDred:=false;
mDelay(25);
EndFor;
End SigRed;
{------------------------------------------------------------------------------}
{ Main Program }
{$IDATA}
Begin
EnableInts;
InitPorts;
LEDred:=false; // LED aus
If I2CStat(PCA)=true // PCA9555 gefunden?
then
SigRed(9);
EndIf;
DOGM_Init; // Init DOGM
LCDCLR_M(LCD_m1);
LCDXY_M(LCD_m1,0,0);
Write(LCDOut_M,'Test 1234567890');
LCDXY_M(LCD_m1,0,1);
Write(LCDOut_M,'Test abcdefghij');
LCDXY_M(LCD_m1,0,2);
Write(LCDOut_M,'Test ABCDEFGHIJ');
Loop
EndLoop;
End DOGM163Test.
Gruss
Harry
[Edit] Kann man es einrichten, daß man 3 Zeilen definieren kann? Es ist nur 1, 2 und 4 möglich. Es gibt aber inzwischen mehrere Displays mit 3 Zeilen zu kaufen.