mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arrays sollen taster aufnehmen


Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/io.h>
#include "lcd-routines.h"
#include <stdlib.h>
#include <util/delay.h>

#define taster_a (!(PIND & (1<<PIND3)))
#define taster_b (!(PIND & (1<<PIND2)))
#define taster_c (!(PIND & (1<<PIND4)))
#define u_int unsigned int

volatile u_int taster[5], a = 0; 

void long_delay(uint16_t ms) 
{
    for(; ms>0; ms--) _delay_ms(1);
}

void kein_taster(void)
{
  a = 1;
  while(a == 1)
  {
    long_delay(20);
    if((!(taster_b)) && (!(taster_a)) && (!(taster_c)))
    {
      a = 0;
    }
  }
}

int main(void)
{
  taster[0] = 0;
  taster[1] = 0;
  taster[2] = 0;
  taster[3] = 0;
  taster[4] = 0;
  lcd_init();
  for (u_int counter = 0; counter < 5; counter ++)
  {
    lcd_clear();
    set_cursor(0,0);
    char Buffer[20];
    itoa( counter, Buffer, 10 ); 
    lcd_string("Taste Nr.");
    lcd_string( Buffer );
    while (taster[counter] == 0)
    {
      if (taster_b)
      {
        kein_taster();
        taster[counter] = 1;
      }
      else if (taster_a)
      {
        kein_taster();
        taster[counter] = 2;
      }
      else if (taster_c)
      {
        kein_taster();
        taster[counter] = 3;
      }
    }
  }
  lcd_clear();
  set_cursor(0,0);
  
  for (u_int counter = 0; counter < 5; counter ++)
  {
    if (taster[counter] == 1)
    {
      lcd_string("b");
    }
    else if (taster[counter] == 2)
    {
      lcd_string("a");
    }
    else if (taster[counter] == 3)
    {
      lcd_string("c");
    }
    else
    {
      lcd_string("err.");
    }
  }
  long_delay(5000);
}

Autor: Chris H. (wuselwutz)
Datum:

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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Hennig (stefanhennig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Stefan Hennig (stefanhennig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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:
array1[counter] = messwert;
array2[counter] = zeitpunkt;
counter ++;

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

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

Autor: Stefan Hennig (stefanhennig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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:
eeprom_write_byte(&eeFooByte, variable1);
eeprom_write_byte(&eeFooByte, variable2);
eeprom_write_byte(&eeFooByte, variable3);

variable1 = eeprom_read_byte(&eeFooByte);
variable2 = eeprom_read_byte(&eeFooByte);
variable3 = eeprom_read_byte(&eeFooByte);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick R. schrieb:

> wenn ich mehrere variablen in den EEprom schreibe und dann wieder lesen
> will. Stimmt das dann so:
>
> eeprom_write_byte(&eeFooByte, variable1);
> eeprom_write_byte(&eeFooByte, variable2);
> eeprom_write_byte(&eeFooByte, variable3);
> 
> variable1 = eeprom_read_byte(&eeFooByte);
> variable2 = eeprom_read_byte(&eeFooByte);
> variable3 = eeprom_read_byte(&eeFooByte);
> 

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-Tu...

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK thx @all jetzt funktionierts :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.