Wie sieht denn die Spannungsversorgung der Schaltung aus? Hast du ein 100n Kerko am AVR? Wird das Servo von der gleichen Spannung versorgt wie der AVR???
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
Wie sieht denn die Spannungsversorgung der Schaltung aus? Hast du ein 100n Kerko am AVR? Wird das Servo von der gleichen Spannung versorgt wie der AVR???
...wer nicht findet hat nicht gesucht...
Hallo
Vermutlich sind die Stromspitzen beim Starten des Servos für die Resets verantwortlich. Ein Servo an einem Mega8 mit der Ansteuerung aus dem RN-Wissen ist auch hier das Thema:
https://www.roboternetz.de/phpBB2/ze...ag.php?t=40164
if(count<2000+servopos){count++;} scheint mir allerdings nicht richtig. So entsteht zwischen den Impulsen eine 20ms-Pause. Der Impuls soll aber alle 20ms wiederholt werden, d.h. alle 20ms ein Impulsanfang.
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
@rideyourstyle: da ist ein 100n Kerko am AVR. Wenn ich das Servo mit einer externen spannung versoge klappt es um einiges besser und die LED flackert nicht mehr
@radbruch: das if(count<2000+servopos)count++; steht so im RN-Wissen. ich war da auch schon etwas skeptisch. es müsste dann doch eigentlich minus servopos heißen, also if(count<2000-servopos) oder?!
mfg luz
Also ich habe die Erfahrung gemacht, dass man fast nie zuviel Kerkos und Elkos in einer Schaltung haben kann
...wer nicht findet hat nicht gesucht...
Weder noch. if(count<2000) wäre richtig. Dann würde die ISR nach 20ms neu gestartet werden.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
jo das hab ich jetzt auch gemerkt. klappt alles super. Danke für eure hilfe
mfg
Lesezeichen