LCD-Anzeige "DOGM162M-A"

  • 1
  • 2
  • 3
  • Page 1 of 3
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 307
Registered: 07 / 2003
Subject:

LCD-Anzeige "DOGM162M-A"

 · 
Posted: 08.08.2013 - 19:43  ·  #1
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



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;

//--------------------------------------------------------------;
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 09.08.2013 - 06:41  ·  #2
Hi Mathias,

DOG-M und Bargraph beisst sich. Bei der Initialisierung des Bargraphen werden die benutzerdefinierten Zeichen dafür ins LCD geschrieben. Dummerweise verdreht das beim DOG-M den Kontrast. Deswegen habe ich ja eine eigene Procedure für das setzen benutzerdefinierter Zeichen geschrieben (DOGM_CharSet). Leider kann man die Init-Routine des Bargraphen nicht dazu bringen diese zu benutzen. Du könntest mal versuchen nach der Initialisierung den Kontrast nochmal zu setzen.

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 09.08.2013 - 06:56  ·  #3
Mir fällt später immer noch was ein :D ...... hat du nen Schaltplan ? Wenn das alles nix bringt könntest du mir so eine nicht funktionierende Schaltung schicken ?

Gruss
Harry

PS: Rolf was ist hier los ? Es ist 07:26 Uhr
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 307
Registered: 07 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 09.10.2017 - 08:35  ·  #4
Hallo,
neues Projekt.
Wieder gleicher Fehler.
Kein Text auf dem DOGM162.
Erst nach x mal einschalten der Versorgung.
Kann mir jemand seine Initialisierungprozedur zukommen lassen?
Wäre nett.
Möchte vergleichen was anders ist.
Danke

Gruß
Mathias
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 10.10.2017 - 13:29  ·  #5
versuche mal mit {$LCDNOINIT}
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 10.10.2017 - 16:14  ·  #6
Hallo Mathias,

wie ist das LCD angeschlossen?

Gruss
Harry
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2078
Registered: 03 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 10.10.2017 - 16:30  ·  #7
Sorry kann mit dem Tablet nicht editieren bzw. copy/paste will nicht.

Schau mal hier: topic.php?t=2620
Mathias
Benutzer
Avatar
Gender: n/a
Location: Weingarten - Baden
Posts: 307
Registered: 07 / 2003
Subject:

Re: LCD-Anzeige "DOGM162M-A"

 · 
Posted: 12.10.2017 - 03:48  ·  #8
{$LCDNOINIT} ist drin.
@Harry. Den Code kenne ich von Dir. Fehlen da nicht Verzögerungszeiten zwischen manchen Instruktionen?

Habe mal alles drangehängt was mit LCD zu tun hat.
Auch den Schaltplan.
Ist bestimmt nur ne Kleinigkeit, aber das nervt...

Danke fürs drüberschauen.

Code

Define
  ProcClock      = 7372800;            // Hertz
  SysTick        = 1;                  // msec
  WatchDog       = msec250;            // presc = 4
  StackSize      = 50, iData;
  FrameSize      = 50, iData;
  LANport        = SerPort;            // SerPort, SerPort2
  LANctrl        = PortD, 2;           // RS485 driver direction
  LANbaud        = 9600;
  LANmode        = Slave;              // Master, Slave
  LANadr         = 8;                  // 8, 16
  LANframe       = 16, iData;          // 1..1024
  LANcheck       = ChkSum8;            // ChkSum8, ChkSum16, CRC16
  LCDPort        = LCDUserPort;        // SPI_Soft
  LCDrows        = 2;                  // rows
  LCDcolumns     = 16;                 // columns per line
  LCDtype        = 66712;
  SPIdriver1     = PortD, 5, 4, 1, 7;  // SCK, MOSI, MISO, SS
  SPIorder1      = MSB;
  SPIcPHA1       = 1;
  SPIcPol1       = 1;
  SPIdriver2     = PortB, 5, 4, 3, 2;  // SCK, MOSI, MISO, SS
  SPIorder2      = MSB;
  SPIcpol2       = 0;
  SPIcpha2       = 0;


Code

//--------------------------------------------------------------;
Procedure pDOGM_Init;                  // 8 Bit / 3,3V
Begin
    LCDCtrl($39);                           // 8-Bit, 2 Zeilen, InstructionSet, Instruction table 1
    uDelay_1(50);
    LCDCtrl($14);                           // BS: 1/5, 2 Zeilen
    uDelay_1(50);
    LCDCtrl($55);                           // Booster ein, Contrast C5 & C4  Bit0&1
    uDelay_1(50);
    LCDCtrl($6D);                           // Follower-Control
    mDelay(500);
//    LCDCtrl($71);                           // Contrast C3, C2, C1 & C0  Bit 0-3
    LCDCtrl($78);                           // Contrast C3, C2, C1 & C0  Bit 0-3       // Nach Initialisierungsanweisung 26.09.2017
    uDelay_1(50);
    LCDCtrl($38);                           // 8-Bit, 2 Zeilen, InstructionSet 0
    uDelay_1(50);
    LCDCtrl($0C);                           // Display on, Cursor off
    uDelay_1(50);
    LCDCtrl($01);                           // Clear Display
    mDelay(400);
    LCDCtrl($06);                           // Cursor AutoIncrement
    uDelay_1(50);
End pDOGM_Init;

Procedure pDOGM_Kontrast; //(Kontrast:Byte);    // Kontrast-Werte 0-63
  Var HC, LC  :Byte;
  Begin

 LCDKontrast:= 25;

    uDelay_1(50);
    HC:= (LCDkontrast and %00110000) Div 16;    // Contrast C5 & C4
    LC:= LCDkontrast and %00001111;             // Contrast C3, C2, C1 & C0
    LCDCtrl($29);                           // 8 Bit, 2 Zeilen, InstructionSet 01
    uDelay_1(50);
    LCDCtrl($70 or LC);                     // Contrast C3, C2, C1 & C0
    uDelay_1(50);
    LCDCtrl($5C or HC);                     // Booster ein, Contrast C5 & C4
    uDelay_1(50);
    LCDCtrl($28);                           // 8 Bit, 2 Zeilen, InstructionSet 00
    uDelay_1(50);
  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;

{ 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);
        uDelay(50);
        |
      5: // read from control port
        |
      EndCase;
    Return(cmd);
  End;
{$D+}

Procedure pLCD_DOGM162Initialisieren;  // Start des LCDs.
  Begin
    LCDSetup;
    pDOGM_Init;
    pDOGM_Kontrast; //(Kontrast);
    LCDCLR;
    mDelay(2);                        // 2 ms warten.
  End pLCD_DOGM162Initialisieren;
//--------------------------------------------------------------;


Code

//--------------------------------------------------------------;
{ functions }
Procedure pInitPorts;
Begin
  PortB:= %0000 0000;    // 1=high, 0=low
  DDRB:=  %0011 1111;    // 1=Ausgang, 0=Eingang
  PortC:= %0000 0000;    // 1=high, 0=low
  DDRC:=  %0001 1000;    // 1=Ausgang, 0=Eingang
  PortD:= %0000 0000;    // 1=high, 0=low
  DDRD:=  %1111 1110;    // 1=Ausgang, 0=Eingang
  ADCSRA:= %0000 1111;   // AD-Wandler Aus, AD-Wandlung Stop, Interrupt Freigabe, AD-Prescaler div 128 = 57,600kHz.
  DIDR0: = %0000 0111;   // DIDR0 – Digital Input Disable Register 0.
End pInitPorts;
//-------------------------------------------------------------------------------
You must be logged in or your permissions are to low to see this Attachment(s).
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   137   151 · Page-Gen-Time: 0.028303s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI