Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe in C (WinAVR)
papuadive
29.11.2008, 17: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, 17: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?
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, 19: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
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, 11: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
@ 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)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.