Для удобства пользования форумом и поиска информации прошу придерживаться правила: 1 тема = 1 вопрос.
К примеру, если обсуждается настройка передатчика, а у вас вопрос про подключение такого же передатчика к симулятору или вопрос про другую модель передатчика - создавайте новую тему. Если вы новичок в авиамоделизме, рекомендуется прочитать статью Новичку и ссылки с нее.
Исключение только в разделе Вопросы и обсуждения по статьям
Как выложить фото, Как опубликовать видео
С уважением,
Константин.
- Начало
- » Технологии моделизма
- » Наши электронные самоделки
- » Сервозамедлитель своими руками
Сервозамедлитель своими руками
Re: Сервозамедлитель своими руками
Посмотрел еще раз, да, правильно, я сначала и не обратил внимание, что внизу размещены процедуры обработки прерывания и больше ничего нет.
Обычно они до main размещаются.
так по программе трудно что-то сказать, я в С небольшой специалист, пишу всю жизнь на ассемблере.
- alldn
- Александр (г.Тамбов)
- 2863 Сообщений
-
Re: Сервозамедлитель своими руками
alldn написал(а):
Обычно они до main размещаются.
Над культурой написания мне тоже надо поработать)
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
Нашел в чем беда, поправил код. В ближайшее время попытаюсь доделать в железе, и вернусь к теме топика.
wert написал(а):
#define F_CPU 9600000UL
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned int Tick; // 100KHz pulse
volatile unsigned int inPulse; // Servo input pulse variable
volatile unsigned int inPulseRev; // Servo input reverse pulse variable
volatile unsigned int inPulseBuf;
int main (void)
{
sei(); // Enable global interrupts
//Port config
DDRB |= (1<<PB0)|(1<<PB2); // PB0 and PB2 as output
DDRB |= (0<<PB1); // PB1 as input
//Timer config
TCCR0A |= (1<<WGM01); // Configure timer 1 for CTC mode
TIMSK0 |= (1<<OCIE0A); // Enable CTC interrupt
TCCR0B |= (1<<CS00); // No prescaler
OCR0A = 95; // Set CTC compare value 10*10^-6 sec per interrupt
TCNT0 = 0;
//Var input
Tick = 0;
inPulse = 150;
inPulseBuf = 150;
//Int0 config
MCUCR |= (0<<ISC01)|(1<<ISC00); // any logical changes
GIMSK |= (1<<INT0); // enable interrupt INT0
while(1)
{
}
}
ISR(INT0_vect)
{
if (PINB & (1 << PB1))
{
TCNT0 = 0; //clear counter
Tick = 0; // clear var
PORTB |= (1<<PB0)|(1<<PB2); //start pulse
inPulse = inPulseBuf;
inPulseRev = 300 - inPulse; // calc reverse pulse
}
else
{
inPulseBuf = Tick; //read pulse
}
}
ISR(TIM0_COMPA_vect)
{
Tick++;
if (inPulse > 0)
{
inPulse--;
}
else
{
PORTB &= ~(1<<PB0);
}
if (inPulseRev > 0)
{
inPulseRev--;
}
else
{
PORTB &= ~(1<<PB2);
}
}
- wert
- Сергей (Москва)
- Ученик пилота
- 98 Сообщений
-
Re: Сервозамедлитель своими руками
Еще актуально? Чем закончилось, то?
- grafalexphoto
- Александр
- Пилот
- 497 Сообщений
-
- Начало
- » Технологии моделизма
- » Наши электронные самоделки
- » Сервозамедлитель своими руками
Информация
- Статистика форума:
- Всего тем:
- 9948
- Всего опросов:
- 79
- Всего сообщений:
- 183174
- Всего сообщений сегодня:
- 1
- Пользователи форума:
- Всего пользователей:
- 10173
- Последним зарегистрировался:
- urus_vp
- Пользователи онлайн:
- 0
- Гостей онлайн:
- 1563
- Самые активные пользователи:
- konst, carpenter, kompmen, cnyx, Dragony, maks_dg, Goby, Student, alldn, nikolaypet
- Онлайн:
- Нет пользователей онлайн