Hallo, erst einmal möchte ich mich vorstellen. Mein Name ist Patrick und ich bin 20 Jahre alt. Momentan absolviere ich noch eine Ausbildung im Beruf "Elektroniker für Geräte und Systeme". Ich habe mir von der Berufsschule aus ein Mikrokontrollerboard, welches zum herum experimentieren dienen soll, gekauft :) Nun möchte ich das LC Display in Assembler ansteuern. Programmiert wird in uVision 4 (Keil Compiler) und gebrannt mit Atmel Flip. Habe mich schon informiert, wie das alles geht mit den Warteschleifen und den Init-Codes usw. Aber erst einmal hier ein paar Daten: uC: Atmel T89C51CC01 @ 12MHz LCD Controller: KS0070B LC Display: 162C (16Characters x 2 lines) Portbelegung: RW = Ground (sprich: nur schreiben/ kein lesen) RS = P2.6 Enable = P2.4 DB7 = P2.3 DB6 = P2.2 DB5 = P2.1 DB4 = P2.0 (sprich: 4-Bit Mode) Initialisierung laut Datenblatt: 1. Power ON 2. mehr als 15ms warten, nachdem die Beitrebsspannung von 4,5V erreicht ist 3. "Function-Set" senden 4. mehr als 4,1ms warten 5. "Function-Set" senden 6. mehr als 100us warten 7. Function-Set senden 8. Display OFF 9. Display Clear 10. Entry Mode Set Soweit so gut. Leider bekomme ich die Initialisierung nicht hin! Das erste Problem ist die Warteschleife. Ich weiß nicht wie ich die Warteschleife programmieren soll. Man kann den Timer dafür verwenden soweit ich weiß, aber dafür muss man wiederrum wissen wie lang ein Maschinenzyklus geht,.... Ich wäre sehr dankbar wenn ich mir mit der Warteschleife schon einmal helfen könntet. Falls ihr noch fragen habt, einfach schreien. Ich hoffe das waren alle wichtigen Daten und ich habe nichts vergessen.
Du kannst: -folgendermassen eine Warteschleife einstellen: --einfach eine solche Warteschleife mit einem beliebigen aber bekannten Wert erstellen, darum eine Endlosschleife und in dieser nach jedem Durchgang der Warteschleife einen Pin togglen, und die Periodendauer dort mit dem Oszilloskop oder einem Frequenzmesser messen. Notfalls kann man da mit einem kleinen Aktivlautsprecher und einer Stimmgabel auch was improvisieren. --Wenn Du Assemblersprache benutzt, Anweisungen zaehlen. Ein klassischer MCS51- wie dein AT89C51irgendnevariante es vermutlich ist - ist ein Zwoelftakter, macht Quarz in Hertz durch zwoelf Anweisungen pro Sekunde. Ein paar Anweisungen brauchen die doppelte bis vierfache Zeit (bedingte Verzweigungen, wie man sie am Ende einer Schleife oft findet, zum Beispiel) - da kannst Du in eine Referenzwerk schauen (Datenblatt, Programmierhandbuch...) oder die Ungenauigkeit in Kauf nehmen, da ein HD44780 und kompatibel auch mit etwas laengeren Delays klarkommt. --Wenn Du C benutzt, sieh Dir den generierten Assemblercode an, siehe dort oder -Eben den Timer benutzen, dieser taktet ebenfalls immer auf die Zwoelf. oder -Wissen dass eine "naiv geschriebene" for-Schleife abwaerts mit einem long-iterator so an die 20 bis 30 Anweisungen pro Durchlauf kostet (Du musst viermal subtrahieren, achtmal den akkumulator be/entladen, viermal vergleichen (bzw mit ORL die bytes zusammenpappen um damit den Sprung zu steuern), und dann einen bedingten Sprung machen, schon bist Du bei 20 ;). Einfach 200% Sicherheitsfaktor dran und ans nächste Problem. Viel kleineroptimieren wird das wohl auch der C Compiler nicht koennen.
ok ich werde es morgen versuchen, den Timer bis 255 zählen zu lassen, dann das Timer Overflow Flag an einen Pin ausgeben und diesen dann mit einem Oszilloskop anschauen. Ich denke so hast du es gemeint. Ich werde mich dann noch einmal melden, danke. Anbei noch ein Bild, damit ihr/ du noch eine Ahnung habt in welche Richtung das ganze geht.
bzgl. 8051 Timer und Delays findest Du hier schöne Beispiele in Assembler incl. Berechnung: http://www.the-crankshaft.info/2009/08/8051-microcontroller-topic-index.html und dort speziell Kapitel 3.3 und 9.
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.