Und wenn der Taster nicht gedrückt ist, auf welchem Potential liegen die Eingänge dann?
Es ist immer wichtig, die Eingänge auf definiertem Potential zu haben. Wenn der Taster gegen High schaltet, muss der Eingang sonst auf Low gezogen werden.
Moin,
ich bin an einer einfachen 2 Tasterschaltung zugange mein erstes AVR projekt, leider will das Programm noch nicht ganz
ich bekomme das mit den Eingängen nicht ganz hin. Die Leds habe ich vorher mit einem einfachen Led Testprogramm überprüft.
Die schalter senden ein HIGH level Signal dazu habe ich 10KOhm widerstände verwendet
Code:#define F_CPU 10000000UL #include <avr/io.h> #include <util/delay.h> void PowerOn(){ /**********Start Powerleds*******************/ DDRB |= 1<<PB0; /* set PB0 to output */ DDRB |= 1<<PB1; /* set PB1 to output */ PORTB |= (1 << PB0); /* LED0 on */ PORTB |= (1 << PB1); /* LED1 on */ /********************************************/ } void setPins(){ /**************Input*************************/ DDRB &= ~(1 << PB2); /* set PB2 to input*/ PORTB |= (1 << PB2); DDRB &= ~(1 << PB3); /* set PB3 to input*/ PORTB |= (1 << PB5); /********************************************/ /**************Ouput*************************/ DDRD |= 1<<PD6; /* set PB6 to output */ DDRD |= 1<<PD7; /* set PB7 to output */ PORTD &= ~(1<<PD6); /* PD6 off */ PORTD &= ~(1<<PD7); /* PD7 off */ /********************************************/ } void eventhandler(){ /**********Read Input PB2 and PB3*************/ if( !(PINB & (1 << PB2)) ) { PORTD |= 1<<PD6; /* LED on */ }else { PORTD &= ~(1<<PD6); /* LED off */ } if(!(PINB & (1 << PB3)) ){ PORTD |= 1<<PD7; /* LED on */ }else{ PORTD &= ~(1<<PD7); /* LED off */ } } int main(void) { setPins(); PowerOn(); while(1) { // eventhandler(); } return 0; }
Geändert von Tuxist (02.05.2012 um 15:51 Uhr)
Und wenn der Taster nicht gedrückt ist, auf welchem Potential liegen die Eingänge dann?
Es ist immer wichtig, die Eingänge auf definiertem Potential zu haben. Wenn der Taster gegen High schaltet, muss der Eingang sonst auf Low gezogen werden.
雅思特史特芬
开发及研究
Kannst du das Verhalten kurz beschreiben. Sind die LEDs immer aus wenn du den Taster gedrückt hältst? Sind die Taster hardwareseitig entprellt?
雅思特史特芬
开发及研究
Die Taster sind nicht entprellt das wollte ich später machen. Wenn ich die Bedingung auf "if((PINB & (1 << PB2)) )" setzte leuchten sie immer. Auf die Taster folgt keine Reaktion.
Du aktivierst die internen Pull-Ups und hast externe Pull-Downs.
Welchen Pegel soll das denn dann ergeben bei nicht gedrückter Taste?
MfG
Stefan
habe ich wieder rausgenommen: PORTB |= (1 << PB2);wollte sehen ob vllt irgendwas mit den Widerständen nicht passt, habe ich aber gerade gerade nach gemessen sind in Ordnung.
Wäre in dem Fall
DDRB &= ~(1 << PB3); /* set PB3 to input*/ PORTB |= (1 << PB5);
aber sowieso egal.
Hast du den ISP Adapter immer angesteckt?
Würde ich mal ohne testen. Ansonsten mal den Pegel an den Pins messen.
雅思特史特芬
开发及研究
Habe den ISP Adapter abgesteckt leider ohne erfolg. Habe den Code nochmal über arbeitet und bereinigt.
Code:#define F_CPU 10000000UL #include <avr/io.h> #include <util/delay.h> void PowerOn(){ /**********Start Powerleds*******************/ DDRB |= 1<<PB0; /* set PB0 to output */ DDRB |= 1<<PB1; /* set PB1 to output */ PORTB |= (1 << PB0); /* LED0 on */ PORTB |= (1 << PB1); /* LED1 on */ /********************************************/ } void setPins(){ /**************Input*************************/ DDRB &= ~(1 << PB2); /* set PB2 to input*/ DDRB &= ~(1 << PB3); /* set PB3 to input*/ /********************************************/ /**************Ouput*************************/ DDRD |= 1<<PD6; /* set PB6 to output */ DDRD |= 1<<PD7; /* set PB7 to output */ PORTD &= ~(1<<PD6); /* PD6 off */ PORTD &= ~(1<<PD7); /* PD7 off */ /********************************************/ } void eventhandler(){ /**********Read Input PB2 and PB3*************/ if(!(PINB & (1 << PB2)) ) { PORTD |= 1<<PD6; /* LED on */ }else { PORTD &= ~(1<<PD6); /* LED off */ } if(!(PINB & (1 << PB3)) ){ PORTD |= 1<<PD7; /* LED on */ }else{ PORTD &= ~(1<<PD7); /* LED off */ } } int main(void) { setPins(); PowerOn(); while(1) { eventhandler(); } return 0; }
Lesezeichen