Arrays sollen taster aufnehmen

OP #1516110
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
}
#1516217
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 :-)
#1516222
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.
#1516226
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 :-)
OP #1516255
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);
#1516267
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
#1516270
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
OP #1516281
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);
#1516321
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

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