Hallo, ich habe ein kleines Problem. Ich habe mir ein Programm zum initialisieren eines LC Displays im 4 Bit Modus geschrieben. Es ist alles ordentlich angeschlossen und die Zeitabständer bei 16Mhz quarz mit AVR delay loop berechnet. Leider geht das Display nur in den 1 Zeilen Modus und der Kursor blinkt. Zur Kontrolle habe ich Leds angeschlossen und mir den Status zwischen einzelnen Befehlen anzuzeigen (also um zu sehen ob das Programm durchläuft). Das geht für meinen Geschmack aber viel zu schnell. Und zwar so schnell, dass man es garnicht mitbekommt :( Vielleicht kann es sich ja mal einer anschauen. Ich habe mir große Mühe zu geben ordentlich zu bleiben und gut zu kommentieren! Dankeschön.
Und, keiner ne idee? Habe versucht mich exakt an die wartezeiten zu halten bzw. diese eher zu verlängern.
Funktioniert ein Atmega8 mit 16MHz??? ich hab mir gedacht der geht nur bis 8MHz
ich wollt vorgestern meinen auch mit einem 16MHz betreiben, weil ich nur den einen quarz hatte aber ich hab 1. bei den Fuses-Einstellungen nicht 16MHz gefunden und 2. Im Internet auch nicht ich kann es aber auch übersehen haben als lösung würde ich an der Stelle den Internen takt auf 8 MHz stellen und dann mal ausprobieren... natürlich prog auch umändern mfg
hmm Also im Datenblatt steht, dass er es kann!
Du sprichst das Display nicht richtig an. Schau dir deine Enable Routine noch mal an bzw. vergleiche hiermit: http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Stimmt, auf Seite 25 englische Version. Ausschnitt: For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed and 16 MHz with CKOPT programmed. CKOPT?? Ich kenn die Einstellung nicht aber würd mal darauf tippen...das da was fehlt mfg PS: Wenn ich schmarn schreibe tuts ma leid^^ bin noch nicht da checker
Hi holger, kannst du mir vielleicht genauer sagen, wo es harpert? Ich bin nach der Anleitung von Sprut.de vorgegangen und habe so auch ein LC an meinem AT89S52 ans laufen bekommen. Da funktioniert alles einwandfrei!
Keiner ne genaue ahnung woran es liegen könnte?
CKOPT ist ein Fuse-Bit. Man kann ATMega8 meiner Erfahrung nach problemlos mit 16MHz (und sogar auf 20MHz übertaktet) betreiben. CKOPT muss dabei aber aktiviert sein, sonst läuft der AVR instabil (hatte ich auch schon). 16MHz gibt es aber nicht als Einstellung bei den Fusebits, das geht nur mit ext. Takt oder Quarz.
>Hi holger, >kannst du mir vielleicht genauer sagen, wo es harpert? Schau doch noch mal genau hin (als Beispiel nur die erste Ausgabe): ldi temp, 0b00000011 ;Display 8 bit out lcd_port, temp ;Daten aufs port legen rcall enable_routine ;Daten ans Display �bergeben Dann setz mal statt "rcall enable_routine" den Code dafür ein. Die delays hab ich hier fürs bessere hinsehen weggelassen. ldi temp, 0b00000011 ;Display 8 bit out lcd_port, temp ;Daten aufs port legen ldi temp, 0b10000000 ; Enable auf high setzen out lcd_port, temp ; Aufs port schreiben Fällt dir da gar nichts auf? Klar, Enable wird high, aber was ist mit den Daten die du vorher ausgegeben hast? Von einer zweifachen 4 Bit Ausgabe für Daten und Kommandos nach dem Software Reset sehe ich auch nichts.
Das mit der ausgabe nach der initialisierung ist mir erstmal garnicht wichtig! Wichtig ist erstmal das display ans laufen zu bekommen. Und ich stehe gerade leider aufm schlauch, was du mit " fällt dir garnichts auf" meinst. Ich schreibe genau nach sprut.de anleitung die daten aufs display.
Du überschreibst die Daten auf dem Port beim Enable. Vielleicht ist der AVR ja schneller als der AT89, und die Hold-Time reicht nicht mehr. Jürgen
Achsoo, sorry, das ist mir vorhin auch aufgefallen. Mitlerweile habe ich es so stehen: enable_routine: rcall short_delay sbi LCD_PORT,enable rcall short_delay cbi LCD_PORT, enable rcall short_delay Ich bekomme das Display nun einigermaßen ans laufen. Ich bekomme ne zweite Zeile angezeigt und kann auch das Blinken des Cursors ein und ausschalten. Ein Zeichen gesendet bekomme ich aber nicht. Ist es unbedingt notwendig, erst 2 Zeilig zu aktiveren, dann display ausschalten, display löschen, dann kursoreinstellung/shift einstellen und dann das display wieder einzuschalten? Also damit das display ordentlich funktioniert? Ich habe wie gesagt an position 0 einen kursor der blinkt, aber wenn ich ein zeichen sende, wird keines angezeigt und er springt auch nicht nach rechts.
Oliver D. wrote: > Ist es unbedingt notwendig, erst 2 Zeilig zu aktiveren, dann display > ausschalten, display löschen, dann kursoreinstellung/shift einstellen > und dann das display wieder einzuschalten? > Also damit das display ordentlich funktioniert? Die 100%ig korrekte Methode steht in dem Datenblatt deines Controllers > Ich habe wie gesagt an position 0 einen kursor der blinkt, aber wenn ich > ein zeichen sende, wird keines angezeigt und er springt auch nicht nach > rechts. Falls HD44780: Hast du denn RS entsprechend gesetzt/gelöscht? Dadurch unterscheidet der Controller ob Daten/Kommandos reinkommen.
Jop ich setze dann RS und starte die enable routine.
Sooo habe die Nase jetzt voll. Damals hatte ich auch so blöde Timingprobleme als ich den AT89S52 genutzt habe! Ich nehme mir jetzt mal mein Oszi und Messe die Zeiten exakt aus. Das hatte damals auch Besserung gebracht ;)
So, jetzt funktionierts. Habe die Wartezeiten mal genau ausgemessen. Lag wohl nur am Timing :( Zum Glück klappts jetzt :)
>Lag wohl nur am Timing :( >Zum Glück klappts jetzt :) Wirklich? Dein Code sieht immer noch scheisse aus.
Hi Kann Holger nur zustimmen. > ldi temp, 0b10000000 ; Enable auf high setzen > out lcd_port, temp ; Aufs port schreiben Für jedes andere Projekt unbrauchbar! MfG Spess
@holger: Wieso? @Spess: Genau das habe ich geändert.
Hi Du überschreibst um ein Bit zu setzen, den gesamten Port. Mag zwar jetzt funktionieren. Aber wenn da noch andere Sachen dranhängen geht das nicht mehr. MfG Spess
>Genau das habe ich geändert.
Aber nicht in dem Code den du angehängt hast ;)
Sorry, war wieder nicht der aktuelle Code ;) Also ich habe mir jetzt mal angewöhnt dann z.B.folgendes zu nutzen: sbr temp, 1<<rs , wobei dann rs bei mir pin 4 ist, den ich oben unter .equ stehen habe. Ich hoffe, dass das zum besseren Stil beiträgt, denn die anderen pins werden ja nicht angerührt :)
Hi Wenn die Adresse deines IO-Registers <32 ist, kannst du direkt mit 'sbi' und 'cbi' auf die Bits zugreifen. Beachte aber, daß die Bitadressierung anders als bei 'sbr/cbr' ist. MfG Spess
Also, sbi PORTD, 1 ergibt 0b00000010 cbi PORTD, 4 ergibt 0bxxx0xxxx korrekt?
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.