реклама на сайте
подробности

 
 
> загвоздка в простом коде (Си, atmega128)
elusive
сообщение Dec 5 2010, 18:39
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



всем привет.

задача такая:
есть сигнал от ИК-пульта, принимается на PB2.
короткий импульс лог0 - разделитель, короткий импульс лог1 это ноль, длинный импульс лог1 это единица. нужно считать 8 битов, сохранить в переменную byte

byte=0;

i1=0; // счетчик длительности импульса лог1
while ((PINB&0x04)!=0) i1++; // пока длится лог1, считаем импульсы
if (i1<8000) byte=byte*2; // если это был короткий импульс, то умножаем двоичное число byte на 10 (сдвигаем влево)
else byte=(byte*2)+1; // если это был длинный импульс, сдвигаем влево и дописываем 1

дальше идут повторы этого куска.

проблема: после одного такого куска во время подсчета начинает увеличиваться не i1, а byte.
кто-то сталкивался с подобными вещами? переменная подчистую поменяется другой. может что-то оптимизатор WinAVR наоптимизировал..
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
AHTOXA
сообщение Dec 5 2010, 20:03
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



А как вы узнали, что byte увеличивается во время подсчёта?
Ну и, по-хорошему, надо сделать небольшой проект, в котором повторяется ошибка, и выложить его. Тогда разговор будет более предметным.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 6 2010, 13:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(elusive @ Dec 5 2010, 21:39) *
дальше идут повторы этого куска.
В Вашем "куске" программы отсутствует проверка начала импульса (т.е. не определяется факт того, что на ноге появился высокий уровень после разделителя), поэтому остальные аналогичные "куски" - "проскочат пулей", т.к. условие while выполняться не будет.
Go to the top of the page
 
+Quote Post
skripach
сообщение Dec 6 2010, 13:34
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Может таки таймер заюзать, а то как-то сурово.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
elusive
сообщение Dec 6 2010, 13:38
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 26-05-10
Пользователь №: 57 544



Цитата(AHTOXA @ Dec 6 2010, 01:03) *
А как вы узнали, что byte увеличивается во время подсчёта?

в отладчике рассмотрел.

2 Палыч: согласен. забыл выписать эту строчку из кода: в конце нужно добавить еще while ((PINB&0x04)==0) ;

а проблема решилась с помощью двух volatile.
все-таки это проделки оптимизатора. логики пока не вижу.

Цитата(skripach @ Dec 6 2010, 18:34) *
Может таки таймер заюзать, а то как-то сурово.

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

Сообщение отредактировал elusive - Dec 6 2010, 13:41
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 6 2010, 13:58
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(elusive @ Dec 6 2010, 16:38) *
проблема решилась с помощью двух volatile.
Приведенные Вами "куски" находятся где-то в обработчике прерывания? Тогда, наверное, проблему так и нужно решать...
Цитата(elusive @ Dec 6 2010, 16:38) *
можно и таймер подергать. но в данном случае нет необходимости измерять точную длину сигнала, достаточно выяснить больше она какого-то порога или меньше.
Ваша программа - больше ничем не занимается, кроме приёма этого сигнала? Никаких прерываний нет? В противном случае, можно сильно "промахнуться" с измерением длительности...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Dec 6 2010, 19:48
Сообщение #7


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Палыч @ Dec 6 2010, 17:58) *
В противном случае, можно сильно "промахнуться" с измерением длительности...

Когда-то ловил RC5 поллингом, но какой был период - сейчас не могу найти проект. Оно конечно сурово было, да и на асме, мега8/16МГц, но работает нормально и делает массу полезных вещей типа генерации комбинационной частоты из 10-ти взвешенных гармоник в диапазоне 0-400 Гц, коррекция пульсаций выпрямленного напряжения на конденсаторе, защита по току (это все силовуха). Так что все возможно. А вообще-то я похвастался...sm.gif
ЗЫ еще и индикация динамическая была.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 07:20
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016