LCD Display Off - On - Befehl

Gast #1892100
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
Gast #1892379
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?
#1892398
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.
Gast #1892529
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?
Gast #1892548
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...
#1892551
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.
#1892552
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.
#1892553
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.
Gast #1892896
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?
#1893198
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.
#1893511
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
#1893517
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.
#1894026
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.
#1894120
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!
#1894330
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.
Gast #1894360
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!
#1894376
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.
Gast #1894644
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
    }
Angehängte Dateien:
#1894661
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
    }
#1894695
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
}
Gast #1894790
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 ....

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren