Forum: Mikrocontroller und Digitale Elektronik EA DOG-M162 Curserposition jedes X0 mal an falscher Stelle?


von Basti M. (counterfeiter)


Lesenswert?

Hallo,

ich hab ein kleines Problem mit dem oben genannten LCD Display... es 
funktioniert erstmal alles... sogar die Curserposition... aber spradisch 
eben nicht... Ich betreibe das Display mit SPI (1MHZ) und erstmal mit 
20cm Flachbandkabel... obwohl ich dachte, es könnte zu Problemen kommen, 
war noch kein falsches Zeichen dabei... deswegen schließe ich auch aus, 
dass ein Übertragungsfehler bei der Curserposition entsteht... 
jedenfalls würde ich das sehr merkwürdig finden...
Außerdem kann man beobachten das die untere Zeile immer an die selben 
zwei Stellen des Displays falsch springt...
Manchmal ist es öfter, manchmal gar nicht... kann mir das nicht 
erklären...

Hab mit zusätzlichen Delayzeiten versucht, aber keine Besserung...

Ich hoffe es hatte schonmal jemand das selbe Problem... hier mal etwas 
Code...
1
        clear_home();
2
  fprintf(stderr, "Umin:     %5.2fV",(float)Spannung_Min*(*SU));
3
  set_cursor(40); //auf neue Zeile springen
4
  fprintf(stderr, "Imax:     %5.1fA",(float)Strom_Max*(*SI));

hier springt das Imax manchmal auf Umin oder auch auf Position 48...

hier die wichtigen funktionen:
1
void set_cursor (unsigned char pos)  // Cursor an Position setzen
2
  {
3
    CONTROLPORT &= ~_BV(CTRL_RS);
4
    SPDR = 128+pos;  
5
                
6
    _delay_ms(0.2);  
7
    ctoggle_RS ();
8
  }  
9
10
void clear_home (void)  // Display löschen, Cursor an Position home setzen
11
  {
12
    CONTROLPORT &= ~_BV(CTRL_RS);
13
    SPDR = 0b00000001;  
14
    _delay_ms(1.2);
15
    ctoggle_RS ();
16
  }


mfg basti

von Tino K. (blumengiesser)


Lesenswert?

poste doch mal deine initialisierung.

von Tino K. (blumengiesser)


Lesenswert?

ich habe deinen code nochmal gelesen. also dein display heißt DOG-M162, 
das bedeutet 16 zeichen / Zeile mit 2 Zeilen. Sprich du hast maximal 32 
Positionen. Du springst aber auf Pos 40, das ist dann wohl falsch, oder?

Ich mach das so:

#define CHARACTER_BUFFER_BASE_ADDRESS 128
#define CHARACTERS_PER_ROW 16

void set_cursor_DOGM163 (char row, char column)
{
    write_instruction_DOGM163 (CHARACTER_BUFFER_BASE_ADDRESS + row * 
CHARACTERS_PER_ROW + column);
}

und das funzt. Gib mal rückmeldung
Tino

von spess53 (Gast)


Lesenswert?

Hi

> set_cursor(40); //auf neue Zeile springen

Die 2.Zeile beginn auf 0x40 .

MfG Spess

von Tino K. (blumengiesser)


Lesenswert?

genau, 0x40 oder 64. in deiner funktion wird 40 zu 128 dazuaddiert, das 
ist dann aber A8 und das gibs net...

von Basti M. (counterfeiter)


Lesenswert?

ahh, ihr habt recht...

0x40 muss ich der Funktion übergeben...

Hatte keine Infos über die Position der nächsten Zeile im Datenblatt 
gefunden. Habs dann durch probieren herrausgefunden... oder eben auch 
nicht...
Aber schon blöd wenns dann zu 98% funktioniert und man nicht mehr dran 
glaubt das die Position evtl. doch falsch sein könnte...

Ich danke euch

mfg basti

von Counterfeiter (Gast)


Lesenswert?

Die 128 ist nur die 1 im msb die man angeben muss um zu sagen das man 
jetzt in den ddram schreibt... Also das passt soweit...

Funktioniert also nun alles bestens... Toller display mal sehen wie er 
mit den extremen temperaturen im kfz klar kommt....

von spess53 (Gast)


Lesenswert?

Hi

>Hatte keine Infos über die Position der nächsten Zeile im Datenblatt
>gefunden.

Steht aber im Datenblatt. Vom ST7036.

MfG Spess

von Tino K. (blumengiesser)


Lesenswert?

seite 19

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.