mikrocontroller.net

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


Autor: Der kleine Niels (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
RES Input pin.
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.  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
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:
µC: ATMEGA8515L
   PORT   ->    LCD
 PA[0..7] -> DB[0..7]
 PD0      -> A0
 PD1      -> CS1
 PD2      -> CS2
 PD3      -> RES (oder /RES ?! Wiedersprüche zwischen DB und Beschriftung)
 PD4      -> /WR ( R/W )
 PD5      -> /RD (  E  )
 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schlaf lieber ne Runde.

Autor: Der kleine Niels (Gast)
Datum:

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

Autor: Der kleine Niels (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

// ********************************************************************
// lcd_cs: 0: linke Hälfte, 1: rechte Hälfte, >1: beide
void lcd_command( uint8_t lcd_byte, uint8_t lcd_cs ) {

  _delay_us(100);         // Wartezeit, später hier das BUSY-Flag abfragen
  
  LCD_DATA = lcd_byte;    // Byte ausgeben
  
  if ( lcd_cs >= 2 )
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS2) | (1<<LCD_CS1) );  // A0, CS1, CS2 auf low
  else if ( lcd_cs == 1 )
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS2) );  // A0, CS2 auf low
  else
    LCD_COM &= ~( (1<<LCD_A0) | (1<<LCD_CS1) );  // A0, CS1 auf low

  __asm("NOP");
  __asm("NOP");
  
  LCD_COM |= (1<<LCD_CS2) | (1<<LCD_CS1);  // CS1, CS2 auf high
}

// ********************************************************************
// lcd_cs: 0: linke Hälfte, 1: rechte Hälfte, >1: beide
void lcd_data( uint8_t lcd_byte, uint8_t lcd_cs ) {

  _delay_us(100);         // Wartezeit, später hier das BUSY-Flag abfragen
  
  LCD_DATA = lcd_byte;    // Byte ausgeben
  
  LCD_COM |= (1<<LCD_A0); // A0 auf high
  if ( lcd_cs >= 2 )
    LCD_COM &= ~( (1<<LCD_CS2) | (1<<LCD_CS1) );  // CS1, CS2 auf low
  else if ( lcd_cs == 1 )
    LCD_COM &= ~(1<<LCD_CS2);    // CS2 auf low
  else
    LCD_COM &= ~(1<<LCD_CS1);    // CS1 auf low

  __asm("NOP");
  __asm("NOP");

  LCD_COM |= (1<<LCD_CS2) | (1<<LCD_CS1);  // CS1, CS2 auf high
} 


// ********************************************************************
void lcd_init(void) {

  LCD_DATA   = 0x00;          // Datenleitungen auf low
  LCD_DATA_DDR = 0xFF;        // Datenpins als Ausgang
  LCD_COM     = 0xE0;         // Pullups für unbelegte Steuerpins
  LCD_COM_DDR   = 0x1F;       // Steuerpins als Ausgang
  LCD_COM    |= (1<<LCD_RES) | (1<<LCD_CS1) | (1<<LCD_CS2);  // Reset, CS1, CS2 -> high

  _delay_us(1);               // kurz warten (Reset: low)
  LCD_COM   &= ~(1<<LCD_RES); // Umschalten auf 80er-Modus ( Reset->low ) und Reset
/*  _delay_us(1);             // kurz warten (Reset is low)
  LCD_COM   &= ~(1<<LCD_RES); // Umschalten auf 68er-Modus ( Reset->high ) und Reset
*/
  
  lcd_command(0xAF, 2);       // 0b 1010 1111 (beide Displayhälften an)

}

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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.