-
Servo geht nur kurz
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:
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
-
die for-schleife wird wegoptimiert wenn sie leer ist.
setzt mal eine delay rein oder ein nop.
castle
-
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!
Code:
#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
-
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