roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 05:38

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 16:43 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
подскажите как переделать программу,что бы при нажатии кнопки 1 пду светодиод горел при отпускании тух,вот код.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <io.h>
#include <delay.h>
#include <interrupt.h>

// Временные пределы
#define Tmin 40 // длинный промежуток
#define Tmax 68
#define TminK 22 // короткий промежуток
#define TmaxK 34

unsigned char sct_bit = 0; // Счетчик битов RC5
unsigned char RC5_buffer [14]; // Буфер RC5
unsigned char centre = 0; // Флаг центра
unsigned char not_korr = 0; // Флаг попадания в промежутки
unsigned char Timer = 0; // число в счетчике таймера
unsigned char command = 0; // переменная для команды
char s = 0;


// Функция очистки буфера
void rc5_cl_buf(void)
{
unsigned char i = 0;
for (i=0; i<14; i++)
{
}
}
// функция остановки таймера
void rc5_ti_stop(void)
{
GICR = 0x00;
TCCR0 = 0x00;
TCNT0 = 0;
sct_bit = 0;
}


// Обработчик прерывния по переполнению Т0
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
rc5_ti_stop(); //останавливаем таймер
rc5_cl_buf(); //очищаем буфер
GICR |= (1 << INT0); //разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); //сбрасываем флаг прерывания (если произошло)
}

// Обработчик внешнего прерывания INT0
interrupt [EXT_INT0] void ext_int0_isr(void)
{
Timer = TCNT0; // запоминаем значение счетчика
TCNT0 = 0; // обнуляем счетчик
not_korr = 1;

if(sct_bit==0)
{
TCCR0 |= (1 << CS02); // запускаем таймер (31.250 KHz)
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2)); //записываем в эл.массива
sct_bit++; // +1 к счётчику принятых битов
centre = 1;
}
else
{
// Проверка короткого промежутка
if ((Timer > TminK)&&(Timer < TmaxK))
{
if (centre)
{
centre = 0;
not_korr = 0;
}
else
{
centre = 1;
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}
}
// проверка длинного промежутка
if ((Timer > Tmin)&&(Timer < Tmax))
{
RC5_buffer [sct_bit] = !(PIND&(1 << PORTD2));
sct_bit++;
not_korr = 0;
}

if (not_korr == 1)
{ // если не попали ни в один из промежутков то
rc5_ti_stop();
rc5_cl_buf(); // очищаем буфер
}

if (sct_bit == 14)
{ // если бит последний то
rc5_ti_stop(); //останавливаем таймер
// Формируем код команды
command = (RC5_buffer [8] << 5)|(RC5_buffer [9] << 4)|
(RC5_buffer [10] << 3 )|(RC5_buffer [11] << 2)|
(RC5_buffer [12] << 1)|RC5_buffer [13];


s++;
delay_ms(100);
if(s > 1)
s = 0;


}
GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания по входу INT0
}
}

void main(void)
{
DDRB = 0xFF; // выход
PORTB = 0x00;
DDRD &= ~(1 << PORTD2); // вход ИК
DDRD = 0x00;




TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0

GICR |= (1 << INT0); // разрешаем прерывания по входу INT0
MCUCR |= (1 << ISC00); // прерывание по любому фронту
GIFR |= (1 << INTF0); // сбрасываем флаг прерывания

#asm("sei"); // глобально разрешаем прерывания


while(1)


if(command==01)

{
if(s == 0)
PORTB.0=1; // Включаем светодиод

if(s == 1)
PORTB.0=0; // Выключаем светодиод

}

delay_ms(300);


}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 21:24 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Это рабочий код, проверенный? А то нет смысла его править если он не работает.

Наверно так (не знаю что такое s потому не использовал):
Код:
while(1){

if(command==01) {
PORTB.0=1; // Включаем светодиод если есть команда "1"
                }
else {
PORTB.0=0; // Выключаем светодиод если нет "1"
     }

delay_ms(100); // минимально возможная пауза проверки наличия команды.

        }

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 21:50 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
да этот код рабочий,с пду свет включаю и выключаю,так я вроде пробовал получается мигание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 22:09 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Код:

// тогда после строки (я так понимаю что в этом месте проги мы имеем действительный код кнопки)

(RC5_buffer [12] << 1)|RC5_buffer [13];

// надо анализировать принятую команду и действовать:

if(command==01) {
PORTB.0=1; // Включаем светодиод если есть команда "1"
                }
else {
PORTB.0=0; // Выключаем светодиод если нет "1"
     }

// а цикл сделать пустым

while (1);

} // закр скобка для main


_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 22:35 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
сейчас попробуем,

Добавлено спустя 8 минут 28 секунд:
нет не идет,так же как и в цикле по команде 1 загорается,и горит не тухнет пока другую кнопку не нажмешь,я вот тоже уже всю голову разломал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 22:42 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
надо обнулять команду после анализа

после

Код:
if{}
else{}

//добавь строку

command = 0;


вы значение слова ПОСЛЕ понимаете? :cry:

Код:
if(command==01) {
PORTB.0=1; // Включаем светодиод если есть команда "1"
                }
else {
PORTB.0=0; // Выключаем светодиод если нет "1"
     }

// ПОСЛЕ IF-ELSE - ЭТО ТУТ!
command = 0;

_________________
Читайте !


Последний раз редактировалось avr123.nm.ru 06 апр 2014, 07:20, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 05 апр 2014, 22:47 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
я понял вот так?

if(command==01)
{
PORTB.0=1; // Включаем светодиод если есть команда "1"
}
if(command==0)
{
PORTB.0=0; // Выключаем светодиод если нет "1"
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 02:20 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
нет. после if-else а не во внутрь.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 04:50 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
если вот так то вообще не загорается
if(command==01)
command=00;
{
PORTB.0=1; // Включаем светодиод если есть команда "1"
}

command=00;
{

PORTB.0=0; // Выключаем светодиод если нет "1"
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 07:22 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
после

Код:
if{}
else{}

//добавь строку

command = 0;


вы значение слова ПОСЛЕ понимаете? :cry:

Код:
if(command==01) {
PORTB.0=1; // Включаем светодиод если есть команда "1"
                }
else {
PORTB.0=0; // Выключаем светодиод если нет "1"
     }

// ПОСЛЕ IF-ELSE - ЭТО ТУТ!
command = 0;

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 10:38 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
и так я делал,он загорается,но тухнет при нажатии другой кнопки


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 12:50 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
тогда так уж точно заработает:


Код:
while(1){
command = 0;
delay_ms(300); // подобрать минимальную, не знаю как часто пульт шлет посылки
PORTB.0=0; // ели за 300 мс не поступила команда с кн. 1 то Выключаем светодиод
}
} // скобка закрывающая для main

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 14:18 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
в протеусе вроде работает,проверю на плате,позже скажу,спасибо за помощь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 15:12 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
в протеус чем моделируете пульт тв? есть модель или генератор сигнала? приложите проект а proteus.

я сделал rc5 в cvavr


Вложения:
rc5 в cvavr.zip [41.79 КиБ]
Скачиваний: 0

_________________
Читайте !
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: помогите с переделкой программы
СообщениеДобавлено: 06 апр 2014, 17:05 
Не в сети

Зарегистрирован: 05 апр 2014, 11:39
Сообщения: 9
пульт тв в протеусе,а как приложить проект? ну и работает значит так сначала медлено пикает потом быстрей ,потом просто пищит как надо потом опять сброс медлено и так по кругую

Добавлено спустя 1 час 7 минут 48 секунд:
спасибо за помощь,зделал вот так и все заработало как надо
//////////////////////////////////////////////////////
if(command==01)
{
PORTB.0=1; // Включаем светодиод если получили команду - кнопка "1"
PORTB.2=1; // Включаем светодиод если получили команду - кнопка "1"

}

command = 0;
delay_ms(114); // подобрать минимальную, не знаю как часто пульт шлет посылки
PORTB.0=0; // ели за 300 мс не поступила команда с кн. 1 то Выключаем светодиод
PORTB.2=0; // ели за 300 мс не поступила команда с кн. 1 то Выключаем светоди

Добавлено спустя 40 секунд:
все воткнул в цикл,while


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO