LuZ
19.05.2008, 23:59
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:
#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;
}
ich weiß nicht, woran es liegt :(
komischer weise flackert die LED zwischen drinn, darum vermute ich, dass irgendwie ein reset durchgeführt wird...
danke schon mal für eure hilfe
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:
#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;
}
ich weiß nicht, woran es liegt :(
komischer weise flackert die LED zwischen drinn, darum vermute ich, dass irgendwie ein reset durchgeführt wird...
danke schon mal für eure hilfe