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]
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]