closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

LCD-Anzeige "DOGM162M-A"



Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 189
Registered: 07 / 2003
Private message
Subject: LCD-Anzeige "DOGM162M-A"  -  Posted: 08.08.2013 - 19:43   -  
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;

//--------------------------------------------------------------;
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 09.08.2013 - 06:41   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 09.08.2013 - 06:56   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 1-times. Last edit: 09.08.2013 - 06:57 by Harry.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 189
Registered: 07 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 09.10.2017 - 08:35   -  
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
go down go up
Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 36
Posts: 148
Registered: 07 / 2013
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 10.10.2017 - 13:29   -  
versuche mal mit {$LCDNOINIT}
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 10.10.2017 - 16:14   -  
Hallo Mathias,

wie ist das LCD angeschlossen?

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 10.10.2017 - 16:30   -  
Sorry kann mit dem Tablet nicht editieren bzw. copy/paste will nicht.

Schau mal hier: topic.php?t=2620
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 189
Registered: 07 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 12.10.2017 - 03:48   -  
{$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).
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 12.10.2017 - 16:23   -  
Hallo Mathias,

ein Timingproblem gibts nur bei Clear Display und Return Home. Ich weiß jetzt nicht, ob du das verwendest. Da du den Port D noch für andere Dinge verwendest: Bist du sicher, daß dabei die Pins 4-7 nicht verändert werden?

Ist das die Schaltung die ich auch hab?

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
This post has been edited 3-times. Last edit: 12.10.2017 - 16:40 by Harry.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 189
Registered: 07 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: 13.10.2017 - 05:07   -  
Hi Harry,

wenn Clear Display verwendet wird, dann so:
Code
    LCDCLR;
    mDelay(2);    // 2 ms warten.

LCDHome wird nicht benutzt.

Ist was die Ansteuerung des LCD angeht die gleiche Schaltung.
Hast Du noch nen Gerät von damals, dann kannst Du's gerne probieren.

Sollten in die Steuerleitungen fürs LCD noch pull-up oder pull-down rein?

Wenn mir jemand zum Vergleichen seine Initialisierung zukommen lassen kann, das wäre super.
Vielleicht finde ich's dann.

Gruß
Mathias
This post has been edited 1-times. Last edit: 13.10.2017 - 05:08 by Mathias.
go down go up
Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 52
Posts: 1199
Registered: 03 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: Yesterday at 13:14   -  
Hallo Mathias,

ich versteh das jetzt nicht: Hab das Prog von damals compiliert, geflasht, läuft. Sind das andere Displays? Anderer Controller?

Gruss
Harry
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
Mathias offline
Benutzer
Avatar
Gender: n/a
Location: n/a  Stutensee
Age:
Posts: 189
Registered: 07 / 2003
Private message
Subject: Re: LCD-Anzeige "DOGM162M-A"  -  Posted: Today at 07:21   -  
Hallo Harry,

wenn du etwas Zeit hast, mal ab und zu einschalten.
Irgendwann hat das Display keinen Text.
Aber irgendwie kommt man dann auch nicht weiter.

Das ist auch drin:
Code

Begin
  MDelay(200);        // 0,2 sec. warten wegen Reset LCD.
  pInitPorts;


Hat keiner mehr dieses Display in Betrieb und kann mir seine Initialisierung zukommen lassen.

Danke

Gruß
Mathias
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 17.10.2017 - 09:45