Forum: Mikrocontroller und Digitale Elektronik USB LCD basteln: Unterschied Daten/Steuerbefehle


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo allerseits,

ich bastle seit einigerzeit an meinem USB LCD rum - ziel ist es ein
normales Zeilendisplay über USB anzusteuern und noch einige
Zusatzfunktionen zu realisieren (per Software Beleuchtung, Kontrast,
Textspeicher und Tastenabfrage) Ich hab' bereits eine funktionierende
Platine (siehe Anhang) und und die einzelnen Software Module (PWM usw.)
funktionieren auch schon einigermaßen. Problem: woher weiß der MC
(Atmega 8 mit avrgcc programmiert) ob er gerade Textdaten empfängt, die
ans Display gehören oder Steuerbefehle?? Mein Lösungsansatz war, dass
einfach immer das Display vollgeschrieben wird und dann können Befehle
gesendet werden, die mit bestimmten Zeichen losgehen sonst wirds als
neuer Text interpretiert, aber das ist irgendwie eine komische Taktik -
gibts keine eleganteren Möglichkeiten??
In Datenblättern zu RS232 Displays konnte ich lesen, dass ein
Steuerbefehl einfach mit einem best. Zeichensatz anfängt, ansonsten
ist es als Text zu interpretieren - wie kann ich aber in C aus einem
seriellen Datenstring eine best. Zeichenfolge rausfiltern???

Freu mich auf eure Ideen und wünsch euch noch eine schöne
vorweihnachtliche Zeit!!
mfg

Christian

von Ratber (Gast)


Lesenswert?

Wenn es ein Standarddisplay ist dann verstehe ich nicht ganz wo da das
Pronblem sein soll ?

Ich gehe mal davon aus das du weißt wie du das USB-232 Modul ansteuern
must (Is ja mit den Originaltreibern nur ne Serielle über USB die auch
wie ne Serielle angesprochen werden kann).

Desweiteren "vermute" ich mal das du die LCD-Pinne per
Schieberegister ansteuerst (Mit dem Seriellen ausgang des USB-Moduls.)

So und wenn du noch weißt wie du ein "Normales" LCD am Parport
anzusteuern hast dann mußte eigentlich nur noch die Daten die eigenlich
an den Parport gehen seriell über die "Virtuelle Serielle" schicken
(ggf. noch felende Bits auffüllen).


Du must natürlich wissen wie ien LCD überhaupt angesprochen wird
(Schnittstelle).

Oder hab ich deine Frage falsch verstanden ?

von Achim (Gast)


Lesenswert?

@Ratber: Wenn ich Christian richig verstanden hab dann will er nicht nur
die Standartbefehle benutzen, die das LCD-Display bietet, sondern auch
noch die anderen Funktionen mit dem µC realisieren (z.B. PWM für
Kontrast und Hintergrundbeleuchtung)

@Christian: Bei RS485 benutzt mal keine 8 Bit zur Datenübertragung
sondern 9 Bit, wobei das zusätsliche Bit zur Unterscheidung zwischen
Daten- und Adressbytes dient. So könntest du das ja auch machen, nur
das bei dir das Bit zur Unterscheidung zwischen Daten und Befehlen
dient. Allerdings weiß ich nicht genau ob das der FT232 unterstützt, da
ich den noch nie benutzt habe.

von Volker Kattoll (Gast)


Lesenswert?

@Christian
Wenn ich dich richtig verstanden habe, machst du folgendes:
Ein USB-Datenstrom wird vom FT323 empfangen, an den Mega8
weitergegeben. Der Mega8 gibt die Daten an das Display.weiter.

Du musst für den Mega8 zwei unterschiedliche Betriebsarten
programmieren.
1. Betriebsart: Alle empfangenen Daten werden direkt zur Anzeige
gebracht.
2. Betriebsart: Alle Daten werden vom Mega8 intern verarbeitet und
gelangen nicht zur Anzeige.

Definiere ein Steuerwort zum umschalten zwischen den Betriebsarten.
Sofern der Mega8 dieses Steuerwort erkennt gibt er die nachfolgenden
Daten nicht mehr an das Display weiter und verarbeitet die Daten als
interne Steuerkommandos. (z.B. LCD-Helligkeit +/- ...)
Die internen Steuerkommandos kannst du beliebig definieren, da alle
Bytes nach dem Steruerkommando nicht zur Anzeige gelangen.

Wichtig:
Du musst festlegen, wann ein Steuerkommando abgeschlossen ist. Entweder
du legst eine feste Anzahl an Bytes fest (dieses Methode ist nicht so
flexibel) oder du definierst ein weiteres Steuerwort und schaltest den
Mega16 in den Anzeigemodus zurück schaltet.

Zur Wahl des Steuerwortes: Nutze entweder ein Zeichen, das nicht auf
dem Display dargestellt werden soll oder kann. Gibt es das Zeichen
nicht, so kannst du auch eine nicht vorkommende beliebige Zeichenkette
nutzen. (z.B. 3x "0" oder ähnliches).

PS: Ist nur ´ne Idee!

Gruss Volker

von Christian (Gast)


Lesenswert?

Hallo zusammen und gleich mal recht herzlichen Dank für eure
Antworten!!!
@ Ratber: Hab' mein Problem vielleicht nicht genau genug erläutert:
Software für die serielle schnittstellt und fürs LCD usw. hab' ich
alles schon - die Frage war, wie die ankommenden seriellen Datenstrings
Unterschieden werden können zwischen normalen Daten (die ans LCD
wandern solln) und Steuerdaten (für Displaykontrast usw.)

@ Achim und Volker: Danke für eure Lösungsansätze - find ich beide
toll!! Ob der FT232 9 bits auch übertragen weiß ich im Moment nicht -
schaus aber gleich mal nach....

Die Idee, dass mit einem Zeichen zu machen, welches eh nicht
dargestellt werden kann find ich fast noch toller(hört sich auf jeden
Fall simpler an)!!

Vielen Dank euch allen!!

Christian

von Werner Hoch (Gast)


Lesenswert?

Hallo Christian,

ich hab die Trennung von Daten und Steuerung mit in der Empfangsroutine
als state-machine gemacht.
Mein Terminal ist aber für den seriellen Port.

Ein ESC-Zeichen leitet den Steuerungscode ein, ein newline-Zeichen
beendet die ESC-Sequenz.

Mein Code sieht so aus:

static SIGNAL
(SIG_UART_RECV) {
  static uint8_t rs232_state= RS232_NORMAL;

  switch (rs232_state) {
  case RS232_ESC:
    if (UDR == 'D')
      rs232_state=RS232_D;
    else if (UDR == 'd')
      rs232_state=RS232_D_;
    break;
  case RS232_D:  /* set LED */
    if (UDR <= '8' && UDR >= '1')
      leds |= (uint8_t) 1 << (UDR-'1');
    rs232_state=RS232_CLEAREOL;
    break;
  case RS232_D_:  /* delete LED */
    if (UDR <= '8' && UDR >= '1')
      leds &= (uint8_t) ~ (1 << (UDR-'1'));
    rs232_state=RS232_CLEAREOL;
    break;
  case RS232_CLEAREOL:  /* clear all till end of line */
    if (UDR == '\n')
      rs232_state=RS232_NORMAL;
    break;
  case RS232_NORMAL:
    if (UDR == 27)   /* escape sequence starts here */
      rs232_state=RS232_ESC;
    else {            /* put the char to lcd */
      lcd_insert_char(UDR);
      lcd_invalidate = 1;
    }
    break;
  default:
    rs232_state=RS232_NORMAL;
  }
}

Hier ist die ganze Schaltung beschrieben:
http://www.my-stuff.onlinehome.de/avrterminal.html

mfg
werner

von Nik Bamert (Gast)


Lesenswert?

Hi zusammen!

ICh hab sowas schon mal gemacht, jedoch nicht mit Usb sondern mit
RS232. Dabei habe ich zwei bytes definiert (230,231) , welche ich vom
Zeichensatz her des Displays nicht brauche und auch die Steuerbefehle
nicht beeiflusst. Mein "protokoll" sah dabei so aus;

Das Display empfängt ganz normal Bytes und leitet diese ans Display
weiter. Jedoch bei 230 schaltet der uc das Display auf das
Steuerregister, bei 231 ins Datenregister. Somit kann man alle
erdenklichen Einstellungen machen, hat eigentlich ganz gut geklappt.
Ausser das es ein wenig langsam war, aber das liegt wahrscheinlich eher
daran, das ich einen nicht sehr effektiven Compiler und einen alten
Pic16f84 verwendet habe. :) Aber für 'normale' Anwendungen reichts
bei weitem.


Greetz Nik

von Ratber (Gast)


Lesenswert?

@christian.

Yo,dann mach es doch so das Generell alles in ein Frame gepackt wird
was in richtung MC und LCD geht.

Am Statusbyte wird eben festgemacht was fürs LCD bestimmt ist und was
für den MC.

Damit haste 100% Zugriff auf das LCD.
Natürlich gehts auch mit der Methode von Nik wenn Zeichen nicht genutzt
werden sollen.

Oooooder du betreibst das LCD im 4 Bit Modus Ich wüßte nicht das das zu
langsam sein soll.Ich betreibe meine LCD's über I2C im 4 Bit Modus und
kann dennoch einige Zig-Mal die Sekunde Updaten.)und belegst damit nur
7 bit.
Das 8. kann dann als Index dienen.

Wenn es nur um die Dimmbare Beleuchtung geht dann kann man auch gleich
das Bit fürn PWM Nutzen.

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.