mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C8051F340 LCD-Problem


Autor: Chris_R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin zur Zeit dabei, ein Gerät, das früher mit dem 80C537 lief, auf 
einen C8051F340 umzustellen. Das in dem Gerät vorhandene LCD war beim 
80C537 über den Datenbus angeschlossen und befindet sich auf einer 
zusätzlichen Platine (mit eigener 5V-Versorgung). Beim C8051F340 muss 
ich es ja über einen Port ansteuern. Meine Konfiguration sieht momentan 
so aus:

Port1 Bit0 - Bit2 -> Steuersignale, Port4 -> Daten
Zwischen Display und µC befinden sich zwei 74HCT245 zur Pegelwandlung

Mein Problem ist nun, dass die Textausgabe auf dem Display nicht stabil 
läuft. Mal kommt der ganze Text, mal nur Bruchstücke oder gar nichts. 
Ich habe schon versucht, durch das Einfügen von NOPs die Pegel der 
Steuersignale zu verlängern, hat aber leider nichts genützt. Auch 
zusätzliche Pausen haben nichts gebracht. Nun bin ich natürlich am 
Rätseln, ob der Fehler in meiner Hardware liegt oder ob es ein 
Softwareproblem ist. Deshalb einpaar Fragen: Ist es bei dieser 
Konfiguration möglich das Busyflag abzufragen? Und falls nein, wie lang 
mach ich am besten die Pausen, so dass das LCD sowohl bei niedriger als 
auch bei hoher Taktfrequenz vernünftig arbeitet? Oder ist es am besten, 
ich lasse die Pegelwandler weg? Würde dann die Abfrage des Busyflags 
funktionieren?

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo steht, dass du es beim F340 über einen Port ansteuern musst? Der F340 
hat ein externes Memory-Interface, Kapitel 13 im Datenblatt lesen hilft.
Evtl. musst du für das Timing den Clock kurzzeitig reduzieren, weil die 
SiLabs MCUs ziemlich flott unterwegs sind, aber das geht ja on-the-fly, 
danach wieder auf gewünschte Geschwindigkeit schalten.

Du musst allein weiterrätseln, ob es die Hard- oder die Software ist, da 
du beides nicht postest :)
Zeig mal her, dann sehen wir weiter...

Pegelwandlung ist eigentlich nicht nötig, da die Ports 5V-Tolerant sind, 
wichtig ist halt, dass nicht aus Versehen der Port auf Push-Pull 
konfiguriert wird.
Daher würde m.E. ein Pull-Up an jeder Leitung nach 5V reichen, die Ports 
werden auf Open-Drain konfiguriert, das müsste gehen.

Falls noch Fragen sind, ich hab ein bisschen Erfahrung mit den SiLabs 
MCUs...

Ralf

Autor: Chris_R (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So hab jetzt mal den Schaltplan und das Testprogramm mitgeschickt. Im 
Testprogramm ist übrigens noch ein Fehler in der Funktion anzready(). Da 
müsste vor dem Auslesen des Port4 eigentlich noch die Umschaltung auf 
Inputs hin. Aber irgendwie krieg ich das nicht hin oder kann man die 
Ports nicht zwischen Input und Output umschalten?

Das mit dem externen Memory-Interface hab ich schon gewusst, nur 
verwendet das 2 Ports und das ist mir einer zuviel ;-)

Die Pegelwandler hab ich vorsorglich eingebaut, weil es ein 5V-Display 
ist und ich keine Infos darüber gefunden habe, ob der Contoller 3,3V als 
Highpegel erkennt, wenn das Display mit 5V versorgt wird.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die cpu haben oc ausgänge, das heißt, wenn du high ausgibst, dann
kannst du die Eingänge einlesen. Extern muß dann nur den Pegel auf 0
runterziehen.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Software kann ich mir mal bei Gelegenheit angucken, heut ist es mir 
zu spät dafür.

> Aber irgendwie krieg ich das nicht hin oder kann man die
> Ports nicht zwischen Input und Output umschalten?
Doch, natürlich. Wenn du eine Eins in den Port schreibst, ist er sowohl 
Eingang als auch Ausgang. Ausnahme hiervon ist bei SiLabs MCUs, wenn 
sich die Ports im Push-Pull-Mode befinden.

> Das mit dem externen Memory-Interface hab ich schon gewusst, nur
> verwendet das 2 Ports und das ist mir einer zuviel ;-)
Okay, da ich die Applikation nicht kenne, bzw. was noch angeschlossen 
ist, kann ich so erstmal nix dazu sagen.
Aber bzgl. Portverschwendung, was sollen denn bitte die 74HCT245 da 
drin? Die bringen ja gar nichts, schon gar nicht, wenn sie fest auf eine 
Richtung verdrahtet sind. Dienen die zur Pegelwandlung? Wenn ja, siehe 
unten.

> Die Pegelwandler hab ich vorsorglich eingebaut, weil es ein 5V-Display
> ist und ich keine Infos darüber gefunden habe, ob der Contoller 3,3V als
> Highpegel erkennt, wenn das Display mit 5V versorgt wird.
Daher ja mein Vorschlag, einen Pull-Up nach 5V an alle Leitungen zum 
Display, und alle betroffenen Portpins als Open-Drain schalten, somit 
generiert der Pull-Up die 5V.

Der Schaltplan ist hoffentlich noch in Arbeit, oder? zwinker
Nein, ernsthaft, er ist mir etwas unübersichtlich, woher kommen die 5V? 
Von der VG-Leiste oder von USB? Dann stimmt die Beschaltung des internen 
Reglers vom Controller glaub ich nicht ganz.

Was soll der Widerstand in der Leitung zu VBUS? Und der 100k nach GND an 
USB_5V?

Ralf

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

solange der Daten-245 nicht in der Richtung umgeschaltet wird, funkt die 
Busy-Abfrage nicht. Dazu kann das RW-signal genutzt werden.
Mit welchem Takt arbeitet die CPU? Interne 24,5MHz ?
Viele LCDs haben eine CS-Clockpuls bei 500..1000ns. Bei 24,5MHz und 
1TaktCore dauert das NOP grade mal 41ns "lang"...
Die Saftware sieht auf den erten Blick ok. aus. Count bis 400 könnte 
allerdings etwas kurz als Pause sein. Bei 8Bit-Ansteuerung eventuell 
ausreichend.
Worüber erfolgt die Programmierung des F340?

mfg
Pieter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pieter wrote:
> Mit welchem Takt arbeitet die CPU? Interne 24,5MHz ?
> Viele LCDs haben eine CS-Clockpuls bei 500..1000ns. Bei 24,5MHz und
> 1TaktCore dauert das NOP grade mal 41ns "lang"...

Stimmt, die 2 NOPs sind viel zu kurz.
Bau Dir ne Delayfunktion 1µs und rufe diese auf.
Bzw. wenn der Compiler ne Delayfunktion hat, nimm natürlich diese.
Und für die anderen Delays (40µs usw.) rufst Du Delay_1us in einer 
Schleife entsprechend oft auf.

Hier mal ein sauberes LCD-Beispiel mit Delays (im 4-Bit Modus):

http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip


Peter

Autor: Chris_R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erstmal ein herzliches Dankeschön an alle für die bisherigen Hinweise.

@Peter und Pieter
Hab's schon mit Pausenschleifen probiert gehabt, hat aber leider nichts 
gebracht. Da ging dann teilweise gar nichts mehr. So langsam hab ich den 
Verdacht, dass das an der Zusatzschaltung liegt, mit der das Display 
früher an den Datenbus angekoppelt war. Die müsste sich eigentlich 
brücken lassen. Mal sehen, was dann passiert.

@Pieter
Laut Datenblatt kann man den C8051F340 intern mit max. 12Mhz und min. 
1,5Mhz laufen lassen. Die Programmierung erfolgt über einen speziellen 
USB-Adapter (SiLabs-Teil!), der am 10pol. Wannenstecker angeschlossen 
wird.

@Ralf
Bei der Platine handelt es sich um ein Muster und sowas ist ja, solange 
man sich in der Testphase befindet, ständig in Arbeit. Nicht wahr? :-))

Dass der Schaltplan verwirrend wirkt, versteh ich. Deshalb mal einpaar 
Hintergrund-Infos:
Die Platine ist Teil eines Schulungssystem für Mikrocontroller. Das 
ganze System besteht aus einer Basisplatine, auf der der µC sitzt, und 
mehreren Erweiterungskarten. Die Kommunikation zw. Basisplatine und 
Erweiterungen erfolgt über die VG-Leiste. Auch die Spannungsversorgung 
läuft über die VG-Leiste. Da bisher ein 80C537 eingesetzt wurde, ist 
natürlich alles auf diesen µC abgestimmt. Nun soll dieser µC durch den 
C8051F340 ersetzt werden. Da ich vorher noch nie mit diesem 
Mikrocontroller zu tun hatte und es auch nicht viel dazu im Internet 
gibt, hab ich mich bei der Entwicklung der Schaltung zum einen an den 
Schaltplan des dazu angebotenen Demoboards und zum anderen an 
Schaltungen aus anderen Projekten/Demoboards gehalten.
Diese Vorgehensweise ist sicherlich sehr laienhaft. Wenn man aber kein 
Hardwareexperte ist und sich zudem nur selten mit sowas beschäftigen 
muss, dann ist sie sehr effektiv. Und mein Ziel hab ich auf diese Art 
und Weise bis jetzt immer erreicht :-)

Hab jetzt aber noch ne Frage:
Bei den Erweiterungen ist ne Schalterplatine dabei. Die liefert je nach 
Schalterstellung entweder High oder Low. Sie war bisher direkt mit nem 
Port verbunden. Geht das bei diesem µC genauso oder brauch ich noch 
irgendwelche Pullups, weil ich den Port ja auf "open-drain" stellen 
muss, um ihn als Eingang nutzen zu können?

Autor: Pieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
moin moin,

@Chris,

der C8051Fxxx liegt in einer ganz anderen Klasse als der 80C537. 
Eventuell wäre der Einsatz eines z.B. AT89C51ED2 einfacher.
Hauptunterschied ist doch das der C8051Fxxx eine 1 TaktCore hat und 
damit bei gleichem Takt 12mal schneller ist. Für eine Schulversion kann 
mir das Teil einfach zu viel. Wer will einem Fragenden die ganzen 
speziellen Funktionen erklären, allein das Datenblatt hat über 250 
Seiten..ohne Erklärungen oder Demos.

Die 1,5 bis 12MHz beziehen sich auf USB.


mfg
Pieter

PS:Derzeit warte ich auf Platinen, dann muss der C8051F365 dran glauben.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig, wie Pieter schon sagte, die 1,5/12MHz sind für USB, der Core 
selbst kann mit bis zu 48MHz laufen (durch einen internen Multiplizierer 
des 12MHz Taktes).
Wegen der Tasterplatine, dort brauchst du die Ports nicht auf Open-Drain 
schalten, das ist nur für Ausgänge. Zieht die Tasterplatine wirklich 
auch nach VCC? In dem Fall würde ich auf VCC verzichten, und nur nach 
GND ziehen lassen. Ports als Eingänge mit internem Pull-Up schalten, und 
gut ist.
Das ist eigentlich der übliche Weg.

Ralf

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris_R wrote:

> Hab's schon mit Pausenschleifen probiert gehabt, hat aber leider nichts
> gebracht. Da ging dann teilweise gar nichts mehr.

Was heißt probiert?
Man darf da nicht irgendwie rumprobieren, sondern man muß die Zeiten und 
Initialisierungen laut HD44780-Datenblatt einhalten.

Wenn der Compiler keine Delay-Bibliothek liefert, mußt Du Dir ein Delay 
1µs selber schreiben und es auch überprüfen, ob es stimmt, z.B. im 
Assemblerlisting.

Die Zeiten in meinem Programmbeispiel haben bei mir gut funktioniert.


Peter

Autor: Chris_R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Pieter

Ich geb Dir Recht, der C8051F340 kann eigentlich zuviel. Aber beim 
80C537 wurde auch nicht alles genutzt, deswegen sehe ich darin 
eigentlich kein Problem. Der Atmel ist leider nicht geeignet, da er 
weder AD-Wandler noch USB besitzt. Dies waren aber neben dem 8051-Kern 
die Hauptgründe für den SiLab.

Übrigens: Das User Manual vom 80C537 hat fast 380 Seiten ;-)

@Ralf
Auf der Platine sind Kippschalter montiert. Hebel nach unten -> 
Low-Pegel,
Hebel nach oben -> High-Pegel.

Wieso sollen die 1,5 bis 12Mhz nur für USB sein? Nach einem Reset ist 
der Multiplizierer doch deaktiviert. Und laut Datenblatt liefert der 
interne Oszillator je nach eingestelltem Teiler entweder 1.5, 3, 6, oder 
12Mhz.

Autor: Chris_R (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hab das Problem gelöst. Ursache war tatsächlich die Zusatzschaltung auf 
der Display-Platine. Die hat anscheinend einpaar Pegelwechsel 
verschluckt. Und seit ich den 74HCT245 umschaltbar gemacht hab, 
funktioniert auch das Einlesen des Busyflags, was das Handling des LCDs 
doch sehr erleichtert.

Noch eine Anmerkung hinsichtlich Ports als dig. Eingänge: Laut 
Datenblatt muss man in diesem Fall die Portpins als 
"open-drain"-Ausgänge konfigurieren und die Pins im zugehörigen 
Port-Latch auf "1" setzen. Letzteres kann man sich aber sparen, es 
reicht, wenn man die Ausgänge auf "open-drain" stellt. Zumindest 
funktioniert es bei meinem µC so perfekt.

Nochmal vielen Dank an alle für Eure Hilfe.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Letzteres kann man sich aber sparen, es reicht, wenn man die Ausgänge auf
> "open-drain" stellt. Zumindest funktioniert es bei meinem µC so perfekt.
Das liegt daran, dass die Ports nach dem Reset auf 1 gesetzt werden.

> Wieso sollen die 1,5 bis 12Mhz nur für USB sein? Nach einem Reset ist
> der Multiplizierer doch deaktiviert. Und laut Datenblatt liefert der
> interne Oszillator je nach eingestelltem Teiler entweder 1.5, 3, 6, oder
> 12Mhz.
Jaja, schon klar, der interne Oszillator hat 12MHz, nach einem Reset ist 
ein Teiler von 8 eingestellt, ergibt 1,5MHz. Mögliche Teiler sind 1,2,4 
und 8.
Jetzt nimmst du Kapitel 14.4 noch dazu, dann kommst du auf maximal 
48MHz. Immer das komplette Kapitel lesen :)

Ralf

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.