Forum: Mikrocontroller und Digitale Elektronik LCD EA DOG-M und Bascom


von avr (Gast)


Lesenswert?

Hat schomal jemand mal versucht die EA DOG-M LCD´s anzusteuern. So recht
will das nicht klappen. Normale LCD-Routinen scheinen da nicht zu
funktionieren

von Dog-M (Gast)


Lesenswert?

Ansteuerbeispiel würde mich auch interessieren. Es ist offenbar ein
neuer LCD Controller

von Rufus T. Firefly (Gast)


Lesenswert?

Ja, ein ST7036 - Datenblatt hier:
http://www.electronic-assembly.de/eng/pdf/zubehoer/st7036.pdf

Allerdings (Zitat aus Datenblatt)

  "Instruction compatible to ST7066U and KS0066U and HD44780"

Daher sollten normale Ansteuerungsroutinen funktionieren, aber
vielleicht steht ja irgendwo im Datenblatt was hilfreiches.

Vielleicht ist auch dieser Hinweis hilfreich:

  "Bitte beachten Sie, dass aufgrund der COG-Technik die
  Strombelastbarkeit der Ausgänge begrenzt ist. Es kann
  dadurch bei größerer Buslast zu Signalverschleifungen
  und unsauberen Pegeln kommen.
  Im Zweifelsfall sind zusätzliche Pull-Down Widerstände (8051)
  erforderlich, oder es müssen zusätzliche Waits/NOP's
  eingefügt werden."


Interessant ist übrigens der ST7036I - der hat 'ne I²C-Schnittstelle.
Das ist doch mal 'ne wirkliche Neuerung.

von avr (Gast)


Lesenswert?

Laut Display Beschreibung soll es aber SPI sein. Alles etwas merkwürdig.
So recht funktionieren tuts immer noch nicht im 4 Bit-Modus.

von Martin Kirschke (Gast)


Lesenswert?

Ja, ihr habt recht: es funzt nicht. Ich bekomme zwar einen
Text (2 Zeilen / 16 Zeichen) dargestellt aber die ersten 10 Zeichen
gehen verloren und nach dem 16ten gibts einen Umbruch - also
klappt auch ein Workaround nicht so recht. Irgendwie muss die
Cursor-Baseadresse eingestellt werden, da durch auto-increment
der LCD-Controller alles selber in der Hand hat. Merkwürdig,
eigentlich sollte durch ein Clear Disay automatisch die erste
darstellbare Position gesetzt werden. (Habe mich an die
Initialisierungsvorgaben aus dem Datenblatt gehalten (Seite 41)).

von Martin Kirschke (Gast)


Lesenswert?

Es funzt! Wenn nach der Beschreibung des LCD-Controller ST7036.pdf
Seite 42 initialisiert wird, dann sollten auch die Zeichen korrekt
sichtbar sein. Leider geht das Assembler-Beispiel auf Seite 42 über das
hinaus, was auf Seite 41 als Initialisierung aufgeführt wird.
Besonders wichtig ist das Timing für Clear Display (2 ms Delay) und
Return Home (2 ms Delay). Wenn da etwas schief geht gibts haessliche
Effekte.

von Stefan Siedler (Gast)


Lesenswert?

Hallo,
ich versuche das Display mit C zu betrieben, habt ihr eventuell einen
funktionierenden C-Code mit dem ich das mal ausprobieren könnte? Wenn
nicht würde ich auch gerne mal einen Blick auf den Assembler-Code
werfen, weil ich kurz davor bin das Teil aus dem Fenster zu schmeißen.

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo,

ich habe bereits einen eigenen Thraed eröffnet,

gibt es schon neuigkeiten, im bezug auf ansteuerung des DOGM in C ?

Gruß Toby

von Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

Also bei mir tut sich überhaupt nichts. Versuche das Display
auch in C anzusteuern. Kein Blinken, gar nichts.

Hab die I/Os und Enable Leitungen per Oszi herausgemessen.
Das scheint OK zu sein.

Das Busy Flag muss doch nicht ausgelesen werden, oder?
Ich kann doch genauso gut auch eine Zeit abwarten?

Verwende das Display im 4-Bit Mode.
Laut Datenblatt werden bei der Initialisierung der ersten vier Befehle
nur 4Bits übertragen. Bei den weiteren Befehlen ein ganzes
Byte (dabei die oberen 4Bits als Daten und die unteren 4 Bits als
don't care). Hab ich da irgendwo einen Denkfehler?

Hab zusätzliche Zeiten und NOPs eingefügt; ZWECKLOS !

Hoffe Ihr habt mehr Glück!
Wäre super wenn es hier ein paar Vorschläge in C geben würde :)

Grüße

Rainer

von Tobias Tetzlaff (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe das DOGM 163 am laufen.

Ich habe die Ulrich Radig lib umgeschrieben.

Könnt ja mal reischauen!
Aber bitte entschuldigt die Schreibweise im Main.
Ist halt nur der Anfang meines Projektes.

Ach, wie kann man eigentlich einen AD Wert umrechnen, und mit 2
Kommastellen ausgeben?

zB. Die Temperatur mit einer Kommastelle,
die Spannung mit 2 Kommastellen ?

Und dann habe ich da noch eine KTY13-5 drauf.
Wie kann ich damit die Temperatur berechnen?
Wie geht das mit einer nicht linearen Wiederstands Kurve,
und deren berechnung?

Das main.c sieht in etwa so aus :

#include <main.h>
#include <lcd.c>
#include <avr/signal.h>
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr\pgmspace.h>
#include <avr/iom128.h>

volatile char Software_Zaehler = 0;
volatile char AD_Kanal_Zaehler = 0;
volatile int FP_Chk = 0;
volatile int RC_Sply = 0;
volatile int ECU_Sply = 0;
volatile int AMB_Temp = 0;
volatile int EGT = 0;
volatile int Oil_Temp = 0;
volatile int Aux1_Emk = 0;
volatile int Anlg_Aux = 0;

volatile int FP_Chk_1 = 0;
volatile int RC_Sply_1 = 0;
volatile int ECU_Sply_1 = 0;
volatile int AMB_Temp_1 = 0;
volatile int EGT_1 = 0;
volatile int Oil_Temp_1 = 0;
volatile int Aux1_Emk_1 = 0;
volatile int Anlg_Aux_1 = 0;

/* Initialisierung */

void
ioinit (void)
{
/* Ein-/Ausgänge 1 Ausgang, 0 Eingang */

  //DDRA = 0xFF;    // Port Ausgang
  //PORTA = 0x00;    // Port alle Low
  //PORTA wird mit der lcd_init(LCD_DISP_ON); gesetzt

  DDRB = 0xFF;    // Port Ausgang
  PORTB = 0x0D;    // Port keine Pullup / High PB0-PB2-PB3

  DDRC = 0x00;    // Port Eingang
  PORTC = 0xFF;    // Port Pullups

  DDRD = 0x00;    // Port Eingang
  PORTD = 0xFF;    // Port Pullups

  DDRE = 0x00;    // Port Eingang
  PORTE = 0xFF;    // Port Pullup

  DDRF = 0x00;    // Port Eingang AD Wandler
  //PORTF = 0xFF;    // Port Pullup

  DDRG = 0x00;    // Port Eingang
  PORTG = 0x1F;    // Port Pullup


/* Timer1 MCU/1024 */
  TCCR1B = _BV (CS12) | _BV (CS00);

/* Timer1 Overflow */
  TIMSK = _BV (TOIE1);

}

void
adinit (void)
{
// ADEN enable, ADSC start, ADFR free running, ADSP2,1,0 MCU/128
ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);

}

//Hauptprogramm
int main (void)
{
  //Initzialisierung
  ioinit();  //Ports und Timer setzen
  adinit();  //AD Wandler setzen

  //Initzialisierung des LCD - Displays
  LCD_Init();

  // 1. Zeile 5x16 Dots, 2. Zeile 5x8 Dots
  Write_LCD(0x2E,0);  //Function set DH=1,N=1,Tabelle 1,0
  Write_LCD(0x18,0);  //Tabelle 1,0, UD=1

  LCD_Clear ();
  LCD_Print(0,4,"Irgendwas");
  LCD_Print(1,3,"und nochwas");

  //Schleife
  for (int a=0;a<30000;a++)
  {
  for (int b=0;b<10000;b++);
  }

  LCD_Clear ();

  sei ();

  //Hauptprogramm läuft ständig in einer schleife und macht nichts
  for(;;);
}

SIGNAL(SIG_OVERFLOW1)
{

  if(AD_Kanal_Zaehler > 4)
  {
    AD_Kanal_Zaehler = 0;
  }

  AD_Kanal_Zaehler ++;

  switch (AD_Kanal_Zaehler) //welcher AD Kanal soll gelesen werden
  {
   //case 1 :
    //ADMUX = 0x40;  //AD Kanal 0  FP_Chk
    //FP_Chk = 0;

  //break;
   case 1 :

    ADMUX = 0x41;  //AD Kanal 1  RC_SPLY
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
conversion"
    while(!(ADCSRA & (1<<ADIF)));   // auf Abschluss der Konvertierung
warten (ADIF-bit)
    RC_Sply = ADC;
    //ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
    RC_Sply_1 = RC_Sply;
    //RC_Sply /= 1.69;  // V errechnen

  break;
   case 2 :

    ADMUX = 0x42;  //AD Kanal 2  ECU_Sply
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
conversion"
    while(!(ADCSRA & (1<<ADIF)));   // auf Abschluss der Konvertierung
warten (ADIF-bit)
    ECU_Sply = ADC;
    //ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
    ECU_Sply_1 = ECU_Sply;
    //ECU_Sply /= 1.69;  // V errechnen

  break;
   case 3 :

    ADMUX = 0x43;  //AD Kanal 3  AMB_Temp
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
conversion"
    while(!(ADCSRA & (1<<ADIF)));   // auf Abschluss der Konvertierung
warten (ADIF-bit)
    AMB_Temp = ADC;
    //ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
    AMB_Temp_1 = AMB_Temp;
    //AMB_Temp /= 1.69;  // °C errechnen

  break;
  case 4 :

    ADMUX = 0x44;  //AD Kanal 4  EGT
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
conversion"
    while(!(ADCSRA & (1<<ADIF)));   // auf Abschluss der Konvertierung
warten (ADIF-bit)
    EGT = ADC;
    //ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
    EGT_1 = EGT;

  break;
   case 5 :

    ADMUX = 0x45;  //AD Kanal 5  Oil_Temp
    ADCSRA |= (1<<ADSC);            // eine Wandlung "single
conversion"
    while(!(ADCSRA & (1<<ADIF)));   // auf Abschluss der Konvertierung
warten (ADIF-bit)
    Oil_Temp = ADC;
    //ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
    Oil_Temp_1 = Oil_Temp;

  break;
   //case 7 :
    //ADMUX = 0x46;  //AD Kanal 6  Aux1_Emk
    //Aux1_Emk = 0;

  //break;
   //case 8 :
    //ADMUX = 0x47;  //AD Kanal 7  Anlg_Aux
    //Anlg_Aux = 0;

  //break;
  }

  // LCD Init 3 Zeilen 5x8 Dots
  Write_LCD(0x29,0);  //Function set DH=0,N=1,Tabelle 1,0

  LCD_Clear ();

  LCD_Print(0,0,"AD Wert:    %4i",ADC);
  LCD_Print(1,0,"AD Kanal:      %1i",AD_Kanal_Zaehler);
  //LCD_Print(2,0,"AD Wert: %5i",ADC);

  PORTB  |= (1 << PB0); // rote LED aus Bit setzen
  PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
  PORTB  |= (1 << PB3); // grüne LED aus Bit setzen

  switch (AD_Kanal_Zaehler) //welcher AD Kanal soll gelesen werden
  {
    //case 1 :
    //LCD_Print(2,0,"Fuel Pump Check");
      //PORTB  &= ~(1 << PB0); // rote LED an Bit löschen
      //PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      //PORTB  |= (1 << PB3); // grüne LED aus Bit setzen
  //break;
  case 1 :
    //LCD_Print(2,0,"RC Spannung");

    RC_Sply_1 /= 0.646;  // V errechnen
    LCD_Print(2,0,"RC U:     %3i mV",RC_Sply_1);
      PORTB  |= (1 << PB0); // rote LED aus Bit setzen
      PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      PORTB  &= ~(1 << PB3); // grüne LED an Bit löschen
  break;
  case 2 :
    //LCD_Print(2,0,"ECU Spannung");

    ECU_Sply_1 /= 0.361;  // V errechnen
    LCD_Print(2,0,"ECU U:   %4i mV",ECU_Sply_1);
      PORTB  |= (1 << PB0); // rote LED aus Bit setzen
      PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      PORTB  &= ~(1 << PB3); // grüne LED an Bit löschen
  break;
  case 3 :
    //LCD_Print(2,0,"AMB Temperatur"AMB_Temp);

    AMB_Temp_1 /= 1.477;  // °C errechnen
    LCD_Print(2,0,"AMB Temp:  %2i%cC",AMB_Temp_1,0xDF);  //
Wert(int),°(c 0xDF),C, temp_2,0xDF,C
      PORTB  |= (1 << PB0); // rote LED aus Bit setzen
      PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      PORTB  &= ~(1 << PB3); // grüne LED an Bit löschen
  break;
  case 4 :
    LCD_Print(2,0,"EGT");
      PORTB  |= (1 << PB0); // rote LED aus Bit setzen
      PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      PORTB  &= ~(1 << PB3); // grüne LED an Bit löschen
  break;
  case 5 :
    LCD_Print(2,0,"Oil Temperatur");
      PORTB  |= (1 << PB0); // rote LED aus Bit setzen
      PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      PORTB  &= ~(1 << PB3); // grüne LED an Bit löschen
  break;
  //case 7 :
    //LCD_Print(2,0,"AUX 1 EMK");
      //PORTB  &= ~(1 << PB0); // rote LED an Bit löschen
      //PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      //PORTB  |= (1 << PB3); // grüne LED aus Bit setzen
  //break;
  //case 8 :
    //LCD_Print(2,0,"Analog AUX");
      //PORTB  &= ~(1 << PB0); // rote LED an Bit löschen
      //PORTB  |= (1 << PB2); // gelbe LED aus Bit setzen
      //PORTB  |= (1 << PB3); // grüne LED aus Bit setzen
  //break;
  }

  //int temp_1 = 0;
  //int temp_2 = 0;

  //temp_1 = ADC;
  //temp_1 /= 1.69;

  //temp_2 = ADC;
  //temp_2 /= 17;

  //batt_1 = ADC/0.0635;
  //batt_1 = ADC/0.633;    // mV

  //batt_11 = ADC / 63;    // V ganze Zahl
  //batt_12 = ADC % 63;      // V Komma Stellen

  //batt_2 = ADC/0.633;    // mV

  //batt_21 = ADC / 63;    // V ganze Zahl
  //batt_22 = (ADC % 63)/10;    // V Komma Stellen

  //temp_1 = ADC % 62;
  //batt_2 = (batt_1 % 6333) / 100;    // V Komma Stellen


  //temp_1 = ADC ;

  // 3 Zeilen 5x8 Dots
  //Write_LCD(0x29,0);  //Function set DH=0,N=1,Tabelle 1,0

  //LCD_Print(0,0,"AD Wert: %5i",ADC);
  //LCD_Print(1,0,"Temp Wert: %3i",temp_1);
  //LCD_Print(2,0,"Temperatur: %2i C",temp_2);

  //LCD_Print(2,0,"Temperatur: %2i%cC",temp_2,0xDF);  // Wert(int),°(c
0xDF),C, temp_2,0xDF,C

  for (int a=0;a<6000;a++)
    {
    for (int b=0;b<2000;b++);
    }

}


Gruß Toby

von Robert Mayr (Gast)


Lesenswert?

Hallo Leute,

habe hier einmal meine Init-Routine in BASCOM-AVR gepostet. So ganz
glücklich bin ich aber mit dem Diaplay auch nicht.
Ich habe auch die serielle Funktion erfolgreich erprobt. Nachteilig ist
(wenn man in BASCOM programmiert) daß die schönen LCD Befehle nicht
funktionieren. Deshalb bin ich wieder zum 4 Bit Modus zurückgegangen.
Es funktionieren CLS und UPPERLINE sowie LOCATE. Mehr habe ich noch
nicht ausprobiert.

Ab und zu verrutscht der Text um ein Zeichen nach rechts - weiß jemand
warum?

Viele Grüße

Robert Mayr

'--------------------------------------------------------------------

'***************** Initialisiere LC-Display (16*3) ******************

'--------------------------------------------------------------------

Initlcd:

En = 0 : Rs = 0

For A = 1 To 3

   Portd = &B00110000                                       '&3

   Gosub Enbl

   Waitms 2

Next A

For A = 1 To 2

   Portd = &B00100000                                       '&2

   Gosub Enbl

   Waitms 1

Next A

'--------------------------------------------------------------------

Portd = &B10010000                                          '&9

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B00010000                                          '&1

Gosub Enbl

Waitms 1

Portd = &B11010000                                          '&D

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B01010000                                          '&5

Gosub Enbl

Waitms 1

Portd = &B00000000                                          '&0

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B01100000                                          '&6

Gosub Enbl

Waitms 1

Portd = &B11000000                                          '&C

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B01110000                                          '&7

Gosub Enbl

Waitms 1

Portd = &B11000000                                          '&C

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B00000000                                          '&0

Gosub Enbl

Waitms 1

Portd = &B11110000                                          '&F

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B00000000                                          '&0

Gosub Enbl

Waitms 1

Portd = &B00010000                                          '&1

Gosub Enbl

Waitms 1

'--------------------------------------------------------------------

Portd = &B00000000                                          '&0

Gosub Enbl

Waitms 1

Portd = &B01100000                                          '&6

Gosub Enbl

Waitms 1

Cursor Off Noblink                                          'hide
cursor

Return

'----------------- Initialisierung fertig ---------------------------

Enbl:

En = 1                                                      'mach EN
1

En = 0                                                      'und
gleich wieder 0

Return

von Holger Bruns (Gast)


Lesenswert?

Mein DOG-M 162 bekomme ich unter Bascom im 4bit modus und 5V einfach
nicht zum laufen. Das Display zeigt einfach nichts an. Alle möglichen
Inits durchprobiert - nichts. Im SPI Modus hatte ich manchmal ein paar
wirre zeichen, aber sonst nichts. Gibts evtl. schon was neues für
Bascom ?

@Robert Mayr:

Kannst Du mal den gesamten Code hier reinstellen ? Bzw. den Code wie Du
Dein DOG-M über SPI initialiert hast ? Ich dreh bald durch :-)

Danke Holger

von Holger Bruns (Gast)


Lesenswert?

Funktioniert doch perfekt :-)

$regfile = "m168def.dat"
'ATmega168
$crystal = 1000000                                          'Quarz: 1
MHz
Config Portc = Output
'DOG 162, 4bit, 5 Volt
'Portc.0 = D4
'Portc.1 = D5
'Portc.2 = D6
'Portc.3 = D7
'Portc.4 = E
'Portc.5 = RS

' ---------------------- LCD DOG162 Init  ---------------------
Dog:
 Portc = &B00000011 : Gosub Enbl : Waitms 2    ' dummy Funktion Set
 Portc = &B00000011 : Gosub Enbl : Waitms 2    ' dummy Funktion Set
 Portc = &B00000011 : Gosub Enbl : Waitms 2    ' dummy Funktion Set
 Portc = &B00000010 : Gosub Enbl : Waitms 1    ' dummy Funktion Set
 Portc = &B00000010 : Gosub Enbl : Waitms 1    ' Funktion Set 1
 Portc = &B00001001 : Gosub Enbl : Waitms 1    ' Funktion Set 2
 Portc = &B00000001 : Gosub Enbl : Waitms 1    ' Bias 1
 Portc = &B00001100 : Gosub Enbl : Waitms 1    ' Bias 2
 Portc = &H5 : Gosub Enbl : Waitms 1           'Power/Icon/Contrast 1
 Portc = &H2 : Gosub Enbl : Waitms 1           'Power/Icon/Contrast 2
 Portc = &H6 : Gosub Enbl : Waitms 1           ' Follower control 1
 Portc = &H9 : Gosub Enbl : Waitms 1           ' Follower control 2
 Portc = &H7 : Gosub Enbl : Waitms 1           ' Contrast Set 1
 Portc = &H4 : Gosub Enbl : Waitms 1           ' Contrast Set 2
 Portc = &B00000000 : Gosub Enbl : Waitms 1    ' Display On 1
 Portc = &B00001111 : Gosub Enbl : Waitms 1    ' Display On 2
 Portc = &B00000000 : Gosub Enbl : Waitms 1    ' Clear Display 1
 Portc = &B00000001 : Gosub Enbl : Waitms 2    ' Clear Display 2
 Portc = &B00000000 : Gosub Enbl : Waitms 1    ' Entry Mode Set 1
 Portc = &B00000110 : Gosub Enbl : Waitms 1    ' Entry Mode Set 2
 Portc = &B00000000
Return
Enbl:                                          ' Enable ein
 Set Portc.4
 Waitus 400                                    ' Enable aus
 Reset Portc.4
Return

von Holger Bruns (Gast)


Lesenswert?

Etwas kürzer:

$regfile = "m168def.dat"          'ATmega168
$crystal = 1000000                'Quarz: 1 MHz
Config Portc = Output

'DOG 162, 4bit, 5 Volt
'Portc.0 = D4
'Portc.1 = D5
'Portc.2 = D6
'Portc.3 = D7
'Portc.4 = E
'Portc.5 = RS

Dog:
 Restore Da
 For Wertx = 1 To 20
  Read Balken
  Portc = Balken : Waitms 2
  Set Portc.4
  Waitus 400
  Reset Portc.4
 Next Wertx
Return

Da:
Data &H3 , &H3 , &H3 , &H2 , &H2 , &H9 , &H1 , &HC , &H5 , &H2
Data &H6 , &H9 , &H7 , &H4 , &H0 , &HF , &H0 , &H1 , &H0 , &H6

von Robert Mayr (Gast)


Lesenswert?

An Holger,

also nachfolgend der Code zur seriellen Ansteuerung. Sorry, daß es
etwas gedauert hat. War längere Zeit unterwegs.

Grüße

Robert

'--------------------------------------------------------------------

'  Autor: Robert Mayr

'--------------------------------------------------------------------

$regfile = "m8def.dat"

$crystal = 1000000

'--------------------------------------------------------------------

'******* Konfiguration PortB 0,1,2 zur LC-Ausgabe mit DOGM162 *******

'--------------------------------------------------------------------

Ddrb = &B00000111                                           'Pin PB0
und PB1 und PB2 ist Ausgang (E+RS+CSB)

Portb = &B00000111                                          'PullUp
von PB0 und PB1 und PB2 aktivieren



Dim W As Word , Kanal As Byte , J As Byte

Dim Zaehler As Integer , Targ As String * 6 , S As Single

Dim Text As String * 16

Dim Ausgabe(16) As Byte At Text Overlay

Dim H As Single , A As Single , V As Bit

Dim X(3) As Word , I As Byte

'--------------------------------------------------------------------

'********* vor allem anderen, gebe was auf das Display

Gosub Lcinit

Gosub Intro
'Startbildschirm

End                                                         'end
program

Schiebe:

Reset Portb.2                                               'CSB auf
0

Shiftout Si , Clk , J , 1 , 8 , 10                          'schiebe 8
bits mit der steigenden Flanke und 10us Delay raus

Set Portb.2                                                 'CSB auf
1

Return

'--------------------------------------------------------------------

'******* Hier wird die erste Meldung aufs Display gezaubert *********

'--------------------------------------------------------------------

Intro:

'Cls                                                         'clear
the LCD display

'Cursor Off

Text = " TEXT TEXT TEXT "                                   'display
this at the top line

Gosub Textaus

'Lowerline                                                   'select
the lower line

Text = " TEXT TEXT TEXT "                                   'display
this at the lower line

Gosub Textaus

Text = "ser. Ansteuerung"                                   'display
this at the lower line

Gosub Textaus

Wait 2

Return

'--------------------------------------------------------------------

'********************** Textausgabe auf Disolay *********************

'--------------------------------------------------------------------

Textaus:

Set Portb.1                                                 'RS auf 1

For I = 1 To 16

   J = Ausgabe(i)

   Gosub Schiebe

Next I

Return

'--------------------------------------------------------------------

'********************** Initialisiere LC-Display ********************

'--------------------------------------------------------------------

Lcinit:

Set Portb.0                                                 'EN=1

Clk = 1                                                     'CLK=1

Csb = 1                                                     'CSB auf
1

Rs = 0                                                      'RS auf 0

Csb = 0                                                     'CSB auf
0

'Initialisiere LCD

J = &H39 : Gosub Schiebe

J = &H1D : Gosub Schiebe

J = &H50 : Gosub Schiebe

J = &H6C : Gosub Schiebe

J = &H7C : Gosub Schiebe

J = &H0F : Gosub Schiebe

J = &H01 : Gosub Schiebe

J = &H06 : Gosub Schiebe

Set Portb.2                                                 'CSB auf
1

Return

von Wolfram H. (hwd)


Lesenswert?

Bei mir läuft das Zweizeilen Display nun auch.
Nach mehreren Versuchen und Misserfolgen und vielen Neuprogrammierungen
ist dabei Code herausgekommen für:

DOGM162 (2 Zeilen)
- in C
- in AVR Assembler (8-Bit und 4-Bit)
- in PIC Assembler (8-Bit und 4-Bit)

Netterweise lag es gar nicht an der Software, aber gerade an der habe
ich lange gebastelt, was die vielen Konvertierungen zeigen.
Ein Steckkontakt einer billigen Buchsenleiste war wohl defekt. Naja,
solange es jetzt läuft.

von Wolfram H. (hwd)


Lesenswert?

eine AVR C Version für SPI ist jetzt ebenfalls vorhanden.
(Die erfordert übrigens einen echten Hardwarereset. Die 4 und 8 Bit
Modi jedoch nicht. Habe ich zuerst nicht bemerkt.)

von Rupert Glaser (Gast)


Lesenswert?

Hall,
ich möchte das DOGM162 im SPI mode und bei 3v3 betreiben. Mit den
Unterlagen komm ich nicht zurecht. Wer kann mit C code senden der das
Teil richtig initialisiert...
Was sind denn bei dem Teil die Fußangeln ??
Dank für euere Hilfe !

von Tobias Tetzlaff (Gast)


Lesenswert?

Hallo Wolfran,

könntest Du deinen Code zur Ansteuerung des DOGM mal posten?

Gruß Toby

von Tobias P. (hubertus)


Lesenswert?

wisst ihr denn die pinbelegung der dinger?
im datenblatt sind gerade mal 2 pins angegeben, aber die richtung, in
der man zählen soll steht nicht da. alles in allem ein schlechtes
datenblatt, wenn man da nicht die pinbelegung rauslesen kann.
mein display zeigt auch rein gar nichts an, obwohl ich es so
angeschlossen habe, wie es das datenblatt unter "Beispiele mit 8 Bit,
5 V" zeigt (oder ich denke zumindest, dass ich das display richtig
angeschlossen habe).

kann mir da jemand mal die pinnummern sagen? das wäre echt toll.

muss ich befürchten, dass ich das display geschrottet hab, wenn ich Vcc
und GND an den falschen pins angelegt habe?
und: von www.electrosofts.com habe ich ein programm, mit dem man
lc-displays über den rechner ansteuern kann. es funzt mit allen, nur
das dog-m lässt sich zu nichts bewegen. wenn mir da einer helfen könnt
wär das genial.

grüsse

von Wolfram Hildebrandt (Gast)


Lesenswert?

Die Pinbelegung steht sehr wohl im Datenblatt.
Auf der letzten Seite des Herstellerdatenblatts bei den Abmessungen
sind die Nummern eingetragen.

von Volker K. (dreamer)


Lesenswert?

Hallo,
achte bitte darauf, dass auch die übrigen Pin`s verschaltet sind.
Ich habe das 3 zeilige im SPI Modus in Betrieb.
Füge eventuell einige Wait`s in die Init ein.
Das Disp. braucht ca. 40-50 ms inittime.

Gruß Herbert

von Tobias P. (hubertus)


Lesenswert?

vielen dank für den tipp.

noch ne frage, etwas ist mir nicht ganz klar:
wenn ich das display im 4 Bit-modus betreibe, muss ich immer erst das
high nibble ausgeben, enable ein- und wieder ausschaten und dann das
low nibble ausgeben oder??
da bin ich mir nicht ganz sicher. ich habs leider noch nicht
ausprobieren können, weil ich das display nur im 8 Bit-modus am pc
anschliessen kann.

gruss

von Thomas (Gast)


Lesenswert?

Hat denn jemand mittlerweile nen Code für Assembler für dieses Display?

Wolfram könntest Du deinen Code eventuell mal posten?
Wäre sehr nett und hilfreich!

Vielen Dank schonmal dafür!
Gruß
Thomas

von Wolfram Hildebrandt (Gast)


Angehängte Dateien:

Lesenswert?

Habe ich schon in einem anderen Thread gepostet.
Hier ist er aber noch einmal.

von Michael (Gast)


Lesenswert?

Danke hatte ich bisher noch nicht gefunden.
Werds aber mal suchen und mir anschauen.
Ich melde mich dann wieder :-)

MfG Michael

von Norbert Schnitzler (Gast)


Lesenswert?

Hi,

hat jemand ein funktionierendes Script für Bascom und
SPI 5V mode. Der Oben gepostete Quellcode funktioniert bei mir nicht.

gruss

von Wolfram Hildebrandt (Gast)


Lesenswert?

Mein SPI Code sollte soweit aber laufen.
Bei SPI muss man einen echten Hardwarereset machen, d.h. nach jedem
Programmieren, einmal komplett die Spannung wegnehmen.
Wenn es auch ein 16char, zeiliges Display ist, würde ich prüfen, ob die
Hardware richtig angeschlossen ist.
Das Datenblatt erzählt hier und da Mist.
Das sind aber offensichtliche Dinge (die haben bei SPI den C/D-Pin
nicht beschaltet, dafür einen anderen, meine ich).

von Norbert Schnitzler (Gast)


Lesenswert?

Ja es ist ein 2*16

Bascom meckert z.B. bei fogenden Zeilen mit 114 Assignment Error.
Clk = 1
Csb = 1
Rs = 0
Csb = 0

könntest du deine Pinbelegung bekannt geben wie sie richtig ist, also
z.b. pin 26 auf portb.0?!
ich verzweifle an dem Teil.

von Michael (Gast)


Lesenswert?

Bin jetzt mittlerweile mal auf 8 bit umgestiegen um deinen Code zu
probieren aber das funktioniert leider auch nicht.

Keine Ahnung was ich falsch mache oder warum es eben nicht geht.
Weil ich hardwaremäßig alles schon zick mal kontrolliert habe und
einfach keinen Fehler finden kann...

Jemand noch ähnliche Probleme und im optimalfall noch ne Lösung dazu?
:-)
Wäre sehr dankbar dafür weil ich langsam echt am verzweifeln bin mit
diesem Display.

MfG
Michael

von Wolfram Hildebrandt (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist ein pdf für die 5V 8 Bit Ansteuerung für meinen AVR Assembler
8Bit 5V 16 Char Display Code.
Da kommt jetzt einfach an PORTD0 D0 vom Display usw.
PORTC0 = Display E
PORTC1 = Display RW
PORTC2 = Display RS

@ Michael:
Der 8 Bit Code ist der einfachste.
Bleib mal dabei, bis es läuft und wechsel nicht alle 5 Min. herum. Du
schreibst auch in zwei Beiträgen parallel, oder?
Wenn es mit mit der Pinbelegung von oben nicht funktioniert, reiss das
ganze Display ab, und mache einen neuen Schaltplan, den du hier
postest.
Dann noch mal alles von neuem aufbauen.

Wie sieht es mit dem AVR aus? Läuft der? Lass einen Pin mal einfach an
und ausschalten und messe, ob das funktioniert.

von Michael (Gast)


Lesenswert?

Leck mich am A**** es läuft :-)

Aber frag nich was los war....
Hab jetzt alles auseindandergebaut und neu zusammen gebaut und es
funzt.
Muss wohl irgendwo in der Beschaltung ein Fehler gewesen sein obwohl
ich alles durchgepipst hatte.

Naja wie gesagt wahrscheinlich vor lauter Bäumen den Wald nicht mehr
gesehen!

Vielen vielen Dank!

Oh mann das waren wieder ein paar graue Haare mehr^^

von Michael (Gast)


Lesenswert?

Und da bin ich nochmal :-)

Also wie gesagt das Display läuft mittlerweile einwandfrei und ich hab
jetzt mal bisschen damit rumgespielt.
Funzt alles...bei 1Mhz !

Jetzt wollte ich das Display für eine andere Anwendung nutzen bei
welcher ich den µC auf 4Mhz laufen lasse.

In der Intialisierung für das Display habe ich dann das timing geändert
und nops eingefügt aber es läuft nicht mehr.

Klar das es ein timing Problem ist^^ aber hab jetzt auch schon wieder
rum probiert und rum probiert und ich weiss nicht welche Stelle da
genau Ärger macht.

Weisst du wo ich besonders auf timing achten muss?
Oder besser noch...hast du deinen Code auch für 4 Mhz ;-)

Danke schonmal!

MfG
Michael

von Michael (Gast)


Lesenswert?

Ok läuft alles!
Vielen Dank nochmal!

MfG
Michael

von Norbert Schnitzler (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe es in Anlehnung an das Datenblatt vom ST7036 nocheinmal in
Bascom probiert, aber es läuft einfach nicht. Im 4 & 8 Bit-Mode habe
ich  das Display direkt auf gang gekriegt, aber mit SPI will es nicht.
Hat einer von euch eine Ahnung was ich falsch mache?!

von Thomas (Gast)


Lesenswert?

Hallo,
bin gerade auch am Verzfeifeln.
Betreibe das Display im einfachsten Modus. 8Bit
Leider gibt es kein einiges Zeichen aus.
Bin um jede Hilfe dankbar!!!
Meine Initialisierung lautet wie folgt:

#define LCD_Display_OFF_Cursor_OFF_Blinking_OFF     0x08
#define LCD_Display_ON_Cursor_OFF_Blinking_OFF      0x0C
#define LCD_Inc_Add_NO_Scroll                       0x06
#define LCD_Cursor_OFF                              0x08
#define LCD_Display_ON                              0x04
#define LCD_Clear_Display                           0x01
#define LCD_8Bit_2Line                              0x38
#define OSC_Frequency            0x14
#define Contrast            0x78
#define PowerICON            0x5E
#define FOLLOVER_CONTROL          0x6A
#define CLEAR_LCD            0x01




DIG_Out_Prt (4, 0, 255);   //D0-D7 == 1

DIG_Out_Line (4, 1, 0, 0);  //Adressbytes RS

DIG_Out_Line (4, 1, 1, 0);  //Adressbytes RW

DIG_Out_Line (4, 1, 2, 0);  //Enable LCD

Delay (0.005);


LCD_Send_Cmd(LCD_8Bit_2Line); //(1)     // Funtion SET

Delay (0.005);

LCD_Send_Cmd(LCD_8Bit_2Line); //(2)   // Funtion SET

Delay (0.005);

LCD_Send_Cmd(OSC_Frequency);    // Internal OSC Frequency

Delay (0.005);

LCD_Send_Cmd(Contrast);      // Contrast Set

Delay (0.005);

LCD_Send_Cmd(PowerICON);     // Power/ICON/Contrast control

Delay (0.005);

LCD_Send_Cmd(FOLLOVER_CONTROL);   // Follower Control

Delay (0.005);

LCD_Send_Cmd(LCD_Display_ON_Cursor_OFF_Blinking_OFF); // Display O N/OFF

Delay (0.005);

LCD_Send_Cmd(CLEAR_LCD);     // Clear Display

von Frank Z. (frankovic)


Lesenswert?

...aber versucht nicht, im SPI-Modus zu Lesen, das funktioniert nämlich 
nicht.

von bascom (Gast)


Lesenswert?

Config Lcd = 16 * 3 , Chipset = Dogm163v5

von bascom (Gast)


Lesenswert?

CONFIG LCD = LCDtype , CHIPSET=KS077 | Dogm163v5 | DOG163V3 | DOG162V5 | 
DOG162V3 [,CONTRAST=value]

von Tommy (Gast)


Lesenswert?

Hallo !

Bin am verzweifeln. Betreibe ein Dog 162 unter Bascom mit mega8.

Habe schon die ganzen Initialisierungsroutinen probiert, bekomme aber 
keine Anzeige aufs display. Habe zuerst versucht über i2c zu betreiben 
und bin  jetzt im 4 bit 5V Modus.

Ich sehe nicht mal bei der Initialisierung etwas. Da tut sich rein gar 
nix.

Kann mir von euch bitte jemand einen Bascom Code geben, mit dem ich 
initialisiere und anschließend einfach nur etwas aus display schreiben 
kann.

Bin mir nichtmal sicher, ob das Display nach den vielen Versuchen nicht 
schon kaputt ist.

Meine Ports:

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , 
Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5

Danke schonmal im Vorraus.

Gruß Tommy

von Tommy (Gast)


Lesenswert?

Hat sich erledigt !

Habs endlich geschafft !!!

Lag wohl an der Kontrasteinstellung !

Gruß Tommy

von Ralf H. (geins)


Lesenswert?

Hier ein funktionierendes BASCOM - Beispiel per SPI:
1
'--------------------------------------------------------------------
2
'  DOGM 162 LCD per SPI in BASCOM
3
'--------------------------------------------------------------------
4
$regfile = "m8def.dat"
5
$crystal = 1000000 '1Mhz
6
'$crystal = 8000000 'oder 8Mhz
7
'--------------------------------------------------------------------
8
Dim Lcd_ausgabe_text As String * 16
9
Dim Lcd_ausgabe_text_bitwise(16) As Byte At Lcd_ausgabe_text Overlay
10
Declare Sub Dogm_lowerline
11
Declare Sub Dogm_init
12
Declare Sub Dogm_write
13
Declare Sub Dogm_pushbyte(byval Pushbyte As Byte)
14
Byval Lcd_ascii As Byte , Byval Write_byte As Byte)
15
Declare Sub Dogm_clear
16
17
Ddrb = &B11111111 'Port B alles auf Ausgang
18
Portb = &B11111111 'Alle Pullups ran
19
Rs Alias Portb.1 'Verkabelung = Selbsterklärend...
20
Csb Alias Portb.2
21
Si Alias Portb.3
22
Clk Alias Portb.4
23
24
'--------------------------------------------------------------------
25
Dogm_init
26
Do
27
   Lcd_ausgabe_text = "Zeile 1 xxxxxxxx"
28
   Dogm_write
29
   Wait 1
30
   'Reset Rs = Steuerzeichen senden
31
   'Set RS = Text senden
32
   'Cursorposition: &H80 = Zeile 1, Position 1 / &HC0 = Zeile 2, Position 1
33
   Reset Rs : Dogm_pushbyte &HC0 + 5                        'Zeile 2, Position 5
34
   'Dogm_lowerline
35
   Lcd_ausgabe_text = "Zeile 2 xxxxxxxx"
36
   Dogm_write
37
   Wait 2
38
   Dogm_clear
39
   Wait 2
40
Loop
41
End                                                         'end program
42
43
'- Subs -------------------------------------------------------------------
44
Sub Dogm_clear
45
  Reset Rs                                                  'Command wird gesendet
46
  Dogm_pushbyte &H01                                        'Clear senden
47
  Waitms 2                                                  'Timeout abwarten
48
End Sub
49
50
Sub Dogm_lowerline
51
   Reset Rs                                                 'Command wird gesendet
52
   Dogm_pushbyte &HC0                                       ' Cursorposition setzen
53
End Sub
54
55
Sub Dogm_write
56
   Local Dogm_zaehler As Byte
57
   Set Rs                                                   'Text wird gesendet
58
   For Dogm_zaehler = 1 To 16
59
      Dogm_pushbyte Lcd_ausgabe_text_bitwise(dogm_zaehler)
60
   Next Dogm_zaehler
61
End Sub
62
63
Sub Dogm_pushbyte(byval Pushbyte As Byte)
64
   Reset Csb
65
   Shiftout Si , Clk , Pushbyte , 1 , 8 , 10
66
   Set Csb
67
End Sub
68
69
Sub Dogm_init
70
   Set Clk
71
   Set Csb
72
   Reset Rs
73
   Waitms 40
74
   Reset Csb
75
   Dogm_pushbyte &H38 : Waitus 30                           'function set
76
   Dogm_pushbyte &H39 : Waitus 30                           'function set
77
   Dogm_pushbyte &H1C : Waitus 30                           'BIAS
78
   Dogm_pushbyte &H53 : Waitus 30                           '3V-Booster aus, power control
79
   Dogm_pushbyte &H69 : Waitms 200                          'Follover-Control
80
   Dogm_pushbyte &H74 : Waitus 30                           'Contrast Set
81
   Dogm_pushbyte &H0C : Waitus 30                           'Display on,Cursor off
82
   'Dogm_pushbyte &H0F : Waitus 30                           'Display ein, Cursor ein, Cursor blinken
83
   Dogm_pushbyte &H01 : Waitms 2                            'Clear Display
84
   Dogm_pushbyte &H06 : Waitus 30                           'entry mode auto increment
85
   Set Csb
86
End Sub

Gruß, Ralf.

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.