|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
13.09.2013, 01:56 | #1 |
Пользователь
Регистрация: 13.10.2008
Сообщений: 40
|
Операция сдвига в CodeVisionAvr
Не могу понять, верно написана часть кода, или нет. Это мой первый проект на CodeVisionAvr и на языке Си. Задача следующая: восемь раз считываю состояние первых трех пинов порта С. Состояние каждого из пинов является одним битом одной из трех переменных (Razr0, Razr1, Razr2). Т.е. нулевой бит порта С за восемь считываний должен сформировать байт данных в в переменную Razr0,Ю и т.д. Насколько я понимаю, без сдвиговых операций здесь не обойтись.
Написал, проверил на железе, не работает. Что в этом коде не так? Код:
|
13.09.2013, 09:30 | #2 | |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Цитата:
Соответственно на каждом шаге цикла (у вас ведь там снаружи где-то цикл, да?) вы затираете переменную Razr0. И в конце она будет иметь вид либо 0000 0010, если на последнем проходе PINC.0 был в высоком уровне, либо вовсе будет равна нулю, если PINC.0 на последнем проходе был в низком уровне. Попробуйте писать вот так: Код:
Код:
Что касается трассировки, в первую очередь нужно: 1. Что бы у вас в фьюзах было зашито использование JTAG (обращаю внимание, что, например, у Atmega16 JTAG находится на порту C). На всякий случай обращу внимание, что фьюзы без ума трогать не надо. 2. Что бы в вашей отладочной плате (или готовой вашей схеме) JTAG был выведен и правильно подключен к компу. 3. Что бы ваша отладочная плата вообще поддерживалась CodeVisionAvr. В противном случае вообще забудьте об отладке. (именно по этому вас советуют WinAvr - он в этом плане более гибкий, вроде бы. Но я им не пользовался, так что не могу утверждать наверняка.)
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс Последний раз редактировалось ROD; 13.09.2013 в 09:43. |
|
13.09.2013, 12:51 | #3 |
Пользователь
Регистрация: 13.10.2008
Сообщений: 40
|
Да, у меня там цикл снаружи.
А эти два кода одинаково будут работать, если я считываю не нулевой, а первый или второй биты порта С? Насколько я понимаю, buf присвоит значение всего байта (а не второго бита). Поэтому его еще нужно будет дополнительно сдгигать вправо. Что будет, если PINC=00000010? Код:
Код:
|
13.09.2013, 15:35 | #4 | |
Пользователь
Регистрация: 13.10.2008
Сообщений: 40
|
Цитата:
Razr0+=PINC.0; я ведь должен получить Razr0=0b00001001? |
|
13.09.2013, 16:18 | #5 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
Плюсик спросни не увидел. К стати... сдвигать надо до считывания. Иначе мы левый бит "выкинем" при последнем проходе.
К стати, а что конкретно у вас на железе не работает, т.е. какой результат вы в итоге получаете?
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
14.09.2013, 00:41 | #6 |
Пользователь
Регистрация: 13.10.2008
Сообщений: 40
|
Все заработало, спасибо. Это я загнался...
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
С++ Операция побитового сдвига | 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 |