Forum: Mikrocontroller und Digitale Elektronik Merken das Taster 1-Signal hat


von U. H. (naitsbes)


Lesenswert?

Hallo,

ich bin absoluter Anfänger in der Mikrocontroller-Technik.
Jetzt will ich eine Display programmieren auf welchem ich einen Text 
ausgebe. Das Funktioniert ganz gut. Leider ist bei mir der Fall das wenn 
ich dann nochmals die Taste drücke das Display "Flackert", weil der Text 
neu im Display erscheint. Wie kann ich dies verhindern?

von Tux (Gast)


Lesenswert?

Taster einfach nicht nochmal drücken.

von U. H. (naitsbes)


Lesenswert?

Tux schrieb:
> Taster einfach nicht nochmal drücken.

tolle Antwort, absoluter Blödsinn.

von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

Sourcecode anpassen.
Vielleicht postest du ihn sogar, damit wir auch einen Blick drauf werfen 
können um dich bei deinem Problem zu unterstützen... Falls du uns lässt.

von Cyblord -. (cyblord)


Lesenswert?

Man kann flackern vermeiden wenn man das Display vor dem neu Schreiben 
nicht erst komplett löscht. Sondern es wird nur der Cursor wieder am 
Anfang plaziert und der alte Text überschrieben. Da muss man aber dann 
bei kürzeren neuen Texten aufpassen und am Ende mit Leerzeichen das 
restliche Display vollschreiben sonst bleibt der alte Text dort 
natürlich stehen.

gruß cyblord

PS: Kann es sein dass die Überschrift absolut nicht zum Beitrag passt?

von U. H. (naitsbes)


Lesenswert?

cyblord ---- schrieb:
> Man kann flackern vermeiden wenn man das Display vor dem neu Schreiben
> nicht erst komplett löscht. Sondern es wird nur der Cursor wieder am
> Anfang plaziert und der alte Text überschrieben. Da muss man aber dann
> bei kürzeren neuen Texten aufpassen und am Ende mit Leerzeichen das
> restliche Display vollschreiben sonst bleibt der alte Text dort
> natürlich stehen.
>
> gruß cyblord
>
> PS: Kann es sein dass die Überschrift absolut nicht zum Beitrag passt?

/*
 * LCDAnsteuerung.c
 *
 * Created: 28.01.2013 20:00:51
 *  Author: test
 */


#include <avr/io.h>
#include "lcd-routines.h"

#define Taster1 PB0
#define Taster2 PB1

int main(void)
{
  char *textOld;
  char *text1;
  char *text2;
  *text1="Erste Zeile";
  *text2="Zweite Zeile";

  DDRB  &= ~(1<<DDB0);
  DDRB  &= ~(1<<DDB1);
  PORTB |= (1<<Taster1);
  PORTB |= (1<<Taster2);


  lcd_init();
  lcd_clear();


    while(1)
    {
            if (bit_is_clear (PINB, Taster1) && (*textOld != *text1))
            {

                lcd_init();
                lcd_setcursor(0,1);
                *text1="Erste Zeile";
                lcd_string(*text1);
           *textOld=*text1;


          if (*text1 == *textOld)
              {
              lcd_init();
              lcd_setcursor(0,1);
              lcd_string(*text2);
            }
          }

          if (bit_is_clear (PINB, Taster2))
              {
                lcd_init();
                lcd_setcursor(0,2);
                lcd_string(*text2);
              }
    }
}

von J.-u. G. (juwe)


Lesenswert?

Das Flackern kommt daher, dass Du bei jedem Tastendruck eine 
Initialisierung des LCD durchführst. Das ist unnötig. Das LCD muss nur 
einmal, vor Begin der while-Schleife, initialisiert werden.

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Uwe H. schrieb:
> #include "lcd-routines.h"

Wo hast du die hergeklaut?

Uwe H. schrieb:
> lcd_init();

Diese Funktion rufst du ziemlich häufig auf. Bist du sicher, dass das 
notwendig ist?

von Spess53 (Gast)


Lesenswert?

Hi

Was soll das lcd_init(); in jeder Funktion? Das macht man einmal am 
Anfang. Kein Wunder, das es flackert.

MfG Spess

von J.-u. G. (juwe)


Lesenswert?

Entprellung der Taster wird auch nicht schaden.

von Cyblord -. (cyblord)


Lesenswert?

Absoluter Schrott-Code.

Hast du dir mal überlegt was die lcd_init macht? Hast du mal ins 
Datenblatt geguckt? Hast du überhaupt mal nachgedacht? Absolut sinnloses 
benutzen einer lib und dann meckern wenn das Display flackert. Alle 
Achtung. Beschäftige dich mal mit der Materie und dann komm wieder. 
Unglaublich frech.

gruß cyblord

von Michael A. (Gast)


Lesenswert?

Warum initialisierst du dein Display dauern? Das kostet einen Haufen 
Zeit, sorgt dadurch für das von dir beobachtete Flackern und 
überflüssig.

Wie der Begriff "Initialisieren" schon von der Bedeutung des Wortes her 
sagt, ist das nur einmal - zu Begin der Programms - nötig. Danach ist 
der Speicher im Display sinnvoll belegt und der Prozessor ist bereit für 
Darstellung von Texten.

von Silvan K. (silvan) Benutzerseite


Lesenswert?

J.-u. G. schrieb:
> Das Flackern kommt daher, dass Du bei jedem Tastendruck eine
> Initialisierung des LCD durchführst. Das ist unnötig. Das LCD muss nur
> einmal, vor Begin der while-Schleife, initialisiert werden.

Och Mann, er hätte auch selbst einen Blick in die Doku seiner Lib werfen 
können :-/

von Mystik (Gast)


Lesenswert?

Was ist nun mit dem Schalter???

von Mystik (Gast)


Lesenswert?

...bzw Taster !!!!!

von J.-u. G. (juwe)


Lesenswert?

Silvan König schrieb:
> Och Mann, er hätte auch selbst einen Blick in die Doku seiner Lib werfen
> können :-/

Hast Recht. Ich bin mir aber ziemlich sicher, das auf den TO noch 
weitere Probleme zukommen werden, so dass er später des öfteren noch 
einen Blick in die  Doku werfen muss.

von U. H. (naitsbes)


Lesenswert?

Hab den Code von Karsten

http://youtu.be/m-55gSWACdU

von Kim S. (Gast)


Lesenswert?

@cyblord
vielleicht hat er anfangs geschriueben das er Anfänger ist.
Wenn jeder erst ejde Doku und Anleitung und  dann noch das komplette 
Buch des Compilers etc pp elsen würde, wofür bäuchte er dann Dich?!

Schinmal darüber nachgedacht, das die Vorteile des Internets daran 
leigen, das ejder ehute spontan eine Frage stellen kann zu sienem 
Proble, die lösung erhält udn so innerhalb wenger Stunden ein 
lauffähiges c System hat?!?!

Mal überlegt wie das noch vor vielen Jahren war, als man sich mühsam in 
der Bücherei alles zusammengesucht hat und nach Tagen / Wochen die 
ersten Erfolge hatte!!

Ich habe hier oft den Eindruck, das viele den Vorteil des Internets 
nicht verstehen

Wie ist es denn nun ausgegangen?
Ich könnte mir gut vorstellen das das unnötige Init noch nicht mal das 
flackern verursacht, aber wie hier schon erwähnt das nicht entprellen 
des Taster hierfür verantwortlich sein könnte.
Beides zusammen ist natürlich doppelt verdächtig für das Problem

von Karl H. (kbuchegg)


Lesenswert?

Kim Schmidt schrieb:
> @cyblord
> vielleicht hat er anfangs geschriueben das er Anfänger ist.
> Wenn jeder erst ejde Doku und Anleitung und  dann noch das komplette
> Buch des Compilers etc pp elsen würde, wofür bäuchte er dann Dich?!

Weil in den Dokus, Anleitungen, Büchern auch nicht alles steht und 
Restfragen offen bleiben.

Aber es ist sinnlos, sich mit Differentialgleichungen zu beschäftigen, 
ehe man das kleine Einmal-Eins und einfaches Formalumstellen gelernt 
hat. Und DAS kann man sehr wohl lernen, indem man die Grundlagen 
nachliest und für sich selbst Übungsstunden investiert. Oder muss da 
auch die Mama daneben sitzen und alles kontrollieren?

> Schinmal darüber nachgedacht, das die Vorteile des Internets daran
> leigen, das ejder ehute spontan eine Frage stellen kann zu sienem
> Proble, die lösung erhält udn so innerhalb wenger Stunden ein
> lauffähiges c System hat?!?!

Schon mal darüber nachgedacht, dass es sinnvoll ist, sich die absoluten 
Grundlagen erst mal soweit beizubringen, dass man überhaupt sinnvolle 
Fragen stellen kann?

> Mal überlegt wie das noch vor vielen Jahren war, als man sich mühsam in
> der Bücherei alles zusammengesucht hat und nach Tagen / Wochen die
> ersten Erfolge hatte!!

Been there. Done that.
Und weißt du, was das wirklich lustige an der ganzen Sache ist?
Genau diejenigen, die durch diese Mühle durchmussten, sind diejenigen 
die hier Fragen`kompetent beantworten, eben weil sie das alles von der 
Pieke auf gelernt haben. Mühsam, aber nachhaltig.

Uns wird dann immer wieder gerne mal vorgeworfen, dass wir das alles ja 
schliesslich auch nicht von Geburt auf gekonnt hätten. Und das stimmt 
sogar. Keiner ist mit dem Wissen zur Welt gekommen. Wir alle mussten 
durch die Schule durch, die da heißt: Lesen, lernen, probieren, fluchen, 
anderen Code studieren. Du kannst dir gar nicht vorstellen, WIE mühsam 
im Vergleich zur heutigen Fragerei in einem Forum das alles war. Aber: 
Wenn man etwas dann nach Tagen und Wochen endlich intus hatte, dann 
hatte man es auch wirklich intus! Weil man jede Anweisung im Code 'mit 
dem Vornamen kannte'. Und mit der Zeit wurde man besser und besser.
Das vergessen diejenigen leider gerne, die uns dann vorwerfen, das wir 
das Wissen schon haben und sie nicht. Da steckt für jeden von uns auch 
eine Menge Zeit drinnen um genau dieses Wissen sich erst mal anzueignen. 
UNd ja, wir alle haben genau gleich angefangen: bei 0.
Wir haben unser Wissen nicht daher, weil wir 5 Fragen in einem Forum 
gestellt haben, sondern weil wir die Ausdauer hatten, durch die Mühle 
durchzugehen und zu üben und zu probieren. Ich hab in meinem 
Programmierer-Leben wahrscheinlich schon mehr Code weggeworfen und als 
unbrauchbar abqualifiziert als du je programmiert hast.

> Ich habe hier oft den Eindruck, das viele den Vorteil des Internets
> nicht verstehen

Schnelle, scheinbare Lösungen, die andere für einen erarbeitet haben.

> Ich könnte mir gut vorstellen das das unnötige Init noch nicht mal das
> flackern verursacht, aber wie hier schon erwähnt das nicht entprellen
> des Taster hierfür verantwortlich sein könnte.

Nö.
Du kannst den immer gleichen Text am LCD so oft übereinander malen wie 
du willst. Da flackert nichts. Flackern entsteht erst, wenn sich die 
Anzeige zu oft ändert. Sei es durch dauerndes 'LCD löschen' oder eben 
laufendes Neuinitialisieren (welches meistens in der init Funktion 
selbst auch noch einen LCD-lösch Befehl enthält)

von Karl H. (kbuchegg)


Lesenswert?

Interessieren würde mich nur, wie er das da
1
  char *text1;
2
  char *text2;
3
  *text1="Erste Zeile";
4
  *text2="Zweite Zeile";

ohne Error/Warnung durch den Compiler gekriegt hat.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl Heinz Buchegger schrieb:
> Interessieren würde mich nur, wie er das da
>
>
1
>   char *text1;
2
>   char *text2;
3
>   *text1="Erste Zeile";
4
>   *text2="Zweite Zeile";
5
>
>
> ohne Error/Warnung durch den Compiler gekriegt hat.

Das ist noch nicht alles, hier noch mehr Vorkommnisse:
1
    if (bit_is_clear (PINB, Taster1) && (*textOld != *text1))
2
    *text1="Erste Zeile";
3
    lcd_string(*text1);
4
    *textOld=*text1;
5
    if (*text1 == *textOld)
6
    lcd_string(*text2);

Strings kopieren/vergleichen macht man anders. ;-)

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.