void ir() { if (RC5.received) { cmd = RC5.command; RC5.received = 0 ; if (last_toggle == IR.toggle) return; else last_toggle = IR.toggle; if (cmd==16) vol_up(); if (cmd==17) vol_down(); if (cmd==11) rez_stb(); if (cmd==12) rez_mute(); if (cmd==32) rez_mode_up(); if (cmd==33) rez_mode_down(); } }
Сообщение от petrd:
Попробуйте сделать процедуру с проверкой удержания кнопки.
void ir()
{
if (RC5.received) {
cmd = RC5.command;
RC5.received = 0 ;
if (last_toggle == IR.toggle)
return;
else
last_toggle = IR.toggle;
if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==11) rez_stb();
if (cmd==12) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}
}
Сообщение от Andrey T:
После этого вообще команды не проходят.
Сообщение от Andrey T:
Использую MikroC PRO for PIC 4.60.
Как быть с тем если происходит удержание кнопки, ведь тогда получается всегда будет last_toggle == IR.toggle и из процедуры программа будет вылетать.
Сообщение от Andrey T:
Я хочу чтобы работа полностью соответствовала работе с обычной бытовой техникой,
Сообщение от Andrey T:
т.е. нажали кнопку параметр изменяется на 1, если удерживаем кнопку, требуемый параметр изменяется пока мы держим кнопку, нажали другую кнопку меняется другой параметр на 1 или тотже самый параметр только в другую сторону -1, если мы нажали и удерживаем параметр также начинает увеличиваться или уменьшаться в течении времени удержания.
Сообщение от :
void ir()
{
if (RC5_received) {
GIE_bit = 0;
if (cmd==12) rez_stb();
if (stb==0)
{
if (cmd==16) vol_up();
if (cmd==17) vol_down();
if (cmd==13) rez_mute();
if (cmd==32) rez_mode_up();
if (cmd==33) rez_mode_down();
}
RC5_received = 0 ; // Команда обработана
RC5_state = RC5_IDLE ;
GIE_bit = 1;
}
}
//------------------------------------------------------------------------------
// Обработчик прерывания
//------------------------------------------------------------------------------
void interrupt()
{
unsigned char time;
// прерывание по INT/RB0
if (INTF_bit)
{
INTEDG_bit = 1-INTEDG_bit ; //переключение INTEDG (фронт-спад INT)
INTF_bit = 0;
time = TMR0; // захват значения таймера
TMR0 = 0; // перезапуск таймера
switch (RC5_state)
{
////////// СВОБОДЕН. НИЧЕГО НЕ ПОЛУЧЕНО ////////////////////////////
case RC5_IDLE :
RC5_bits = 1; // already 1 bit (with value "1") received
RC5_bitCount = 1;
RC5_shortPulses = 0;
RC5_prevBit = 1;
RC5_state = RC5_DECODING;
T0IF_bit = 0; // сброс флага переполнения TMR0
T0IE_bit = 1; // разрешить прерывания TMR0
break ;
////////// ЗАФИКСИРОВАННО ИЗМЕНЕНИЕ. НАЧИНАЕМ ОБРАБОТКУ БИТ /////////
case RC5_DECODING : // Execution time is about 52 uS at 4 Mhz CPU clock
if ((time > 40) && (time < 120) && (RC5_received == 0))
{
if (time < 65) // обнаружен короткий импульс
{
RC5_shortPulses ++ ;
if (RC5_shortPulses == 2)
{
RC5_bits <<= 1; // сохраняем принятый бит
RC5_bits |= RC5_PrevBit;
RC5_bitCount ++ ;
RC5_shortPulses = 0;
}
} else if (time > 83){ // обнаружен длинный импульс
RC5_prevBit = 1- RC5_prevBit; // переключаем бит
RC5_bits <<= 1; // сохраняем принятый бит
RC5_bits |= RC5_PrevBit;
RC5_bitCount ++ ;
RC5_shortPulses = 0;
}
if (RC5_bitCount == 14)// если приняты все биты
{
//RC5_state = RC5_COMPLETED;
INTEDG_bit = 0; // следующее прерывание по спаду
cmd = (RC5_bits & 0b00111111) ;
RC5_received = 1 ;
T0IE_bit = 0; // отключить прерывания от TMR0
}
} else { // что-то не правильно с временами
RC5_state = RC5_IDLE; // начать сначала
INTEDG_bit = 0; // следующее прерывание по спаду
T0IE_bit = 0; // отключить прерывания от TMR0
}
break ;
/////////// ВСЕ БИТЫ ПРИНЯТЫ КОРРЕКТНО. Сохранение данных ///////////
/*case RC5_COMPLETED :
INTEDG_bit = 0; // следующее прерывание по спаду
toggle = ((RC5_bits>>11) & 0x01);
//IR.device = (RC5_bits>>6) & 0b00011111 ;
cmd = (RC5_bits & 0b00111111) ;
RC5_received = 1 ;
//RC5_state = RC5_IDLE ;
break ;*/
} // end switch
} // end INIF
// Прерывание TMR0
if (T0IF_bit) // Переполнение TMR0, тайм-аут
{
if ((RC5_state == RC5_DECODING) && (RC5_received == 0)) // что-то неправильно
{
RC5_state = RC5_IDLE; // начать с начала
INTEDG_bit = 0; // следующее прерывание по спаду
T0IE_bit = 0; // отключить прерывания TMR0
}
}
T0IF_bit = 0; // всегда сбрасывать флаг переполнения TMR0
} // конец обработчика прерывания
Сообщение от Andrey T:
Убрал последнее состояние стейт-машины, все работает как нужно. В итоге получился вот такой код:
Сообщение от VRTP:
Спасибо за такие комменты
МОЛОДЦА,удачи!
Сообщение от alarm801:
Пытаюсь прошить pic18f252 вот этим программатором, пишет ошибку и всё. Читать читает, но не очищает! Что за х..ня??? Может кто нибудь подскажет???
unsigned short t,old_GPIO; void init() { CMCON = 0x07; TRISIO = 0x28; OPTION_REG = 0b11000101; INTCON.GIE = 0; } void main() { init() ; do { old_GPIO = GPIO; if(old_GPIO.F5 == 1) {TRISIO =0x28; old_GPIO.F1 = 1; old_GPIO.F4 = 0; GPIO = old_GPIO;} if(old_GPIO.F5 == 0) { CMCON = 0x04; VRCON = 0xA3; TRISIO = 0x2A; TMR0 = 0; Delay_us(10); if(CMCON.F6==1){ t = TMR0; old_GPIO.F4 =1; GPIO = old_GPIO;} } } while(1); }
Сообщение от Butik:
Вот небольшой пример на Си для 12F629
unsigned short t,old_GPIO; // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ void init() { CMCON = 0x07; // все выводы контроллера-цифровые TRISIO = 0x28; //выводы GPIO5,3-на ввод, остальные - на вывод OPTION_REG = 0b11000101;/* подтягивающие резисторы- выключены, активный фронт внешнего прерывания-передний,такиовый сигнал для таймера- внутренний. предделитель- перед TMR0, коэффициент деления- 1:64 */ INTCON.GIE = 0; //прерывания запрещены } void main() { init() ; // НАЧАЛЬНАЯ ИНИЦИАЛИЗАЦИЯ do { old_GPIO = GPIO; // считывания состояния портов if(old_GPIO.F5 == 1)// если на входе синхронизации полуволна положительная {TRISIO =0x28; // то настраиваем GPIO,1 на вывод old_GPIO.F1 = 1; // и выставляем на него лог 1 для зарядки конденсатора old_GPIO.F4 = 0; // выключаем светодиод GPIO = old_GPIO;} // if(old_GPIO.F5 == 0) // если на входе синхронизации полуволна положительная { CMCON = 0x04; // то конфигурируем компаратор с внутренним ИОН VRCON = 0xA3; // TRISIO = 0x2A;// настраиваем GPIO,1 как аналоговый вход компаратора TMR0 = 0; // сбрасываем таймер Delay_us(10); // задержка 10мксек для установки режима компаратора if(CMCON.F6==1){ // ждем разряда конденсатора ниже напряжения ИОН t = TMR0; // считываем показание таймера old_GPIO.F4 =1; // включаем светодиод GPIO = old_GPIO;} // } } while(1); // бесконечный цикл }
Сообщение от :
char *text = "mikroElektronika";
Сообщение от :
text = "RADIO AMATER UR5XCA"