Forum: Compiler & IDEs LCD Display Off - On - Befehl


von Stefan (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

ok

wollte das LCD ausschalten um Strom zu sparen!
LCD LED würde ich dann per Transistor und ein PIN am Atmega8 ausschalten 
bzw. einschalten.

von Ich (Gast)


Lesenswert?

Nein das LCD braucht kaum Strom, wichtig ist die LED.

von Stefan (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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?

von STk500-Besitzer (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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!

von Klaus W. (mfgkw)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Ein Blick ins Datenblatt könnte helfen.

von Stefan (Gast)


Lesenswert?

Hast du für mich die passende Seite?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Stefan schrieb:
> Hast du für mich die passende Seite?

Seite 74ff

(nein, nicht 42)

von Klaus W. (mfgkw)


Lesenswert?


von Stefan (Gast)


Lesenswert?

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."

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

das werde ich niemals hinbekommen!

Gibt es dazu schon eine fertige Lösung für Atmega8 Timer2 32khz. Habe 
schon alles durchgesucht, aber finde nix

von Karl H. (kbuchegg)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

woher weiß der µC das an PD2 und PD3 (INT0 bzw. INT1) das dort ein 32khz 
Quarz angeschlossen ist?

von Stefan (Gast)


Lesenswert?

ok hab den Code soweit umgeschrieben, dass nun die Register des Atmega8 
verwendet werden.

bei CLKPR happert es. Ein Tipp was es bei Atmega8 ist?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Stefan schrieb:
> bei CLKPR happert es. Ein Tipp was es bei Atmega8 ist?

Was ist es denn lt. Datenblatt beim mega88 (für den das Beispiel ja 
ist)?

von Stefan (Gast)


Lesenswert?

ja der clock prescale register, denn ich bei 8 nicht finde

von Klaus W. (mfgkw)


Lesenswert?

Den wirst du da auch nicht finden.
Aber was BEWIRKT denn das
1
   CLKPR = 2;          // Prescaler /4
beim mega88?

von Klaus W. (mfgkw)


Lesenswert?

Weil ich nicht bis morgen früh hier sitzen will: es steht irgendwo bei 
"System Clock and Clock Options"...
(natürlich im Datenblatt des mega88)

von Stefan (Gast)


Lesenswert?

ich gibs auf, werde erstmal mit Timer0 bzw 1 auseinander setzen

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

so hab mich nochmal an Timer2 versucht.

Was habe ich falsch gemacht?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

richtig wäre also

TCCR2 = (1<<CS20) | (1<<CS22);

?

von Karl H. (kbuchegg)


Lesenswert?

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!

von Klaus W. (mfgkw)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
if(flag_ls == 1) {
2
      flag_ls = 0;
3
      LED_PORT ^= 1<<LED0;
4
5
      lcd_clear();
6
      lcd_setcursor(0,1);
7
      sprintf(buffer, "%d", second);
8
      lcd_string(buffer);
9
    }

von Klaus W. (mfgkw)


Lesenswert?

Mal am Kontrast drehen?
Spannung am LCD stabil?

von Karl H. (kbuchegg)


Lesenswert?

lass mal das lcd_clear weg.
Sorg dafür, dass deine Zahl immer 2 Stellen hat und lass den alten Text 
mit dem neuen überschreiben
1
    if(flag_ls == 1) {
2
      flag_ls = 0;
3
      LED_PORT ^= 1<<LED0;
4
5
      lcd_setcursor(0,1);
6
      sprintf(buffer, "%02d", second);
7
      lcd_string(buffer);
8
    }

oder Alternativ: sorg dafür, dass das LCD nur so kurz wie möglich ohne 
eine Anzeige ist
1
    if(flag_ls == 1) {
2
      flag_ls = 0;
3
      LED_PORT ^= 1<<LED0;
4
5
      sprintf(buffer, "%d", second);
6
7
      lcd_clear();
8
      lcd_setcursor(0,1);
9
      lcd_string(buffer);
10
    }

von Stefan (Gast)


Lesenswert?

ok es lag an der "Spannung", benutze eine 9 Volt Block Batterie, die bei 
7,5V zu wenig Spannung lieferte.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

:) kannst du das näher erläutern?
sollte man das nicht verwenden, weil das gesamte Inhalt neu aufgesetzt 
werden muss?

von Karl H. (kbuchegg)


Lesenswert?

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
1
#include <avr/io.h>
2
#include "lcd_routines.h"
3
#define XTAL    4000000L
4
#define F_CPU   XTAL
5
#include <utils/delay.h>
6
7
int main(void) {
8
9
  uint16_t i = 0;
10
  char buffer[20];
11
12
  lcd_init();
13
  lcd_clear();
14
  lcd_home();
15
16
  while(1) {
17
18
    lcd_clear();
19
20
    lcd_string( "Zahl: ");
21
    sprintf(buffer, "%4d", i);
22
    lcd_string(buffer);
23
24
    i = i + 1;
25
    if( i == 9999 )
26
      i = 0;
27
28
    _delay_ms( 100 );
29
  }
30
}


und dann das ganze ohne den lcd_clear.
1
#include <avr/io.h>
2
#include "lcd_routines.h"
3
#define XTAL    4000000L
4
#define F_CPU   XTAL
5
#include <utils/delay.h>
6
7
int main(void) {
8
9
  uint16_t i = 0;
10
  char buffer[20];
11
12
  lcd_init();
13
  lcd_clear();
14
  lcd_home();
15
16
  lcd_string( "Zahl: ");
17
18
  while(1) {
19
20
    sprintf(buffer, "%4d", i);
21
    lcd_setcursor( 6, 1 );
22
    lcd_string(buffer);
23
24
    i = i + 1;
25
    if( i == 9999 )
26
      i = 0;
27
28
    _delay_ms( 100 );
29
  }
30
}

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

ok habs gelöst

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
Noch kein Account? Hier anmelden.