Forum: Compiler & IDEs Taster und Display - Anfänger


von Randy T. (peroja)


Lesenswert?

hallo

ich möchte aus neugier mal eine tastenabfrage auf ein display bringen 
und soweit funktioniert es halbwegs? allerdigs "flasht" das display und 
die tastenabfrage funktioniert auch nur bei einem reset des uC
also wenn ich die taste drücke geschieht erst mal gar nix und es belibt 
bei "Taster OFF" wenn ich aber die taste gedrückt halte und die reset 
taste drücke dann hab ich "Taster ON"

bin anfänger.... was mach ich falsch?

LG und danke viel mal
peroja

display ist ein 16x2 standard

1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
  
8
  int temp;
9
10
  // Set Port B 4 as output (binary 1), 3 as input (binary 0)
11
  DDRB = 0b00010000;
12
  
13
  
14
 for ( ; 1==1 ; )
15
  {
16
    temp = (PINB & 0x08);
17
18
    if ( temp == 0 )
19
    {
20
        set_PORTB_bit(4,1);  // taster gedrückt
21
    }
22
    else
23
    {
24
        set_PORTB_bit(4,0);  // taster off
25
    }
26
  }
27
  
28
}
29
30
// Initialisierung des LCD
31
32
 int set_PORTB_bit(int position, int value)
33
34
35
{
36
 
37
   
38
  while(1)
39
  {
40
  lcd_init();
41
  lcd_string("Test");
42
  lcd_setcursor( 0, 2 );
43
  
44
  if (value == 0)
45
  {
46
  lcd_string("Taster ON");
47
  }
48
  else
49
  {
50
  lcd_string("Taster OFF");
51
  }
52
  
53
 }
54
  return 0;
55
  }

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Nimm die while-Schleife in der Funktion set_PORTB_bit raus. Damit 
erzeugst Du eine Endlosschleife, aus der Du nicht mehr rauskommst.

Ausserdem würde ich

  lcd_init();
  lcd_string("Test");

in die main-Funktion vor das for() schreiben, damit das nicht jedes Mal 
wieder gemacht wird.

Bedenke auch, dass Du set_PORTB_bit() viele hunderttausendmal pro 
Sekunde aufrufst. Überlege Dir, wie Du diese Funktion nur bei Änderungen 
aufrufst.

von Karl H. (kbuchegg)


Lesenswert?

Mit dieser Funktion

>  int set_PORTB_bit(int position, int value)

trickst du dich massiv selber aus. Du erzeugst da eine Komplexität, die 
für dich noch zu hoch ist und die du nicht mehr überblickst.

Was spricht gegen die ganz einfache Variante
1
int main(void)
2
{
3
  int temp;
4
5
  lcd_init();
6
  lcd_string("Test");
7
  lcd_setcursor( 0, 2 );
8
  
9
  for ( ; 1==1 ; )
10
  {
11
    temp = (PINB & 0x08);
12
13
    if ( temp == 0 )
14
    {
15
      lcd_string("Taster ON");
16
    }
17
    else
18
    {
19
      lcd_string("Taster OFF");
20
    }
21
  }
22
}

Ist dir das zu einfach, zu simpel, zu geschmacklos?

Und nochwas: Was du gelernt haben solltest - die Idee, dass man aus 2 
getrennten Programmen ein einziges macht, indem man sie zusammenkopiert 
und irgendwie da Aufrufe von einem 'Programm' in das 'andere Programm' 
macht - die Idee funktioniert nicht.
Betrachte jedes Programm, welches du schreibst als ein neues Programm. 
Du kannst Einzelteile und Ideen und Codeabschnitte oft aus 
Vorgängerprogrammen übernehmen und weiterverwenden (so wie hier), aber 
grundsätzlich schreibst du IMMER ein neues Programm.

von Randy T. (peroja)


Lesenswert?

Karl Heinz

Je einfacher desto besser. Und nein es ist mir nicht zu einfach, zu 
simpel und zu geschmacklos. Du hast mich natürlich dabei ertappt aus 2 
mach 1 und ja sollte man natürlich nicht machen. Ich lerne gerne neues 
dazu. Vielen dank erstmal für deine gedankenstütze, aber direkt 
umgesetzt erzeugt mir dein code einen text der rollt. die funktion des 
tasters ist zwar gelöst aber nun kann ich nix erkennen weil der text so 
schnell vorbeirennt.....

LG
Pero

von Karl H. (kbuchegg)


Lesenswert?

Randy Tomlinson schrieb:

> simpel und zu geschmacklos. Du hast mich natürlich dabei ertappt aus 2
> mach 1 und ja sollte man natürlich nicht machen.

Im Laufe der Zeit lernt man eben gewisse Muster zu sehen

> Ich lerne gerne neues
> dazu. Vielen dank erstmal für deine gedankenstütze, aber direkt
> umgesetzt erzeugt mir dein code einen text der rollt.

> die funktion des
> tasters ist zwar gelöst aber nun kann ich nix erkennen weil der text so
> schnell vorbeirennt.....

Tja. Dann musst du dir was dazu einfallen lassen.
'Eine' Lösung, allerdings nicht die beste, ist es wenn der Text immer an 
derselben Stelle am LCD auftauchen würde.
Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die 
nächste Textausgabe beginnen soll. Hmmm .......

von Randy T. (peroja)


Lesenswert?

Karl Heinz Buchegger schrieb:

> Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die
> nächste Textausgabe beginnen soll. Hmmm .......


du meinst "lcd_setcursor( 0, 2 );" ??
die ist doch da..... ich steh auf m schlauch beschämtguck

von Karl H. (kbuchegg)


Lesenswert?

Randy Tomlinson schrieb:
> Karl Heinz Buchegger schrieb:
>
>> Hmm. Da gibt es doch eine Funktion, mit der man bestimmen kann, wo die
>> nächste Textausgabe beginnen soll. Hmmm .......
>
>
> du meinst "lcd_setcursor( 0, 2 );" ??
> die ist doch da.....


Wo 'genau'(!) steht das?

Wenn diese Positionierung nur EINMAL, ganz am Anfang, gemacht wird, dann 
wird sie auch nur EINMAL gemacht. Du gibst aber IN DER SCHLEIFE laufend 
Texte aus! Nur weil du EINMALIG den Cursor positioniert hast, gilt das 
nicht automatisch für alle weiteren Folgetexte. Nur der NÄCHSTE Text 
beginnt an dieser POsition. Danach wandert die Ausgabeposition (der 
Cursor) mit den Buchstaben dieses Textes mit und alle weiteren Texte 
werden ab der dann jeweils gültigen Cursorposition ausgegeben.

Das ist wie wenn du im Editor tippst. Der _ sagt dir, wo der nächste 
Buchstabe erscheinen wird. Tippst du einen Buchstaben, dann wandert der 
_ um 1 Stelle weiter. Und der nächste Buchstabe erscheint dann dort usw.
Wenn du den Cursor wo anders haben willst, dann musst du eine Aktion 
setzen. In dem Fall dieser LCD Routinen ist das eben der Aufruf von 
lcd_setcursor.

von Randy T. (peroja)


Lesenswert?

ok bin drauf gekommen
ein kleiner schönheitsfehler hat es noch
wenn ich die worte ON und OFF nutze dann bleibt ein F hängen wenn ich 
den taster loslasse (ONF) mit einem "EIN / AUS" hab ich natürlich eine 
billige lösung gefunden....
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
  int temp;
8
  
9
  {
10
  lcd_init();
11
  lcd_string("Test");
12
  
13
  
14
  for ( ; 1==1 ; )
15
  {
16
    temp = (PINB & 0x08);
17
18
    if ( temp == 0 )
19
    {
20
      
21
    lcd_setcursor( 0, 2 );
22
    lcd_string("Taster AUS");
23
    }
24
    else
25
    {
26
      
27
    lcd_setcursor( 0, 2 );
28
    lcd_string("Taster EIN");
29
    }
30
  }
31
  }
32
 }

so und nun versuche ich ein ein / aus bei welchem der status jeweils 
beim drücken des buttons bleibt, also 1x drücken ein und nochmal drücken 
aus....

von Karl H. (kbuchegg)


Lesenswert?

Randy Tomlinson schrieb:
> ok bin drauf gekommen
> ein kleiner schönheitsfehler hat es noch
> wenn ich die worte ON und OFF nutze dann bleibt ein F hängen wenn ich
> den taster loslasse (ONF) mit einem "EIN / AUS" hab ich natürlich eine
> billige lösung gefunden....

Die andere billige Lösung besteht darin, nicht
"Taster ON" sondern "TASTER ON " auszugeben. Das Leerzeichen nach dem N 
überschreibt dann das ansonsten übrig bleibende F von OFF.
Auch ein Leerzeichen ist ein Zeichen!

> so und nun versuche ich ein ein / aus bei welchem der status jeweils
> beim drücken des buttons bleibt, also 1x drücken ein und nochmal drücken
> aus....

Das ist erstaunlich schwierig. Stell es noch zurück. Da gibt es noch 
viele andere Dinge, die du vorziehen kannst und auch vorziehen sollst.

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.