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
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 ?
@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.
@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
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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.