PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tastendrücke und Portpins



Ferrer
16.11.2007, 14:09
Hallo,

ich weiss selber nicht so ganz genau, was ich von dieser Frage halten
soll. Auf jeden Fall aber hat Sie mich gestern mind. 4 Std. Fehlersuche
gekostet unbd ich steh halt immer noch genauso dumm da wie vorher??
Kann mir also bitte Jemand das Mysteruim dieser Funktion erklären, die
ein zwölftastites Tastenfeld (Matrix) ausließt, indem man immer eine
Reihe auf Null zieht und dann schaut ob in irgendeiner Spalte
irgendetwas auf Null gezogen ist. Aus dem "Schnittpunkt" ergibt sich
halt die Taste, wenn denn eine gedrückt wurde. Das funzt soweit auch
vorzüglich, nur wenn ich jetzt die Bits in PORTB einzeln setze, wie in
den Kommentaren angemerkt, dann gehts gar nicht mehr. Was dumm ist, denn
das Tastenfeld braucht nur sieben Pins und ich würde halt gerne den
achten (PB7) auch noch verwenden, was halt nicht geht, wenn ich den PORT
gesamt setze.
Ich weiss nicht ob man für diese Frage noch mehr Infos braucht, aber
Fakt ist halt dass, es in der "PORTB="-Version geht und in der
"PORTB|="-Version nicht...(im Prgramm benutze ich selbstverständlich
immer nur eine Version des ganzen).
Ach ja, und entprellt ist das ganze auch, aber als komplette Funktion im
Stile von: Funktion()...warte soundsolange... Funktion()

vielen Dank für eure Hilfe
ich bin mit meinem Latein am Ende
Jakob

[c]
char scan_taste() {
//init von PORTB
//PORTB=0b11111111;
//DDRB= 0b11111000;
volatile uint8_t C =0;
// C wird an switch übergeben
//am Anfang ist R0 auf 5V
cli();
/* geht leider nicht
PORTB= (0b01110111 | (PORTB & (1<<PB7)));
*/

/*geht leider nicht
PORTB setzen einzeln
PORTB |= (1<<PB6) | (1<<PB5) | (1<<PB4) | (1<<PB2) | (1<<PB1) | (1<<PB0);
PORTB &= ~(1<<PB3)
*/
/* nur das geht???
PORTB= 0b01110111
*/

C=234; //um irgendwas zu machen zwischen
//schreiben und lesen
C|=0xDD;
C = PINB | 0b11111000; //um die drei letzten bits zu vergl.
sei(); // wenn Pin0=Col.3 gedrückt--> PORTB: 0b01111110, wenn in R0
switch(C) {
case 0b11111111 : break; //nix in R0 gedrückt, nix Passiert
case 0b11111011 : return 10;
case 0b11111101 : return 11;
case 0b11111110 : return 12;
}
cli();
PORTB=(0b01101111| (PORTB & (1<<PB7)));
//PIND4= log.1 --->R1=5V, andere Rs=0V
//PIND5-6 und PIND3= log.0
C=234;
C|=0xDD;
C= PINB | 0b11111000;
sei(); //if (B==1){PORTB |= (1<<PB7);}
switch(C) {
case 0b11111111 : break; //nix gedrückt in R1, nix Passiert
case 0b11111011 : return 1;
case 0b11111101 : return 2;
case 0b11111110 : return 3;
}

cli();
PORTB=(0b01011111| (PORTB & (1<<PB7)));;
//PIND5= log.1 --->R2=5V, andere Rs=0V
//PIND3-4 und PIND6= log.0
C=234;
C|=0xDD;
C= PINB | 0b11111000;
sei();
switch(C) {
case 0b11111111 : break; //nix gedrückt in R2, nix Passiert
case 0b11111011 : return 4;
case 0b11111101 : return 5;
case 0b11111110 : return 6;
}
cli();
PORTB=(0b00111111 | (PORTB & (1<<PB7)));
//PIND6= log.1 --->R3=5V, andere Rs=0V
//PIND3-5= log.0
C=234;
C|=0xDD;
C= PINB | 0b11111000;
sei();
switch(C) {
case 0b11111111 : break ; //nix gedrückt in R3, nix Passiert
case 0b11111011 : return 7;
case 0b11111101 : return 8;
case 0b11111110 : return 9;
}
return 0;
}
[\c]

HF SHOOTER
16.11.2007, 17:36
Hi

setze bitte deinen Code in die Code Tags (code nicht c) so tut man sich schwer beim lesen.
Meines Wissens kommt der Wert der mit Return zurückgeliefert wird in ().

Arbeitest Du mit Interrupt? - oder warum das sei() und cli() ?


/* geht leider nicht
PORTB= (0b01110111 | (PORTB & (1<<PB7)));
*/
Das setzt da es eine ODER-Verknüpfung ist den PORTB immer auf 0b1111x111
x kann nur auf 1 gesetzt werden aber icht auf 0 da es hier nur eine ODER-Verknüpfung ist.

Habe ich das richtig Verstanden das du an PortB glecihzeitig lesen und schreiben willst, wenn ja dann musst du auch ständig die DDR von PortB ändern:


//DDRB= 0b11111000;
....
....
C=234;
C|=0xDD;
C= PINB | 0b11111000;
Du kannst nichts lesen (PINB) wenn Du sie vorher als Ausgänge definiert hast.


PORTB=(0b00111111 | (PORTB & (1<<PB7)));
Wieder das Problem das es eine ODER-Verknüpfung ist. Die Anweisung bewirkt:

PORTB = 0b1x111111
Auf Null setzen kannste PB6 mit dieser Anweisung nicht, PB6 wird durch diese Anweisung nicht verändert.

So ich hoffe dir geht nun ein Licht auf :-)

mfg
Benny



mfg
Benny