Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.09.2013, 01:56   #1
Admin2
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 40
По умолчанию Операция сдвига в CodeVisionAvr

Не могу понять, верно написана часть кода, или нет. Это мой первый проект на CodeVisionAvr и на языке Си. Задача следующая: восемь раз считываю состояние первых трех пинов порта С. Состояние каждого из пинов является одним битом одной из трех переменных (Razr0, Razr1, Razr2). Т.е. нулевой бит порта С за восемь считываний должен сформировать байт данных в в переменную Razr0,Ю и т.д. Насколько я понимаю, без сдвиговых операций здесь не обойтись.

Написал, проверил на железе, не работает. Что в этом коде не так?

Код:
...
Counter++;
if (Counter<=8)
{
Razr0+=PINC.0;
Razr0=(Razr0 << 1); 
Razr1+=(PINC.1>>1);
Razr1=(Razr1 << 1); 
Razr2+=(PINC.2>>2);
Razr2=(Razr2 << 1);    
}
..
Может подскажете как в CodeVisionAvr выполнить трассировку? Вообще мне советуют перейти на WinAvr. Установил его, но там тоже не увидел ни отладки, ничего...
Admin2 вне форума Ответить с цитированием
Старый 13.09.2013, 09:30   #2
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Код:
Razr0+=PINC.0;
Razr0=(Razr0 << 1);
В строке "Razr0+=PINC.0;" - Razr0 будет равен нулю, если PINC.0 был в низком уровне, и будет равен единице, если PINC.0 был высоком уровне.
Соответственно на каждом шаге цикла (у вас ведь там снаружи где-то цикл, да?) вы затираете переменную Razr0. И в конце она будет иметь вид либо 0000 0010, если на последнем проходе PINC.0 был в высоком уровне, либо вовсе будет равна нулю, если PINC.0 на последнем проходе был в низком уровне.

Попробуйте писать вот так:

Код:
buf=PINC.0;//Разумеется вы buf в начале программы объявите.
Razr0+=Razr0 || buf;
Razr0=(Razr0 << 1);
Или даже так:

Код:
Razr0+=Razr0 || PINC.0;
Razr0=(Razr0 << 1);
Все тоже самое касается Razr1, и Razr2.


Что касается трассировки, в первую очередь нужно:
1. Что бы у вас в фьюзах было зашито использование JTAG (обращаю внимание, что, например, у Atmega16 JTAG находится на порту C). На всякий случай обращу внимание, что фьюзы без ума трогать не надо.
2. Что бы в вашей отладочной плате (или готовой вашей схеме) JTAG был выведен и правильно подключен к компу.
3. Что бы ваша отладочная плата вообще поддерживалась CodeVisionAvr. В противном случае вообще забудьте об отладке. (именно по этому вас советуют WinAvr - он в этом плане более гибкий, вроде бы. Но я им не пользовался, так что не могу утверждать наверняка.)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 13.09.2013 в 09:43.
ROD вне форума Ответить с цитированием
Старый 13.09.2013, 12:51   #3
Admin2
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 40
По умолчанию

Да, у меня там цикл снаружи.

А эти два кода одинаково будут работать, если я считываю не нулевой, а первый или второй биты порта С? Насколько я понимаю, buf присвоит значение всего байта (а не второго бита). Поэтому его еще нужно будет дополнительно сдгигать вправо. Что будет, если PINC=00000010?

Код:
buf=PINC.1;
Razr1+=Razr1 || buf;
Razr1=(Razr1 << 1);
И:

Код:
Razr1+=Razr1 || PINC.1;
Razr1=(Razr1 << 1);
А как насчет чисто программной трассировки без отладочной платы?
Admin2 вне форума Ответить с цитированием
Старый 13.09.2013, 15:35   #4
Admin2
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 40
По умолчанию

Цитата:
Сообщение от ROD Посмотреть сообщение
В строке "Razr0+=PINC.0;" - Razr0 будет равен нулю, если PINC.0 был в низком уровне, и будет равен единице, если PINC.0 был высоком уровне.
Соответственно на каждом шаге цикла (у вас ведь там снаружи где-то цикл, да?) вы затираете переменную Razr0. И в конце она будет иметь вид либо 0000 0010, если на последнем проходе PINC.0 был в высоком уровне, либо вовсе будет равна нулю, если PINC.0 на последнем проходе был в низком уровне.
Не свосем понятно почему я затираю. Я же плюсик поставил: Насколько я понимаю, к предыдущему значению Razr0 будет добавлено новое значение (PINC.0). Добавлено, а не просто присвоено. Разве не так? если Razr0=0b00001000 и PINC.0=0b00000001, после выполнения команды
Razr0+=PINC.0;
я ведь должен получить Razr0=0b00001001?
Admin2 вне форума Ответить с цитированием
Старый 13.09.2013, 16:18   #5
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Плюсик спросни не увидел. К стати... сдвигать надо до считывания. Иначе мы левый бит "выкинем" при последнем проходе.

К стати, а что конкретно у вас на железе не работает, т.е. какой результат вы в итоге получаете?
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 14.09.2013, 00:41   #6
Admin2
Пользователь
 
Регистрация: 13.10.2008
Сообщений: 40
По умолчанию

Все заработало, спасибо. Это я загнался...
Admin2 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++ Операция побитового сдвига marina12 Помощь студентам 3 16.02.2013 10:36
Операция циклического сдвига Ghost of Night Общие вопросы Delphi 7 13.07.2011 00:12
Тело сдвига Abur Фриланс 2 08.01.2011 19:11
операции сдвига ssvd Общие вопросы C/C++ 2 04.11.2009 08:13
Операция сдвига? SkyDreamer Общие вопросы C/C++ 3 10.10.2007 08:20