Abend,
gibt es eine Möglichkeit das Display eines HD44780 nachträglich das
Display auszuschalten?
Ich benutze die lcd-routines.c und .h aus Wiki, doch nachträglich kann
ich den Bildschirm nicht ausmachen. Durch den Befehl lcd_command(
LCD_DISPLAY_OFF ); passiert nix.
Geht das überhaupt, nachdem das Display schon initialisiert wurde?
2.
Kann ich die Hintergrundbeleuchtung des LCD per Software ausschalten?
Gibt es dazu z.B. ein Befehl oder muss ich es per Hardware machen?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Gruß
Stefan
Was verstehst du unter "ausschalten"?
Dei Beleuchtung geht extra.
Die kannst du per Output-Pin und Verstärker (Darlington, MOSFET)
schalten, ggf. mit PWM dimmen.
Das Display selbst braucht kaum Strom. Wenn du ihm den abdrehst,
muß es nach dem Einschalten wieder neu initialisiert werden.
ok danke, ich meine auch die LCD-LED.
Hab ich das richtig verstanden, dass man mit einem Controller die LED
Dimmen kann? Oder brauch ich dafür extra ICs?
Wenn du den Transistor/Darlington/MOSFET an einem PWM hängst,
brauchst du keine weitere HW.
Einfach so wie sonst an einen Port anschließen (Vorwiderstand
etc.) und bei 100% PWM-Ausgabe hat man volle Helligkeit, sonst
entsprechend weniger.
Wobei der Lichteindruck nicht linear zum PWM-Wert ist...
Habe mir das folgende Tutorial angeschaut
http://www.mikrocontroller.net/articles/LED-Fading
den Code ganz am Anfang habe ich soweit übernommen und den Port PB1 an
meinen Atmega8 eingestellt. Einen Vorwiderstand von 2,2k Ohm und eine
blaue LED. Wenn ich den Code starte und mir nur die letzte Schleife
anzeige
1
for(i=0;i<3;i++)pwm_10_64(step_time/16);
2
my_delay(1000);
3
for(i=0;i<3;i++)pwm_16_256(step_time/16);
4
my_delay(1000);
müsste doch die LED langsam aufleuchten und wieder abdunkeln. Bei mir
flackert diese aber Anfang. Benutze internen Quarz.
Wenn ich den Quarz mit
#define F_CPU 8000000L
einstelle, ist dann der microcontroller auf 8 MHz getaktet? Oder muss
ich auch noch die F_CPU bei delay.h von 1MHz auf 8 MHz auch ändern?
Mit F_CPU stellt man nicht die Taktrate ein.
Vielmehr sagt man der Laufzeit-Lib (konkret: den _delay*-Funktionen)
wie schnell der AVR getaktet ist.
Einstellen kann man es mit den Fuses und ggf. der externen Beschaltung.
Dazu sollte dann F_CPU passen, sonst stimmen die Zeiten nicht.
Steht aber irgendwie alles im Tutorial...
Einen internen Quarz gibt es nicht, nur einen internen Oszillator.
aso ok danke,
dann habe ich das auch schonmal verstanden. Was mich etwas verwundert
ist, in dem Beispiel
http://www.mikrocontroller.net/articles/AVR_-_Die_genaue_Sekunde_/_RTC
Echtzeituhr mit Uhrenquarz
steht
* ATmega88 mit internem 2 MHz Oszillator + 32,768 kHz Quarz
Wenn ich den Uhrenquarz verwende und die Fuses ändere, wie läuft der
Microcontroller dann noch auf 2MHz???? Durch das ändern der Fuses
verstelle ich es doch oder?
Der Uhrenquarz hängt da aber nicht am Clockeingang, sondern an
einem Interrupt.
Der AVR selbst wird mit dem internen Oszillator getaktet.
Dementsprechend werden die Fuses auf den internen Oszillator
eingestellt.
sorry nun verstehe ich garnix mehr!
kommt der Uhrenquarz nicht an die PINS XTAL1/TOSC1 und XTAL2/TOSC2 des
ATMEGA8?Wie soll ich 2MHz mit Fuses einstellen, wenn ich External
Low-frequency Crystal auf 1001 einstellen muss (für Uhrenquarz)? Oder
muss ich das nicht? Oder verwechsele ich da etwas?
Stefan schrieb:> sorry nun verstehe ich garnix mehr!>> kommt der Uhrenquarz nicht an die PINS XTAL1/TOSC1 und XTAL2/TOSC2 des> ATMEGA8?Wie soll ich 2MHz mit Fuses einstellen, wenn ich External> Low-frequency Crystal auf 1001 einstellen muss (für Uhrenquarz)? Oder> muss ich das nicht? Oder verwechsele ich da etwas?
Du kannst einen AVR mit einem relativ hochfrequenten Quarz an den
OSC-Pins betreiben und etwas mehr Strom verbrauchen, oder den internen
(ungenauen) RC-Osziollator benutzen und an den TOSC-Pins einen
Uhrenquarz betreiben, dessen Frequenz man dann für den Betrieb nutzen
kann, und den Controller zwischendurch schlafen legt.
Durch diese Schaltung ist der allgemeine Programmablauf nicht mehr
derart zeiltich präzise, wie er es mit einem "richtigen" Quarz wäre, ist
aber u.U. auch gar nicht nötig...
ja das ist mir klar. aber wie kann ich einen externen und internen quarz
bzw. Oszillator aktivieren mit nur 4 fuses bits wo ich schon 1001 für
den uhrenquarz nehmen muss?
Stromsparung spielt in meiner Schaltung eigentlich keine Rolle. Dachte
nur das ein Uhrenquarz etwas Präziser sei. Benötige es für eine Uhr bzw.
Timer!
Stefan schrieb:> kommt der Uhrenquarz nicht an die PINS XTAL1/TOSC1 und XTAL2/TOSC2 des> ATMEGA8?
nein, der kommt an den INT-Eingang (Eingang für Timer, steht doch
in deinem Link!).
Getaktet wird der AVR mit dem internen Oszillator, und danach richten
sich die Fuses.
Dieser interne Takt wird dann aber eben in der SW nicht mehr
als Zeitnormal benutzzt, sondern stattdessen der Timer - und der
wird vom Quarz angetriggert.
Stefan schrieb:> sorry nun verstehe ich garnix mehr!>> kommt der Uhrenquarz nicht an die PINS XTAL1/TOSC1 und XTAL2/TOSC2 des> ATMEGA8?Wie soll ich 2MHz mit Fuses einstellen, wenn ich External> Low-frequency Crystal auf 1001 einstellen muss (für Uhrenquarz)? Oder> muss ich das nicht? Oder verwechsele ich da etwas?
Der Quarz den du in diesem Falle anhängst, dient nicht dazu den µC
anzutreiben. Der Quarz dient ausschliesslich dazu, den Timer 2 des Mega8
zu treiben.
Stefan schrieb:> ja das ist mir klar. aber wie kann ich einen externen und internen quarz> bzw. Oszillator aktivieren mit nur 4 fuses bits wo ich schon 1001 für> den uhrenquarz nehmen muss?
Für den Quarz muß man in diesem Fall bei den Fuses gar nichts
beachten, weil der ja nicht als clock source für den AVR dient.
Mit den fuses stelt man doch nur ein, wie der AVR getaktet wird.
Karl heinz Buchegger schrieb:> Der Quarz den du in diesem Falle anhängst, dient nicht dazu den µC> anzutreiben. Der Quarz dient ausschliesslich dazu, den Timer 2 des Mega8> zu treiben.
Alles klar! Danke!
Sollte ich auf den Internen Oszillator verzichten, wenn ich die
Möglichkeit habe einen Externen Quarz anzuschließen? Bekomme ich dadurch
vl irgendwelche vorteile, oder sollte man es vermeiden, weil die beiden
Quarz sich gegenseitig stören könnten?
Die stören sich nicht.
Man nimmt für clock einen Quarz, wenn man die Genauigkeit
braucht.
Hat man nur einen Vorgang wie genaue Zeitmessung und regelt
das über dem Timer, ist der Quarz für clock einfach überflüssig
und Verschwendung (benötigt Bauteile und belegt Pins).
Aber machen kannst du das.
Klappt das Beispiel mit dem Uhrenquarz aus dem Tutorial mit einem
Atmega8 ??
Bei mir kommt 14 errors, die Fehler sind, dass er die ganzen Timer
Register nicht findet.
z.B. OCR2A undeclared (first use in this function)
usw.
Bei Atmel.com gibt es die Datenblätter (das vollständige nehmen,
teilweise gibt es auch kurze Übersichtsdinger, die helfen dir nicht).
Da steht ein Abschnitt über die diversen Timer/Counter.
Wenn ich dass richtig sehe brauchst du für dein Beispiel einen
16-Bit-Timer.
Das ist der Timer 1, also musst du die Registernamen entsprechend
anpassen und ggf. kontrollieren, ob der Timer das kann, was du
in deinem Beispiel brauchst.
Klaus Wachtler schrieb:> Wenn ich dass richtig sehe brauchst du für dein Beispiel einen> 16-Bit-Timer.> Das ist der Timer 1,
wenn es so sein sollte, ist der Artikel aber dann Falsch
"Die AVRs können im Sleep Mode den Uhrenquarz nur am Timer 2 betreiben,
welcher ein 8 Bit Timer ist."
Mag sein, ich habe das nicht genau gelesen.
Du musst halt sehen, was an dem Timer genutzt wird und am
Mega8 den nehmen, der dem entspricht.
Ich schlage vor, daß du das selbst machst.
Stefan schrieb:> das werde ich niemals hinbekommen!
Was wirst du nicht hinbekommen?
Einen Quarz an die richtigen Pins anschliessen und den Timer laut
Datenblatt so konfigurieren, dass der den Quarz als Antrieb benutzt?
In dem Fall solltest du dir ein anderes Hobby suchen.
>> Gibt es dazu schon eine fertige Lösung für Atmega8 Timer2 32khz.
Möglich.
Aber dann bist du hier im Forum falsch.
Wir sind strikte Verfechter der These: Durch Selbermachen lernt man am
meisten. Bei konkreten Problemen - bitte gerne. Aber
Rundumschlaglösungen - njet
Sonst ist KHB mehr der Mildtätige und ich der Böse, aber
ausnahmsweise würde ich es etwas sanfter formulieren:
Mach das Tutorial mit Sinn und Verstand in Ruhe durch.
Wenn du es danach nicht schaffst, das Beispiel an den Mega8
anzupassen, dann sollte man über andere Hobbys nachdenken.
Aber im Prinzip ist es wirklich so: Wenn man jemandem auf Dauer
alles vorkauen muß, macht es keinen Sinn.
Stefan schrieb:> woher weiß der µC das an PD2 und PD3 (INT0 bzw. INT1) das dort ein 32khz> Quarz angeschlossen ist?
Das weiß er nicht, er wertet nur die Signale aus, wenn sie denn kommen
und dein Programm das hergibt.
Du hast zb dem Timer 2 keinen Prescaler verpasst.
Schau dir nochmal die Schemazeichnungh auf Seite 123 (Fig.56) im
Datenblatt des Mega8 an.
Links oben sind die möglichen Taktquellen. Darunter clk I/O und TOSC1.
Du hast TOSC1 mittels AS2 ausgewählt. Aber nach dieser Auswahl geht der
Pfad nach wie vor in die Prescaler Stufe hinein, wo dieser Takt weiter
heruntergeteilt werden kann und erst danach gehts unten raus an den
eigentlichen Timer.
Stefan schrieb:> richtig wäre also>> TCCR2 = (1<<CS20) | (1<<CS22);>> ?
Sei nicht böse, aber was erwartest du?
Das wir dir jetzt jedes Statement vorkauen?
Du hast das Datenblatt. Das ist deine erste Anlaufstelle. Dort wird
nachgelesen, denn dort steht alles vollständig drinnen, auch wenn einen
die Information manchmal erschlägt. Und das Datenblatt sollte auch deine
erste Anlaufstelle sein, wenn es gilt etwas abzuklären. Die Atmel
Datenblätter sind insofern nicht schlecht, weil sie sauber in einzelne
Themenkreise aufgegliedert sind. Im Abschnitt 'Timer 2 - asynchrone
Benutzung' steht alles, was man zum Thema Timer extern ansteuern wissen
muss.
Für meinen Geschmack hast du auch viel zu viel Code um ein Feature zu
testen. Ehe ich nicht sicher bin (mit zb einer aufleuchtenden LED in der
ISR), dass der Timer läuft und auch Overflows auslöst, fange ich den
Rest erst gar nicht an. Ich hasse nämlich nichts so sehr, wie wenn ich
mich in irgendwelchen, für das Problem (Timer 2 mit 32kHz Quarz
betreiben) zunächst uninteressanten, Details verlieren.
Die Aufgabe lautet: Timer 2 mit einem externen Quarz zum Laufen bringen.
Und dann handelt meine erste Codeversion dann auch nur davon: Was ist
alles zu tun um den Timer zum Laufen zu bringen. Alles andere, Compare
Match, Zeitkorrekturen etc. interessiert in der ersten Version nicht die
Bohne. Jeglicher Code, der nicht unmittelbar mit dem Problem zu tun hat
(Timer mit externem Quarz zum laufen zu bringen), ist nur eine mögliche
Fehlerquelle, in der sich Fehler verstecken können, die gar nichts mit
dem Problem an sich etwas zu tun haben, den Programmlauf aber
unbrauchbar machen können. Daher: weg damit!
So sieht das aus: zuviel auf einmal, vermutlich mit zuwenig
Grundlagenwissen dafür.
Ich würde immer noch dafür plädieren, erst
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial
in Ruhe durch zu ackern. Darin werden viele Fragen geklärt,
die man sonst hier mühsam einzeln erklären muss.
ok habe mir das Datenblatt angeschaut und daraus halt
TCCR2 = (1<<CS20) | (1<<CS22);
abgeleitet. Die Idee war ja 32768/128/256 = 1
also passiert jede sec ein Interrupt. Wenns falsch ist, wie soll ich nun
rausfinden, was richtig ist?
Stefan schrieb:> ok habe mir das Datenblatt angeschaut und daraus halt>> TCCR2 = (1<<CS20) | (1<<CS22);>> abgeleitet. Die Idee war ja 32768/128/256 = 1>> also passiert jede sec ein Interrupt. Wenns falsch ist
Ich sag ja nicht, das es falsch ist :-)
Ich sag nur: Du musst anfangen zu lernen, wie du dir selber helfen
kannst und wie du selber ohne fremde Hilfe (=personelle Hilfe;
Datenblätter etc. sind ok) klar kommen kannst und Dinge rausfindest.
Du wirst noch vielen Dingen begegnen, die nicht auf Anhieb so
funktionieren wie du dir das vorstellst.
Dann gibts 2 Möglichkeiten
* entweder du hast den Ehrgeiz und das Sitzfleisch so weit es geht
selbst mit Experimenten, Doku lesen, etc. da durchzusteigen.
* oder immer gleich um Hilfe zu schreien
Im ersten Fall lernst du etwas Neues, was du so schnell nicht wieder
vergisst und du sammelst Erfahrung, die auch in anderen Bereichen
nützlich sein kann.
Im anderen Fall bist du ein 'Malen nach Zahlen' Maler, der zwar viele
Bilder zu Hause an der Wand hängen hat, aber von Bild und
Farbkomposition nicht den geringsten Schimmer hat.
Das soll nicht heißen, dass fragen verpönt ist. Mit nichten. Aber fragen
ist einer der letzten Auswege, wenn gar nichts anderes mehr geht. Dann
kommt jemand hier im Forum zu Hilfe, der genau dieses Sitzfleisch hatte.
Klaus Wachtler schrieb:> Ich würde immer noch dafür plädieren, erst> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial> in Ruhe durch zu ackern. Darin werden viele Fragen geklärt,> die man sonst hier mühsam einzeln erklären muss.
keine Schlechte Ideen, nur sehe hier das Problem, dass verschiedene
Mikrocontroller behandelt werden. Hierzu müsste ich mich erst durch
Datenblätter wälzen, die mich nie wieder interessieren werden, da ich ja
mit einem anderen Microcontroller arbeite. Siehe auch das Problem mit
Timer2.
Außerdem interessieren mich einige Themen (noch) nicht (UART). Die Zeit
nun da zu investieren ist nun Fragwürdig.
Außerdem widersprechen sich die ganzen Beiträge hier im Forum mit den
Datenblatt. Dort wird erwähnt, wenn man den 32khz Quarz als Timer
Interrupt verwenden will, muss man den an TOSC1 etc anschließen. Hier
ist aber die Rede von INT-PIN. Das erleichtert natürlich nicht das
Verständnis des Microcontrollers!
Stefan schrieb:> Außerdem widersprechen sich die ganzen Beiträge hier im Forum mit den> Datenblatt. Dort wird erwähnt, wenn man den 32khz Quarz als Timer> Interrupt verwenden will, muss man den an TOSC1 etc anschließen.> Hier ist aber die Rede von INT-PIN. Das erleichtert natürlich nicht das> Verständnis des Microcontrollers!
Ein Grund mehr, warum für dich immer erst das Datenblatt Anlaufstelle
Nummer 1 sein muss.
Denn: Auch die ständigen Forenteilnehmer kennen die Datenblätter nicht
auswendig. Und manchmal kommt es zu Missverständnissen.
> keine Schlechte Ideen, nur sehe hier das Problem, dass> verschiedene Mikrocontroller behandelt werden. Hierzu müsste> ich mich erst durch Datenblätter wälzen
Aha. Aber wir sollen das für dich tun?
Und von wälzen kann keine Rede sein.
Die Atmel Datenblätter sind ja keine monolithischen Machwerke, sondern
in Kapitel unterteilt. Und es ist dir durchaus zuzumuten, dass du die
jeweils relevanten Kapitel aus 2 Datenblättern miteinander vergleichst.
Die sind über weite Strecken absolut gleich bis ähnlich. Ein Tipp: In
jedem Kapitel gibt es zum Schluss einen Abschnitt "Register Summary".
Wenn die Konfigurationsregister 2-er Prozessoren dort identisch sind,
ist die Chance nicht schlecht, dass auch der Rest dieser Thematik mehr
oder weniger identisch ist.
> Außerdem interessieren mich einige Themen (noch) nicht (UART).> Die Zeit nun da zu investieren ist nun Fragwürdig.
erstens ist die investierte Zeit niemals fragwürdig. Du kannst dabei nur
lernen. Und zweitens kann man dieses Kapitel auch überspringen, da es in
sich vollständig ist und von nichts anderem abhängt, bzw. die
Voraussetzung für etwas anderes ist.
ok danke werde mich mal durch die Tutorials durcharbeiten.
Der Code im Anhang ist ein Timer1 der die aktuellen Sekunden an das LCD
sendet. Nebenbei lasse ich eine LED an einem anderen PIN blinken.
Ich habe ein blaues LCD mit weißer Schrift. Problem ist nun die
Sekunden, die an das LCD gesendet werden, werden ganz dunkel
dargestellt. Als ob das LCD ein Zeichen richtig dargestellt hat und
direkt ein neues Zeichen bekommt. Normalerweiße werden die Zeichen weiß
dargestellt.
Liegt dies eventuell an meinem Code?
Auszug:
Stefan schrieb:> ok es lag an der "Spannung", benutze eine 9 Volt Block Batterie, die bei> 7,5V zu wenig Spannung lieferte.
Ist natürlich ein Argument :-)
Trotzdem solltest du dich daran gewöhnen, dass diese lcd_clear Orgien
Müll sind.
Stefan schrieb:> :) kannst du das näher erläutern?
Weil dein LCD dann blinkt!
Nun sind LCD aber träge, träge, träge
Das Blinken verschmiert zu 'die Buchstaben verschwimmen mit dem
Hintergrund'
Überschreibst du aber, dann hat man nur beim neuen Text ein kurzes
Flackern, alles andere, also auch Fixtexte, steht gestochen scharf auf
dem LCD.
Probiers doch einfach mal aus
mit clear
ok habs getestet, so richtiges flackern, wie ich es erwartet habe, kam
nicht an, war aber zu sehen, wenn man richtig darauf fixiert.
Leider habe ich irgendwelche Probleme mit der Variable second. Denn
eigentlich sollte diese wenn 60 ist, auf 0 runtergesetzt werden.
passiert aber nachdem die auf 60 ist und wird dann auf 01 gesetzt:
58 59 60 01 02 ....