Например TDA7294

Форум РадиоКот • Просмотр темы - WinAvr в вопросах и ответах
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Ср июл 23, 2025 12:24:14

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 94, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 06:21:13 
Друг Кота
Аватар пользователя

Карма: 86
Рейтинг сообщений: 1035
Зарегистрирован: Чт апр 11, 2013 11:19:59
Сообщений: 4884
Откуда: Минск
Рейтинг сообщения: 0
А это точно байты? А то Вы код не показали, вдруг там на самом деле массив int-ов.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 10:41:12 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
Вот весь код
Спойлер
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "hd44780.h"
const unsigned char HEX[16] PROGMEM="0123456789ABCDEF";
unsigned char signal_time;
static unsigned char ir_ok,ir_decode_ok;
unsigned char ir_code[4];
unsigned char ir_signal[33];
// Прерывание по совпадению T1(каждые 560мкс)
ISR(TIMER1_COMPA_vect)
{
signal_time++; // Счетчик интервалов
}
// Внешнее прерывание по INT0
ISR(INT0_vect)
{
static unsigned char i;
// Определяем начало приема посылки
if(signal_time > 9) // (4,5ms+562us)/560 = 9
i = 0; // Выбираем первый интервал
ir_signal[i] = signal_time; // Записываем в буфер значения интервалов
signal_time = 0; // Обнуляем счетчик интервалов
i++; // Следующий интервал
if(i == 33) // Если все интервалы приняты
ir_ok = 1; // Устанавливаем флаг окончания приема сигнала
}
// Функция декодирования сигнала
void ir_decode(void)
{
unsigned char k = 0;
unsigned char signal_length,value;
for(unsigned char i = 0; i < 4; i++) // Обработка байтов адреса или команды
  {
  for(unsigned char 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((ir_code[0] == ~ir_code[1]) && (ir_code[2] == ~ir_code[3]))
{
ir_decode_ok = 1; // Устанавливаем флаг окончания декодирования сигнала
ir_ok = 0; // Сбрасываем флаг окончания приема сигнала
}
else ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала
}
int main(void)
{
MCUCR |= (1 << ISC01); // Внешнее прерывание по заднему фронту
GICR |= (1 << INT0); // Разрешение внешнего прерывния по INT0
TCCR1B |= (1 << WGM12)|(1 << CS10); // Режим CTC, предделитель 1
OCR1A = 279; // 1000000/2*(279+1) = 1786Hz(560us)
TIMSK |= (1 << OCIE1A); // Разрешаем прерывание по совпадению Т1
lcd_init(); // Инициализация ЖК дисплея
sei(); // Глобально разрешаем прерывания
lcd_gotoxy(0, 0);
lcd_string("NEC PROTOCOL    ",16);
lcd_gotoxy(0, 1);
lcd_string("DECODER         ",16);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
lcd_clr(); // Очищаем дисплей
lcd_gotoxy(0, 0);
lcd_string("Adr: 00  Inv: 00",16);
lcd_gotoxy(0, 1);
lcd_string("Com: 00  Inv: 00",16);
while(1)
{
  if(ir_ok) ir_decode(); // Если сигнал принят, декодируем его
    if(ir_decode_ok) // Если обработка сигнала завершена, выводим данные на дисплей
    {
      lcd_gotoxy(5, 0);
      lcd_data(pgm_read_byte(HEX+ir_code[0]/16)); // Выводим данные в шестнадцатиричном виде
      lcd_data(pgm_read_byte(HEX+ir_code[0]%16));
      lcd_gotoxy(14, 0);
      lcd_data(pgm_read_byte(HEX+ir_code[1]/16));
      lcd_data(pgm_read_byte(HEX+ir_code[1]%16));
      lcd_gotoxy(5, 1);     
      lcd_data(pgm_read_byte(HEX+ir_code[2]/16));
      lcd_data(pgm_read_byte(HEX+ir_code[2]%16));
      lcd_gotoxy(14, 1);       
      lcd_data(pgm_read_byte(HEX+ir_code[3]/16));
      lcd_data(pgm_read_byte(HEX+ir_code[3]%16));
      ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала
    }
   }
}


Последний раз редактировалось AntonChip Вт окт 20, 2015 05:17:50, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 11:00:39 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
почти со 100% уверенностью можно утверждать, что если вы выполните требование объявлять volatile все переменные, используемые и в прерываниях и в остальных местах программы одновременно - проблема исчезнет.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 15:22:43 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
Нет, все равно не работает. Может еще как-нибудь можно сравнивать элементы массива


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 15:33:21 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
а как вы выяснили, что не работает именно оператор сравнения? вы уверены, что проблема именно в этом месте?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 16:47:00 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
AntonChip писал(а):
Нет, все равно не работает.
Показывай исправленный код. Только под спойлер сверни его..


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 19:46:30 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
ARV писал(а):
а как вы выяснили, что не работает именно оператор сравнения? вы уверены, что проблема именно в этом месте?

Присвоил элементам массива заведомо правильные значения


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 20:02:19 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
присвоили значения - и что? как вы выяснили, что в других местах нет проблем?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 20:21:03 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
ARV писал(а):
присвоили значения - и что? как вы выяснили, что в других местах нет проблем?

Без функции проверки программа работает, но иногда на дисплей выводятся неверные значения команд, особенно когда пульт находится близко от фотоприемника


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 20:43:07 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
а вот я вижу, что в вашем коде совершенно все равно, срабатывает ваша проверка или нет - в главном цикле вывод никогда не будет осуществлен, т.к. ir_decode_ok у вас всегда равна нулю.
Код:
if((ir_code[0] == ~ir_code[1]) && (ir_code[2] == ~ir_code[3])){
   ir_decode_ok = 1; // Устанавливаем флаг окончания декодирования сигнала
   ir_ok = 0; // Сбрасываем флаг окончания приема сигнала
}
ir_decode_ok = 0; // Сбрасываем флаг окончания декодирования сигнала

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Пн окт 19, 2015 22:17:14 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
А не лучше ли сравнение с инверсией заменить на функцию XOR? если команда будет равна её инверсии, XOR выдаст все единички. Потом применить логическую функцию AND с такой же конструкцией проверки совпадения адреса. Если все нормально, результат будет равен 0xFF.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 01:54:42 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Если после таких "замен" придётся поддерживать код кому-то другому, то другой будет сильно ругаться, с упоминаниями членов семьи первого программиста.
Это логически неверно. Я такие конструкции могу допускать лишь в случаях, когда нужна некоторая оптимизация скорости или размера кода. В данном случае нет необходимости :dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 08:12:45 
Мучитель микросхем

Карма: 3
Рейтинг сообщений: 44
Зарегистрирован: Вс авг 30, 2015 03:52:59
Сообщений: 469
Рейтинг сообщения: 0
AntonChip писал(а):
Господа, почему это условие не работает?

С переменной value алгоритм обходится несколько странно.
Как минимум, она неинициализирована на первом проходе цикла "for(unsigned char i = 0; i < 4; i++)":
Цитата:
...
unsigned char
signal_length,value;

....for(unsigned char i = 0; i < 4; i++) // Обработка байтов адреса или команды
....{
...........
........value = 0; // Обнуляем значение адреса или команды
....}

А кроме того, неясно, правильно ли устроен алгоритм на втором и последущих проходах этого цикла - ведь "value >>= 1;" будет давать 0 до тех пор, пока не сработает "value |= 0x80;" при "ir_signal[++k] > 4" - так и должно быть?

Во всяком случае, ir_code[0] содержит некую случайную величину, что вполне может обратить все условие в false.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 08:58:52 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Pnjom-Penb писал(а):
алгоритм обходится несколько странно
о том, что в коде топикстартера полно сомнительных мест и проблема может крыться совсем не там, где он ее ищет, я пытаюсь сказать уже не один раз.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 18:59:35 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
ARV подскажите, а с этим кодом что не так, пишет Bad

Код:
#include <avr/io.h>
#include "hd44780.h"

unsigned char ir_code[]={0x00, 0xFF, 0x01, 0xFE};

int main(void)
{
lcd_init();

while(1)
{
  if((ir_code[0] == ~ir_code[1]) && (ir_code[2] == ~ir_code[3]))
  {
  lcd_gotoxy(0, 0);
  lcd_string("Good            ",16);
  }
  else
  {
  lcd_gotoxy(0, 0);
  lcd_string("Bad             ",16);
  }
}
}


Последний раз редактировалось AntonChip Вт окт 20, 2015 19:17:18, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 19:03:36 
Друг Кота
Аватар пользователя

Карма: 45
Рейтинг сообщений: 623
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Сообщений: 8007
Откуда: Лукалэнд
Рейтинг сообщения: 0
Верно пишет. Вторая часть условия возвращает 0, поэтому общий результат условия в if() - тоже 0.
Код ВНЕЗАПНО обновился :)


Последний раз редактировалось hybroid Вт окт 20, 2015 20:29:39, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 19:46:52 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
самое занятное, что почему он это пишет - я понимаю :) а вот как сделать, чтобы не писал - не понимаю.

и вообще, avr-gcc ведет себя странновато. по идее, оптимизатор должен лишнее выбрасывать, а он это делает только в свежей версии avr-gcc, а версия WinAVR порождает код с тупым сравнением...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Вт окт 20, 2015 21:37:21 
Первый раз сказал Мяу!
Аватар пользователя

Зарегистрирован: Сб май 16, 2015 22:42:01
Сообщений: 26
Рейтинг сообщения: 0
hybroid писал(а):
Верно пишет. Вторая часть условия возвращает 0, поэтому общий результат условия в if() - тоже 0.
Код ВНЕЗАПНО обновился :)

Извиняюсь, код подкорректировал


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Ср окт 21, 2015 06:34:18 
Мучитель микросхем

Карма: 3
Рейтинг сообщений: 44
Зарегистрирован: Вс авг 30, 2015 03:52:59
Сообщений: 469
Рейтинг сообщения: 0
hybroid писал(а):
Вторая часть условия возвращает 0, поэтому общий результат условия в if() - тоже 0.
Первая - тоже false.
ARV писал(а):
... а вот как сделать, чтобы не писал - не понимаю.
Да посоветовать, не мудрствуя лукаво, прочесть описание унарной операции '~' и неявное приведение типов. ;)


ТС: если задать явное приведение типов "(unsigned char)", проверка пройдет.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: WinAvr в вопросах и ответах
СообщениеДобавлено: Ср окт 21, 2015 06:53:58 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18403
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
разобрался. все-таки внимательность - первое дело!
между (unsigned char)~c и ~(unsigned char)c большая разница! :)))

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2195 ]     ... , , , 94, , , ...  

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


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


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

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y