Hallo Leute,
ich habe einen standart-servo von conrad an einen mega8 (8mhz) angeschlossen. Zur ansteuerung benutze ich den code aus RN-Wissen.
Ich will erreichen, dass jedes mal, wenn ich den taster drücke die position geändert wird. wenn der servo an der einen seite angekommen ist wird die position jedes mal in die andere richtung geändert. allerdings funktioniert das programm nicht:
ich weiß nicht, woran es liegtCode:#include <avr/io.h> #include <avr/interrupt.h> #include <inttypes.h> #include <util/delay.h> #define SERVOPIN 7 #define SERVOPORT PORTD #define DDRSERVO DDRD #define BUTTON !(PIND & (1 << PD2 )) volatile unsigned char servopos; void servo_init() { TIMSK|=(1<<OCIE2); TCCR2 |= (1<<WGM21) | (1<<CS20); //Prescale=1, CTC mode OCR2 = 80; //alle 10µS ein IRQ bei 8mhz DDRSERVO|=(1<<SERVOPIN); sei(); } ISR(TIMER2_COMP_vect) { static int count = 1; if(count>servopos)SERVOPORT&=~(1<<SERVOPIN); else SERVOPORT|=(1<<SERVOPIN); if(count<2000+servopos){count++;} else{count=0;} } int main(void) { DDRD &= ~(1<<PD2); //Taster DDRC |= (1<<PC5); //LED PORTC &= ~(1<<PC5);//einschalten servo_init(); int r = 5; servopos = 150; //servo in mittelposition while(1) { if(BUTTON) { servopos = servopos + r; if( servopos > 200 ) { servopos = 200; r = -1; } if( servopos < 100 ) { servopos = 100; r = 1; } _delay_ms(50) //taster entprellen } } return 0; }![]()
komischer weise flackert die LED zwischen drinn, darum vermute ich, dass irgendwie ein reset durchgeführt wird...
danke schon mal für eure hilfe
Lesezeichen