-         

Ergebnis 1 bis 2 von 2

Thema: Tastendrücke und Portpins

  1. #1

    Tastendrücke und Portpins

    Anzeige

    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]

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    20.10.2007
    Ort
    Bayern
    Alter
    29
    Beiträge
    116
    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() ?

    Code:
    /* 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:

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

    Code:
    PORTB=(0b00111111 | (PORTB & (1<<PB7)));
    Wieder das Problem das es eine ODER-Verknüpfung ist. Die Anweisung bewirkt:
    Code:
    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
    cooming soon...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •