Forum: Mikrocontroller und Digitale Elektronik Arrays sollen taster aufnehmen


von Patrick R. (pat711)


Lesenswert?

Guten Tag zusammen,

Hab ein kleines Problem:
Und zwar wollte ich die Reihenfolge von tastern in einem array 
abspeichern und nach 5 eingaben diese auf dem LCD wieder ausgeben. wenn 
ich nun das Programm starte wird zwar "Taste Nr. 0" angezeigt aber wenn 
ich auf den tastern rum drücke passiert gar nichts???
kann mir da vll jemand behilflich sein?

Hier mein Code:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <stdlib.h>
4
#include <util/delay.h>
5
6
#define taster_a (!(PIND & (1<<PIND3)))
7
#define taster_b (!(PIND & (1<<PIND2)))
8
#define taster_c (!(PIND & (1<<PIND4)))
9
#define u_int unsigned int
10
11
volatile u_int taster[5], a = 0; 
12
13
void long_delay(uint16_t ms) 
14
{
15
    for(; ms>0; ms--) _delay_ms(1);
16
}
17
18
void kein_taster(void)
19
{
20
  a = 1;
21
  while(a == 1)
22
  {
23
    long_delay(20);
24
    if((!(taster_b)) && (!(taster_a)) && (!(taster_c)))
25
    {
26
      a = 0;
27
    }
28
  }
29
}
30
31
int main(void)
32
{
33
  taster[0] = 0;
34
  taster[1] = 0;
35
  taster[2] = 0;
36
  taster[3] = 0;
37
  taster[4] = 0;
38
  lcd_init();
39
  for (u_int counter = 0; counter < 5; counter ++)
40
  {
41
    lcd_clear();
42
    set_cursor(0,0);
43
    char Buffer[20];
44
    itoa( counter, Buffer, 10 ); 
45
    lcd_string("Taste Nr.");
46
    lcd_string( Buffer );
47
    while (taster[counter] == 0)
48
    {
49
      if (taster_b)
50
      {
51
        kein_taster();
52
        taster[counter] = 1;
53
      }
54
      else if (taster_a)
55
      {
56
        kein_taster();
57
        taster[counter] = 2;
58
      }
59
      else if (taster_c)
60
      {
61
        kein_taster();
62
        taster[counter] = 3;
63
      }
64
    }
65
  }
66
  lcd_clear();
67
  set_cursor(0,0);
68
  
69
  for (u_int counter = 0; counter < 5; counter ++)
70
  {
71
    if (taster[counter] == 1)
72
    {
73
      lcd_string("b");
74
    }
75
    else if (taster[counter] == 2)
76
    {
77
      lcd_string("a");
78
    }
79
    else if (taster[counter] == 3)
80
    {
81
      lcd_string("c");
82
    }
83
    else
84
    {
85
      lcd_string("err.");
86
    }
87
  }
88
  long_delay(5000);
89
}

von Chris H. (wuselwutz)


Lesenswert?

Schau dir deinen Code doch selber noch einmal in Ruhe an. Möchtest Du 
die Taster ein einziges Mal auslesen oder immer wieder?

von Patrick R. (pat711)


Lesenswert?

naja durch die for-schleife werden die Taster ja für jeden Teil des 
Arrays ein mal abgefragt, also insgesamt 5 mal...

Und das Ganze Programm soll erst einmal nur ein mal durchlaufen

von Stefan H. (stefanhennig)


Lesenswert?

Blöde Frage: Wo werden die Ports initialisiert, also auf Input 
geschaltet, etc.?
Ich kenne Deine Hardware ja nicht, aber das würde ich irgendwo ganz am 
Anfang erwarten.

von Karl H. (kbuchegg)


Lesenswert?

long_delay(20);


und du denkst du kannst innerhalb von 20 Millisekunden einen Taster 
drücken und wieder loslassen?

Denn: Wenn du einen Taster drückst, wird das zwar registriert, aber ~20 
Millisekunden später kommt die nächste Abfrage, ob eine Taste gedrückt 
ist.


    if((!(taster_b)) && (!(taster_a)) && (!(taster_c)))

Probier mal alle 3 Taster gleichzeitig drücken :-)

von Stefan H. (stefanhennig)


Lesenswert?

Nö, entweder ich bin übermüdet, oder er prüft alle 20ms ob alle Taster 
losgelassen sind, bevor es weiter geht. Der Busy-Wait ist zwar sinnlos 
aber m.E. harmlos.
Korrektur: Der Busy-Wait will wohl entprellen, damit nicht sinnlos. Aber 
dann müsste eigentlich nochmal im "Alle-Tasten losgelassen 
erkannt"-Zweig gewartet werden.

von Karl H. (kbuchegg)


Lesenswert?

Stefan Hennig schrieb:
> Nö, entweder ich bin übermüdet, oder er prüft alle 20ms ob alle Taster
> losgelassen sind, bevor es weiter geht.

Da könnte was drann sein.
Die vielen ! machen mich ganz konfus :-)

TO:
Was ist der genau Zweck der Funktion kein_Taster()?
Worauf soll die warten?
a) bis eine Taste gedrückt wird
b) bis alle Tasten losgelassen wurden

-> PeDa Entprellung zur Tastenabfrage benutzen. Da stellt sich dieses 
Problem gleich gar nicht :-)

von Patrick R. (pat711)


Lesenswert?

die Funktion kein_taster(); habe ich als ganz unprofesionelle 
entprellung genutzt. ^^

In diesem prog wollte ich erst mal ausprobieren wie das mit den arrays 
so am besten funzt der eigentliche nutzen soll später sein, dass 
messwerte in arrays geschrieben werden. also in etwa so:
1
array1[counter] = messwert;
2
array2[counter] = zeitpunkt;
3
counter ++;

das ganze soll dann im eeprom abgepeichert werden:
1
for (u_int counter2 = 0; counter2 <= counter; counter ++)
2
{
3
     eeprom_write_byte(&eeFooByte, array1[counter2]);
4
     eeprom_write_byte(&eeFooByte, array2[counter2]);
5
}

und später dann eben wieder ausgelesen werden
1
array1[1] = eeprom_read_byte(&eeFooByte);
2
array2[1] = eeprom_read_byte(&eeFooByte);

von Stefan H. (stefanhennig)


Lesenswert?

Wie gesagt: Ich sehe keinen Grund in der Software, warum es überhaupt 
nicht gehen sollte, vorausgesetzt:
- Du verwendest den richtigen Port
- Die Ports sind nach einem Reset korrekt initialisiert (ich sehe nicht, 
dass Du das in Deinem Code machen würdest)
- Die Taster schalten in die richtige Richtung. Ich denke, in Deinem 
Code bedeutet ein gedrückter Taster ein Portbit, das auf 0 gezogen wird.
- Das würde bedeuten, dass Du irgendwo einen Pullupwiderstand verbaut 
hast, oder den Port entsprechend konfiguriert hast (s.o.)

Prüfe das doch mal.

Grüße,
 Stefan

von Peter D. (peda)


Lesenswert?

Karl heinz Buchegger schrieb:
> -> PeDa Entprellung zur Tastenabfrage benutzen. Da stellt sich dieses
> Problem gleich gar nicht :-)

Jawoll, so isses!!!

Sie erschlägt so nebenbei mindestens 10 andere häufige Probleme.

Vor allem gestattet sie einen einfachen Programmablauf ohne haufenweise 
Merkvariablen und Verzweigungen.


Peter

von Patrick R. (pat711)


Lesenswert?

oh mann...
an sowas primitivem wie nem Widerstand gescheitert Kopf gegen Wand
thx Stefan Hennig.

und auch allen anderen.

noch ne frage:
wenn ich mehrere variablen in den EEprom schreibe und dann wieder lesen 
will. Stimmt das dann so:
1
eeprom_write_byte(&eeFooByte, variable1);
2
eeprom_write_byte(&eeFooByte, variable2);
3
eeprom_write_byte(&eeFooByte, variable3);
4
5
variable1 = eeprom_read_byte(&eeFooByte);
6
variable2 = eeprom_read_byte(&eeFooByte);
7
variable3 = eeprom_read_byte(&eeFooByte);

von Karl H. (kbuchegg)


Lesenswert?

Patrick R. schrieb:

> wenn ich mehrere variablen in den EEprom schreibe und dann wieder lesen
> will. Stimmt das dann so:
>
1
> eeprom_write_byte(&eeFooByte, variable1);
2
> eeprom_write_byte(&eeFooByte, variable2);
3
> eeprom_write_byte(&eeFooByte, variable3);
4
> 
5
> variable1 = eeprom_read_byte(&eeFooByte);
6
> variable2 = eeprom_read_byte(&eeFooByte);
7
> variable3 = eeprom_read_byte(&eeFooByte);
8
>

Im Prinzip schon, wenn du für eeFooByte jedesmal eine andere Adresse 
nimmst. Sonst wird ja alles auf derselben EEPROM Adresse abgelegt.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

von Patrick R. (pat711)


Lesenswert?

Also muss in dieser Variablen ein Wert zwischen 1 und (je nach größedes 
EEproms) stehen?

wird die Adresse nicgt automatisch bestimmt? Muss ich mir nochmal 
anschaun ^^

von Patrick R. (pat711)


Lesenswert?

OK thx @all jetzt funktionierts :)

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.