Forum: Mikrocontroller und Digitale Elektronik SED1520 was denn nu?!


von Der kleine Niels (Gast)


Lesenswert?

Servus beisammen,

ich glaub mir platzt bald der Kragen. Ich hab mir vom Pollin zu 
lernzwecken dieses DG-12232 Grafik-LCD mit 2 SED1520 Bausteinchen 
gekauft, aber es will einfach nicht.
Problem: Ich bekomme nur manchmal eine korrekte Ausgabe. Jetzt wollte 
ich mal die ganzen Quick n' Dirty Codes aus dem Web verwerfen und mir 
selbst was ordentliches zambasteln... nunja ich verzweifle.

1)
Es scheitert schon am Reset. Zitat aus dem Datenblatt:
1
RES Input pin.
2
The SED1520 can be reset or initialized by setting RES to low level (if it
3
is interfaced with a 68 family MPU) or high level (if with an 80 family
4
MPU). This reset operation occurs when an edge of the RES signal is
5
sensed.  The level input selects the type of interface with the 68 or 80
6
family MPU:
7
High level:Interface with 68 family MPU
8
Low level:Interface with 80 family MPU
Ja was denn nu? High oder Low für 68er-Modus?
Bin ich so doof oder ist da ein Wiederspruch?

2)
Die Codes im Internet sind eigentlich alle angeblich für diesen 
68er-Modus (der mir nachwievor nicht wirklich viel sagt) geschrieben. 
Wenn ich das mit den Timingdiagrammen im Datenblatt vergleiche, dann 
finde ich allerdings, ändelt das immer mehr dem 80er-Modus.
Frage: kennt sich jemand mit diesem 68er- und 80er-Modus aus und will 
mich aufklären?

3)
Und falls jemand zufällig eine Anleitung parat hat welcher Pin wohin 
muss und wie er angesteuert wird, dann Bitte erlöst mich von meinem 
getappe im Dunklen.
Aktuell siehts so aus:
1
µC: ATMEGA8515L
2
   PORT   ->    LCD
3
 PA[0..7] -> DB[0..7]
4
 PD0      -> A0
5
 PD1      -> CS1
6
 PD2      -> CS2
7
 PD3      -> RES (oder /RES ?! Wiedersprüche zwischen DB und Beschriftung)
8
 PD4      -> /WR ( R/W )
9
 PD5      -> /RD (  E  )
10
 PD[6,7]  -> N/A
Code kann ich keinen mitschicken, da probier ich seit Stunden an 
jeglichen Signal-Polaritäten und -leitungen rum. Mal kommt ne ausgabe, 
mal nicht. Aber noch NIE kam zuverlässig was ich gesendet habe...
Meißtens sah die Ausgabe am Display recht zufällig aus und wanns mal 
gepasst hat, dann war spätestens der Resetbutton am STK500 der Killer 
nachdem es wieder nur mit 10%iger Wahrscheinlichkeit funktioniert hat.

Helft mir BITTE!

Und Danke schonmal fürs Lesen meines Romans, aber kürzer konnte ich mich 
gerade irgendwie nicht fassen.

von Grrrr (Gast)


Lesenswert?

Der kleine Niels schrieb:
> Ja was denn nu? High oder Low für 68er-Modus?
> Bin ich so doof oder ist da ein Wiederspruch?

Wahrscheinlich nur ein wenig zu genervt und müde.

Dieser Teil:
> The SED1520 can be reset or initialized by setting RES to low level (if it
> is interfaced with a 68 family MPU) or high level (if with an 80 family
> MPU). This reset operation occurs when an edge of the RES signal is
> sensed.

bezieht sich auf Reset.

Dieser Teil:
> The level input selects the type of interface with the 68 or 80
> family MPU:
> High level:Interface with 68 family MPU
> Low level:Interface with 80 family MPU

bezieht sich auf den Level Input (ddie Auswahl des Interfaces.

Danach gilt:

Interface       Level Input    Reset aktiv
68 family MPU   High           Low bzw. High-low-Flanke
80 family MPU   Low            High bzw. Low-High-Flanke

Zu den anderen Fragen kann ich leider nichts sagen.

von Grrrr (Gast)


Lesenswert?

Schlaf lieber ne Runde.

von Der kleine Niels (Gast)


Lesenswert?

>Schlaf lieber ne Runde.
Werd ich jetzt auch. Hab eigentlich so schnell um diese Zeit gar keine 
Antwort erwartet. Aber 1000-Dank.

von Der kleine Niels (Gast)


Lesenswert?

Also jetz hab ich das Display immerhin schon am laufen, verstehen tu ich 
trotzdem nichts. Kann mir vielleicht jemand erklären was es sich mit 
diesem 68er- und 80er-Modus auf sich hat? Das Datenblatt schweigt sich 
darüber ja bis auf 2 Timingtabellen aus. Und aus den Timingtabellen wird 
mir auch nicht viel klar.


Mein Vorgehen zum Ansteuern:
Verkabelung: s.o.
1
// ********************************************************************
2
// lcd_cs: 0: linke Hälfte, 1: rechte Hälfte, >1: beide
3
void lcd_command( uint8_t lcd_byte, uint8_t lcd_cs ) {
4
5
  _delay_us(100);         // Wartezeit, später hier das BUSY-Flag abfragen
6
  
7
  LCD_DATA = lcd_byte;    // Byte ausgeben
8
  
9
  if ( lcd_cs >= 2 )
10
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS2) | (1<<LCD_CS1) );  // A0, CS1, CS2 auf low
11
  else if ( lcd_cs == 1 )
12
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS2) );  // A0, CS2 auf low
13
  else
14
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS1) );  // A0, CS1 auf low
15
16
  __asm("NOP");
17
  __asm("NOP");
18
  
19
  LCD_COM |= (1<<LCD_CS2) | (1<<LCD_CS1);  // CS1, CS2 auf high
20
}
21
22
// ********************************************************************
23
// lcd_cs: 0: linke Hälfte, 1: rechte Hälfte, >1: beide
24
void lcd_data( uint8_t lcd_byte, uint8_t lcd_cs ) {
25
26
  _delay_us(100);         // Wartezeit, später hier das BUSY-Flag abfragen
27
  
28
  LCD_DATA = lcd_byte;    // Byte ausgeben
29
  
30
  LCD_COM |= (1<<LCD_A0); // A0 auf high
31
  if ( lcd_cs >= 2 )
32
    LCD_COM &= ~( (1<<LCD_CS2) | (1<<LCD_CS1) );  // CS1, CS2 auf low
33
  else if ( lcd_cs == 1 )
34
    LCD_COM &= ~(1<<LCD_CS2);    // CS2 auf low
35
  else
36
    LCD_COM &= ~(1<<LCD_CS1);    // CS1 auf low
37
38
  __asm("NOP");
39
  __asm("NOP");
40
41
  LCD_COM |= (1<<LCD_CS2) | (1<<LCD_CS1);  // CS1, CS2 auf high
42
} 
43
44
45
// ********************************************************************
46
void lcd_init(void) {
47
48
  LCD_DATA   = 0x00;          // Datenleitungen auf low
49
  LCD_DATA_DDR = 0xFF;        // Datenpins als Ausgang
50
  LCD_COM     = 0xE0;         // Pullups für unbelegte Steuerpins
51
  LCD_COM_DDR   = 0x1F;       // Steuerpins als Ausgang
52
  LCD_COM    |= (1<<LCD_RES) | (1<<LCD_CS1) | (1<<LCD_CS2);  // Reset, CS1, CS2 -> high
53
54
  _delay_us(1);               // kurz warten (Reset: low)
55
  LCD_COM   &= ~(1<<LCD_RES); // Umschalten auf 80er-Modus ( Reset->low ) und Reset
56
/*  _delay_us(1);             // kurz warten (Reset is low)
57
  LCD_COM   &= ~(1<<LCD_RES); // Umschalten auf 68er-Modus ( Reset->high ) und Reset
58
*/
59
  
60
  lcd_command(0xAF, 2);       // 0b 1010 1111 (beide Displayhälften an)
61
62
}

In Prosa:
E(/RD) und R/W(/WR) sind dauerhaft auf low. Im 68er-Modus wird E wohl 
nicht benötigt und R/W steht mit low auf schreiben. => Stimmt.
im 80er Modus sind /RD und /WR dauerhaft auf low => darf nicht 
funktionieren tuts aber. Warum?
Die CS-Leitungen der beiden SED1520 sind im idle auf high und werden als 
Übertragungsbefehl kurz auf low gezogen?!?! So steht das aber nirgends 
im DB?!

Kann und will mich jemand aufklären? wo ist der Hund begraben?

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.