PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tasten auswertung Fehler?



Cybrix
15.06.2005, 09:27
Moin

Ich hab ein Tastenfeld gebaut was mir die gedrückte Taste als 4 bit signal an den Atmega 16 liefert .

Aber so wie es aussieht hab ich ein fehler in der auswertung im Programm gemacht und ich find denn Fehler nicht.

Bin in Sachen C programmierung noch ein Anfänger!


/ ** Präprozessor ** //

#include <avr/io.h>
#include <stdint.h>

// ** Prototypen ** //

void kp_init (void);
char kp_taste (void);


// ** Funktionen ** //

void kp_init (void) // Initialisierung des Keypads
{

DDRA = 0b00000000; //Port A Pin 1,2,3 als Ausgang , Pin4-8 als Eingang
PINA = 0x00; //Port A auf low setzen
}

char kp_taste (void) //Routine zur Abfrage der Tasten
{

while (!PINA) {


switch (PINA){

case 0b00000001:
return '1';
case 0b00000010:
return '2';
case 0b00000011:
return '3';
case 0b00000100:
return '4';
case 0b00000101:
return '5';
case 0b00000110:
return '6';
case 0b00000111:
return '7';
case 0b00001000:
return '8';
case 0b00001001:
return '9';
case 0b00001010:
return '0';
case 0b00001011:
return 'z';
case 0b00001100:
return 'e';
case 0b00001101:
return 'a';
case 0b00001110:
return 'b';
case 0b00001111:
return 'c';
}
}
}


Danke schonmal im vorraus für eure Hilfe

Cybrix

PicNick
15.06.2005, 10:03
Das scheint mir nicht richtig:


DDRA = 0b00000000; //Port A Pin 1,2,3 als Ausgang , Pin4-8 als Eingang
PINA = 0x00; //Port A auf low setzen

du setzt das komplette port auf Input und beim setzen solltest du "PORTA" sagen (PIN ist immer input)
Beim Lesen und Auswerten von Pina darfst du nur die input-Bits abfragen.
Wenn der Kommentar-Text deine Absicht darstellt, empfehle ich dir:


void kp_init (void) // Initialisierung des Keypads
{
DDRA = 0b00001111; //Port A Pin 1,2,3 als Ausgang , Pin4-8 als Eingang
PORTA = 0x00; //Port A auf low setzen
}

char kp_taste (void) //Routine zur Abfrage der Tasten
{
char bTmp;
do {
bTmp = PINA >> 4; // Tasten code in das untere Nibble
switch (bTmp)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
return(bTmp | 0x30); // 0x0n ---> 0x3n --> ascii: 'n'
break;
case 10: return '0'; break;
case 11: return 'z'; break;
case 12: return 'e'; break;
case 13: return 'a'; break;
case 14: return 'b'; break;
case 15: return 'c'; break;
default: break;
} while (1);
return'X'; // das ist nur, falls der Compiler meutert.
}

kp- taste läuft ewig, bis irgendein "case" return durchführt.
von 1-0 reicht eine einfache Umsetzung auf ascii

Cybrix
15.06.2005, 10:33
Danke werde ich gleich mal ausprobieren!

Und mich dann nochmal melden ob es geklappt hat!

Ach ja das mit dem Kommentar beim definieren, PORTA soll insgesamt als eingang beschaltet sein, kam noch von einem anderem Versuch

Cybrix
15.06.2005, 11:58
Moin

Also im Programm ist irgendwie ein fehler hab ihn aber noch nicht gefunden.

Das Tastenfeld ist an PIN 0-3 angeschlossen.

Ich hab mal eine auswahl dafür geschrieben! Wäre nett wenn du mir sagen könntest ob das so klappt.


void auswahl_ah (void){

int run=0;
char taste='x';
taste=kp_taste();

kp_taste();

if ((taste='a')) {
men_auto();
run=0;
}
else if ((taste='b')) {
men_hand();
run=0;
}
else {
men_fehler();
}
}

men_hand()
men_auto()

sind funktion fürs display

PicNick
15.06.2005, 12:49
Na ja, wenn die Tasten doch auf Pin 0-3 sind, muß ">>4" entfallen, dafür wäre gut
bTmp = PINA & 0x0F; // nur das untere Nibble

sonst sieht das ok aus, (einen kp-taste() hast du zuviel)
ich persönlich würde halt auch einen "switch" machen, weil ich diese "else-Bäume" nicht so mag (Geschmackssache)
taste = kp_taste();
switch(taste)
{
case 'a': ..
break;
case 'b': ..
break;
default:
fehler
break;
}

Cybrix
15.06.2005, 13:02
danke es funz jetzt! Hast mir echt weitergeholfen!

Ich hab das jetzt auch in ne switch anweisung verändert!