Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: загвоздка в простом коде (Си, atmega128)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
elusive
всем привет.

задача такая:
есть сигнал от ИК-пульта, принимается на 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 наоптимизировал..
AHTOXA
А как вы узнали, что byte увеличивается во время подсчёта?
Ну и, по-хорошему, надо сделать небольшой проект, в котором повторяется ошибка, и выложить его. Тогда разговор будет более предметным.
Палыч
Цитата(elusive @ Dec 5 2010, 21:39) *
дальше идут повторы этого куска.
В Вашем "куске" программы отсутствует проверка начала импульса (т.е. не определяется факт того, что на ноге появился высокий уровень после разделителя), поэтому остальные аналогичные "куски" - "проскочат пулей", т.к. условие while выполняться не будет.
skripach
Может таки таймер заюзать, а то как-то сурово.
elusive
Цитата(AHTOXA @ Dec 6 2010, 01:03) *
А как вы узнали, что byte увеличивается во время подсчёта?

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

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

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

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

можно и таймер подергать. но в данном случае нет необходимости измерять точную длину сигнала, достаточно выяснить больше она какого-то порога или меньше.
Палыч
Цитата(elusive @ Dec 6 2010, 16:38) *
проблема решилась с помощью двух volatile.
Приведенные Вами "куски" находятся где-то в обработчике прерывания? Тогда, наверное, проблему так и нужно решать...
Цитата(elusive @ Dec 6 2010, 16:38) *
можно и таймер подергать. но в данном случае нет необходимости измерять точную длину сигнала, достаточно выяснить больше она какого-то порога или меньше.
Ваша программа - больше ничем не занимается, кроме приёма этого сигнала? Никаких прерываний нет? В противном случае, можно сильно "промахнуться" с измерением длительности...
_Pasha
Цитата(Палыч @ Dec 6 2010, 17:58) *
В противном случае, можно сильно "промахнуться" с измерением длительности...

Когда-то ловил RC5 поллингом, но какой был период - сейчас не могу найти проект. Оно конечно сурово было, да и на асме, мега8/16МГц, но работает нормально и делает массу полезных вещей типа генерации комбинационной частоты из 10-ти взвешенных гармоник в диапазоне 0-400 Гц, коррекция пульсаций выпрямленного напряжения на конденсаторе, защита по току (это все силовуха). Так что все возможно. А вообще-то я похвастался...sm.gif
ЗЫ еще и индикация динамическая была.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.