avr123.nm.ru писал(а):вы сформулируйте ТЗ для вашего устройства и опубликуйте.
ТЗ?
Боюсь показаться безграмотным, но что сия аббревиатура значит?
roboforum.ruТехнический форум по робототехнике. |
|
|
avr123.nm.ru писал(а):вы сформулируйте ТЗ для вашего устройства и опубликуйте.
char gservo;//Номер сервы
long int gangle;//Управляющий импульс
const int period =1000 ; //период в 20 миллисекунд
//****************ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА***************************
void timer1_init()
{
TCCR1B = 0x00; //stop timer
//TCNT1 = gangle; //записать в регистр таймера число 3686400/1024/120(x)
//60056-среднее положение(+0.02)
TIMSK SET_B(TOIE1);//Разрешение прерывания по переполнению таймера 1
SREG SET_B(7);//Бит i в регистре SREG включен(разрешить глобальные прерывания)
TCCR1B =0x01; //Старт таймера при делителе = 1024
//Биты CS10 CS11 CS12
}
//**************ПРОЦЕДУРА ПЕРЕПОЛНЕНИЯ ТАЙМЕРА***********************
SIGNAL(SIG_OVERFLOW1)
{
PORTB CLR_B(gservo);//Выставить 0 на ножку
static int cur_state;
if(cur_state == 0) {
//вывести '1'
TCNT1=gangle; //настроить таймер на задежку t ms
cur_state = 1;
} else {
//вывести '0'
TCNT1=period;//настроить таймер на задежку (20) ms
cur_state = 0;
}
//timer1_init();
}
//************ПРОЦЕДУРА ПОЗИЦИОНИРОВАНИЯ СЕРВЫ********************
void Pos(char servo,long int angle)
{
PORTB SET_B(servo);//Выставить 1 на ножку
gservo=servo;//Номер сервы
gangle=angle;//Управляющий импульс
TCNT1=gangle;//Управляющий импульс
timer1_init();
}
avr писал(а):они должны понимать чего вы добиваетесь.
Lirzman писал(а):Чего-то я не врубаюсь.
Сделал всё как говорил aesok.
Вот чего получилось:
- Код: Выделить всё • Развернуть
char gservo;//Номер сервы
long int gangle;//Управляющий импульс
const int period =1000 ; //период в 20 миллисекунд
//****************ИНИЦИАЛИЗАЦИЯ ТАЙМЕРА***************************
void timer1_init()
{
TCCR1B = 0x00; //stop timer
//TCNT1 = gangle; //записать в регистр таймера число 3686400/1024/120(x)
//60056-среднее положение(+0.02)
TIMSK SET_B(TOIE1);//Разрешение прерывания по переполнению таймера 1
SREG SET_B(7);//Бит i в регистре SREG включен(разрешить глобальные прерывания)
TCCR1B =0x01; //Старт таймера при делителе = 1024
//Биты CS10 CS11 CS12
}
//**************ПРОЦЕДУРА ПЕРЕПОЛНЕНИЯ ТАЙМЕРА***********************
SIGNAL(SIG_OVERFLOW1)
{
PORTB CLR_B(gservo);//Выставить 0 на ножку
static int cur_state;
if(cur_state == 0) {
//вывести '1'
TCNT1=gangle; //настроить таймер на задежку t ms
cur_state = 1;
} else {
//вывести '0'
TCNT1=period;//настроить таймер на задежку (20) ms
cur_state = 0;
}
//timer1_init();
}
//************ПРОЦЕДУРА ПОЗИЦИОНИРОВАНИЯ СЕРВЫ********************
void Pos(char servo,long int angle)
{
PORTB SET_B(servo);//Выставить 1 на ножку
gservo=servo;//Номер сервы
gangle=angle;//Управляющий импульс
TCNT1=gangle;//Управляющий импульс
timer1_init();
}
По идее таймер должен зациклистя, но этого не происходит т.к надо вызвать ф-цию timer1_init(); или TCCR1B =0x01; //Старт таймера при делителе = 1024. По понятным причинам вставлять эти ф-ции в подпрограмму прерывания таймера я не могу.
Подаётся только управляющийй импульс , без 20мс периода после него.
2aesok:Или ваш вариант нерабочий, или я опять затупил :)
Lirzman писал(а):период в 20мс я ставил "на глазок" по оссциллографу
Сейчас этот форум просматривают: Google [Bot] и гости: 3