PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo geht nur kurz



traedamatic
15.01.2006, 21:36
Hallo Leute,

ich habs jetzt geschaft ein gutes Board zubasteln (noch nicht ganz fertig!) Aber immerhin ist auch ein Servo schon dran, bloß jetzt hab ich Probleme beim programmieren:
Mein Servo bewegt sich nur ein kleines Stück und dann gar nicht mehr! ich möchte aber das er von Anfang bis Ende fährt! Bestimmt hab ich nur was Kleines vergessen, aber ich finde es einfach nicht!

also hier ist mal der Code:



#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <math.h>

volatile unsigned char servowert;
volatile unsigned char puls;
volatile unsigned char zaehler;

int set_servo(volatile uint8_t pos)
{
servowert = (pos/180) + 1;
}

int main(void)
{
zaehler = 0;
sei();
DDRD |= (1<<PD7);
PORTD |= (1<<PD7);
//Timer0 übernimmt die Highphase
//muss 1ms sein also 25 Takte bei einem Prescaler von 64
puls = 25;
TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20);
TCNT2 = (255-puls);
TIMSK = (1<<TOIE2);
for(;;)
{
}
}

SIGNAL(SIG_OVERFLOW2)
{
if(zaehler == 0)
{
PORTD &= ~(0<<PD7);
TCNT2 = (255-puls);
zaehler++;
//PORTB = (0<<PB0);
}
else if ( (zaehler > 0 ) && (zaehler < 20 ) )

{
TCNT2 = (255-puls);
zaehler++;
}
else
{
TCNT2 = (255-puls);
zaehler = 0;
PORTD |= (1<<PD7);
}
}


Danke für eure hilfe!

matic

super_castle
16.01.2006, 19:47
die for-schleife wird wegoptimiert wenn sie leer ist.
setzt mal eine delay rein oder ein nop.

castle

traedamatic
16.01.2006, 20:29
Hi,

Danke für deine Antwort! Aber auch wenn ich was in die For-Schleife schreibe passiert nix anderes! Hab den Code mal bisschen umgeschrieben! Vielleicht hast du ja noch ein paar Ideen!



#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#include <math.h>
#include <avr/delay.h>

volatile unsigned char servowert;
volatile unsigned char puls;
volatile unsigned char zaehler;

int set_servo(volatile uint8_t pos)
{
servowert = (pos/180) + 1;

}



int main(void)
{
zaehler = 0;
sei();
DDRB = (1<<PB1) | (0<<PB0);
DDRD |= (1<<PD7);
PORTD |= (1<<PD7);
//Timer0 übernimmt die Highphase
//muss 1ms sein also 25 Takte bei einem Prescaler von 64
puls = 25;
TCCR2 = (1<<CS22) | (1<<WGM21) |(1<<COM21) |(1<<COM20);
TCNT2 = 6;
TIMSK = (1<<TOIE2);
while(1) {
PORTB = 0xFD;
_delay_ms(100000);
PORTB = 0xFE;
_delay_ms(100000);
}
}

SIGNAL(SIG_OVERFLOW2)
{

switch(zaehler) {
case 0:
// case 1: das da aktivieren für 2 mS Servo
PORTD |= (1<<PD7);
zaehler++;
break;
case 2:
//PORTD &= ~(0<<PD7);
PORTD &= ~(1<<PD7);
zaehler++;
break;
case 20:
zaehler = 0;
PORTD |= (1<<PD7);
break;
case 21:
zaehler = 0;
PORTD &= ~(1<<PD7);
break;

TCNT2 = 6;

}

}


gruß matic

traedamatic
16.01.2006, 20:48
Hi,

Es geht! Hatte den falsche Timer-Modus! Aber jetzt geht es immer volle Kanne nach links und will nicht mehr aufhören... Naja ich suche weider!

matic