-         

Ergebnis 1 bis 7 von 7

Thema: Brauche Hilfe in C (WinAVR)

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78

    Brauche Hilfe in C (WinAVR)

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    hi,
    da ich Anfänger bin, habe ich ein wenig Schwierigkeiten mit dem C unter WinAVR.
    Habe wahrscheinlich einen Denkfehler...
    was möchte ich mit diesen paar Zeilen erreichen:
    wenn PINC.4 NULL ist und PINB.0 auch NULL ist ins "workreg1 den Wert 42 bringen und anschließend via Jump-Bef. zum Label Taste_ged springen. Jedoch stimmt meine if(.....) Abfrage nicht!
    Weiß aber nicht warum!
    danke papua


    if ( !(PINC & (1<<PINC4)) & (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 42
    goto Taste_ged
    }

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Hi, papua,

    ich bin ja nicht der C-Papst - kann es sein, dass Du die Ports nicht richtig initialisiert hast? Bei mir läuft das:
    Code:
    //Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
    // Port B und Port C für LCDisplay ändern:
                            
      DDRB  = 0b00011111;   // siehe aktuelle Anschlussbelegung oben
            //    A  => PB5=SCK kann als Tastereingang benutzt werden, PullUpB5 = high
      PORTB = 0b11100000;   //    und Port/Pull Ups (1)  aktivieren
                            
      DDRC  = 0b01111111;   // Kein PC7-Pin bei m168PU
      PORTC = 0b00000000;   //   PC0 bis PC2 für 3 LCD-Steuerbits
    und dann läuft dieses hier:
    Code:
        if (!( PINB & (1<<PINB5)))          // mache was, wenn Pin SCK low ist
    Außerdem: gibt´s in C ein goto? Und nach den Befehlen will mein Compiler immer ein Semikolon; sonst geht nix gut. Siehe oben z.B. nach PORTC = -----; Vielleicht postest Du mal Deine Fehlermeldungen vom Compiler?
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    29
    Beiträge
    1.221
    Logisches UND schreibt man &&, dementsprechend:

    Code:
    if ( !(PINC & (1<<PINC4)) && (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 42
    goto Taste_ged
    }
    Und was das Goto angeht: Schreibe lieber eine Prozedur Taste_ged, die du dann aufrufst.
    Programmieren mit Goto macht man eigentlich nicht (mehr).

    mfG
    Markus

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78
    ja, aber irgend etwas ist noch falsch an der Sache...., zumindestens wenn ich's im AVR Studio simuliere (Startbedingung: PINC0,1,2,3 auf high)
    nochmals:
    wenn PINC.4 NULL ist und PINB.0 auch NULL ist ins "workreg1 den Wert 42 bringen und anschließend via Jump-Bef.......
    wenn ich am Simulator jetzt den PINC3 auf LOW setze, dann sollte die if-Bedingung ausgeführt werden. Ist aber nicht so!
    Was ist falsch an meiner if...Abfrage?

    hier mein Code:

    int workreg1 = 16;
    int workreg2 = 17;
    int workreg3 = 18;

    int main()
    {
    DDRB = 0b00000000;
    PORTB = 0b11111111;

    DDRC = 0b00000000;
    PORTC = 0b11111111;



    //************************************************** *****************************************
    // Tastaturabfrage 4x3
    //
    // 1. Zeile auf LOW setzen und anschließend die Eingänge C0 - C3 auf 0 abfragen und auch der Eingang B0 muss 0 sein!
    //************************************************** *****************************************
    do
    {
    DDRB = 0b00000001;
    PORTB = 0b11111110; // erste Reihe auf 0 setzen
    // _delay_us(10); // warte 10µs


    if ( !(PINC & (1<<PINC4)) && (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 42; // Taste * wurde gedrückt (42 Dez.)
    goto Taste_ged;
    }
    else if ( !(PINC & (1<<PINC2)) && (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 7; //Taste 7 wurde gedrückt
    goto Taste_ged;
    }
    else if ( !(PINC & (1<<PINC1)) && (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 4; //Taste 4 wurde gedrückt
    goto Taste_ged;
    }
    else if ( !(PINC & (1<<PINC0)) && (!(PINB & (1<<PINB0)) ) )
    { workreg1 = 1; //Taste 1 wurde gedrück€t
    goto Taste_ged;
    }


    // else _delay_us(10);

    DDRB = 0b00000000;
    PORTB = 0b11111111; // erste Reihe auf 1 setzen durch Pullup

    // _delay_us(10);

    //************************************************** **************************
    // 2. Zeile auf LOW setzen und anschließend die Eingänge C0 - C3 auf "0" abfragen
    //************************************************** **************************
    usw. --> das ganz noch 2x
    danke papua

  5. #5
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Sowohl in deiner Beschreibung, als auch im Code, vermischt du PINC3 und PINC4. Lege erstmal fest, welcher es nun tatsächlich ist.
    MfG
    Stefan

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    26.03.2006
    Beiträge
    78
    ja, du hast recht....
    hab diesen Fehler zig-mal übersehen....
    Blöd von mir!
    dank dir nochmals
    Frage: nachdem ich jetzt die Taste ermittelt habe, muss ich das Tasterprellen in den Griff bekommen.
    Aber wie läuft das eingentlich ab? Ist das kompliziert zu programmieren, od.?
    Na ja, wie geht's jetzt weiter?.
    papua

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    @ Papuadive
    machs doch nicht so kompliziert wenn das auch einfach geht
    uint8_t taste_lesen()
    {
    uint8_t keys = 0;
    char wert ='-';
    PORTD=0x03;
    _delay_us( 10 );
    keys = PIND;
    if (keys == 115)
    wert ='3';
    if (keys == 179)
    wert ='6';
    if (keys == 211)
    wert ='9';
    if (keys == 227)
    wert ='#';
    PORTD=0x05;
    _delay_us( 10 );
    keys = PIND;
    if (keys == 117)
    wert ='2';
    if (keys == 181)
    wert ='5';
    if (keys == 213)
    wert ='8';
    if (keys == 229)
    wert ='0';
    PORTD=0x06;
    _delay_us( 10 );
    keys = PIND;
    if (keys == 11
    wert ='1';
    if (keys == 182)
    wert ='4';
    if (keys == 214)
    wert ='7';
    if (keys == 230)
    wert ='*';
    keys =wert;
    _delay_us( 10 );
    return keys;
    }

    Diese funktion fragt deine Tasten ab (Indiotensicher)

Berechtigungen

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