Перейти к содержанию

Ик декодер на Atmega8


Рекомендуемые сообщения

Всем доброго дня! Ребята, не подскажите как декодировать сигнал с ик пульта (работающего по протоколу Nec). Прерывание T1 срабатывает, внешнее прерывание INT0 тоже срабатывает все 33 значения записываются в массив ir_signal. А вот в функции ir_decode почему-то не выполняется условие оператора IF , а выполняется ELSE...?

#include <io.h>
#include <delay.h>
#include <alcd.h>
#include <stdio.h>

unsigned char signal_time;
static unsigned char ir_ok,ir_decode_ok;
unsigned char ir_code[4]; // Массив для хранения значений адресов и команд
unsigned char ir_signal[33]; // Массив для хранения значений интервалов


// Прерывание по совпадению T1(каждые 560мкс)
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
signal_time++; // Счетчик интервалов
}

// Внешнее прерывание по INT0
interrupt [EXT_INT0] void ExtInt0(void)
{

// Определяем начало приема посылки
if(signal_time > 9) // (4,5ms+562us)/560 = 9 
x = 0; // Выбираем первый интервал

ir_signal[x] = signal_time; // Записываем в буфер значения интервалов 
signal_time = 0; // Обнуляем счетчик интервалов
x++; // Следующий интервал 

if(x == 33) // Если все интервалы приняты
{
ir_ok = 1; // Устанавливаем флаг окончания приема сигнала
} 
}

// Функция декодирования сигнала
void ir_decode(void)
{
unsigned char j;
unsigned char i; 
unsigned char k = 0;
unsigned char signal_length,value = 0;

for(i = 0; i < 4; i++) // Обработка байтов адреса или команды
  {    
  for(j = 0; j < 8; j++) // Обработка 8-ми битов адреса или команды
    {
    k++;
    value = value >> 1; // Сдвигаем биты вправо
    signal_length = ir_signal[k]; // Выбираем следущее значение интервала
    if(signal_length > 4) // Если интервал больше (1,675ms+562us)/560 = 4
      value = value | 0x80; // Добавляем к старшему разряду единицу
    }
  ir_code[i] = value; // Запоминаем в буфере байт адреса или команды
  //value = 0; // Обнуляем значение адреса или команды    
  }
   
// Производим явное приведение типов и проверяем принятые байты
if(((unsigned char)ir_code[0] == (unsigned char)~ir_code[1]) && 
   ((unsigned char)ir_code[2] == (unsigned char)~ir_code[3]))
  {
  ir_decode_ok = 1; // Устанавливаем флаг окончания декодирования сигнала
  ir_ok = 0; // Сбрасываем флаг окончания приема сигнала
  }
else
  {
  ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала
  ir_ok = 0; // Сбрасываем флаг окончания приема сигнала
  }
}


void main(void)
{

PORTD.2=1;
DDRD.2=0;


MCUCR |= (1 << ISC01); // Внешнее прерывание по заднему фронту
GICR |= (1 << INT0); // Разрешение внешнего прерывния по INT0
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x22;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<TOIE0);

lcd_init(16); // Инициализация ЖК дисплея


lcd_gotoxy(0, 0);
lcd_puts("Test");
lcd_gotoxy(0, 1);
lcd_puts("Decoder 'NEC'");
delay_ms(500);


#asm ("sei") // Глобально разрешаем прерывания
while(1)
{   
      
  if(ir_ok) ir_decode(); // Если сигнал принят, декодируем его
    if(ir_decode_ok) // Если обработка сигнала завершена, выводим данные на дисплей
    {
          lcd_gotoxy(0,1);
      lcd_putchar(ir_code[0]/10+0x30);
      lcd_gotoxy(1,1);
      lcd_putchar(ir_code[0]%10+0x30);
      
            lcd_gotoxy(2,1);
      lcd_putchar(ir_code[1]/10+0x30);
      lcd_gotoxy(3,1);
      lcd_putchar(ir_code[1]%10+0x30);
      
            lcd_gotoxy(4,1);
      lcd_putchar(ir_code[2]/10+0x30);
      lcd_gotoxy(5,1);
      lcd_putchar(ir_code[2]%10+0x30);
      
            lcd_gotoxy(6,1);
      lcd_putchar(ir_code[3]/10+0x30);
      lcd_gotoxy(7,1);
      lcd_putchar(ir_code[3]%10+0x30);
      

     
      
      ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала
	}
   }
 }

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Изменил переменную, прошил мегу, всё равно ничего не отображает... 

А вообще, код правильный??? 

Кварц стоит на 16мгц. Предделитель 1

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

15 hours ago, Zodiac21 said:

всё равно ничего не отображает...

Закомментируйте условие и выводите постоянно принятые байты. По ним увидите, где ошибка: в приеме или в условии.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

18 минут назад, Zodiac21 сказал:

но какие-то не правильные...

ну так это очевидно же)

В 19.01.2019 в 10:49, Zodiac21 сказал:

все 33 значения записываются в массив ir_signal.

В 19.01.2019 в 10:49, Zodiac21 сказал:

не выполняется условие оператора IF

Логично же, раз данные есть, а условие не выполняется, значит данные или условие не правильные :)

Я не знаю какой протокол у ИК пульта, ни когда не интересовался, но видимо вы условие написали значит знаете.

Посмотрите в дебаге значения в массиве ir_signal. Они похожи на реальные? Если нет, то нужно пересмотреть алгоритм приема.

А в атмеге8 нельзя настроить таймер на захват и подсчет интервалов? что бы не мудрить таймер + прерывание?

 

смотрю в даташите есть инфа что счетчик может работать в режиме захвата. Input Capture Pin (ICP1) PB0

Вместо PD2 подключите ногу PB0. Настройте таймер на захват. В прерывании TIM1_CAPT смотрите значение в ICR1 это будет сколько тиков сделал таймер. Дальше так же в массив распихиваете тайминги и потом переводите в основном цикле в 0 и 1.

 

Ссылка на комментарий
Поделиться на другие сайты

  • 1 год спустя...
22.01.2019 в 12:00, Zodiac21 сказал:

Закомментировал условие ,появляються коды при нажатии на кнопки пульта, но какие-то не правильные...

Добрый день , чем дело кончилось ? Удалось найти решение ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...