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?
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
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.
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.
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
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
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
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?
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.
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
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
@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.
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.
> 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
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.