PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe in C (WinAVR)



papuadive
29.11.2008, 16:13
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
}

oberallgeier
29.11.2008, 16:36
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:

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

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?

markusj
29.11.2008, 17:17
Logisches UND schreibt man &&, dementsprechend:


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

papuadive
29.11.2008, 18:28
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

sternst
29.11.2008, 18:39
Sowohl in deiner Beschreibung, als auch im Code, vermischt du PINC3 und PINC4. Lege erstmal fest, welcher es nun tatsächlich ist.

papuadive
30.11.2008, 10:22
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

magic33
30.11.2008, 15:39
@ 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 == 118)
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)