Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

А вопрос то какой ? Вы вроде задали вопрос и сами же на него ответили.
как понять эти символы

<< - это вроде смещение влево
а это >> а это вправо

:))
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

mastech писал(а):у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.

их вроде можно записать по другому?
[code]
#include <avr/io.h>
#include <util/delay.h>
while ((PIND&(1 << PD0)) == 1){}


смотрим файл avr/io.h
там прописано какой файл контроллера. подключить например mega8
в нем прописано
#define PD0 0
это значит что запись (PIND&(1 << PD0)) превращается в (PIND&(1 <<0))
то есть единица смещается на 0 бит влево.
компилятором на этапе сборки это значение просто заменяется на константу и получается в итоге
(PIND&0b00000001)
таким же образом получается
PORTD|=((1 << PD0)|(1 << PD4)|(1 << PD5));
PORTD|=0b00000001|0b00010000 |0b00100000 ;
что в свою очередь превращается компилятором в
PORTD|=0b00110001;

исправил ошибку, пока не поздно, чтобы остальных не вводить в заблуждение.
Последний раз редактировалось vitalik_1984 Вт июл 31, 2012 10:38:18, всего редактировалось 2 раза.
В поисках истины человек развивается.
mastech
Грызет канифоль
Сообщения: 269
Зарегистрирован: Чт мар 11, 2010 17:45:37
Откуда: г.фрязино

Re: Вопросы по С/С++ (СИ)

Сообщение mastech »

значит эту запись (PIND|=((1 << PD0)|(1 << PD4)|1 << PD5) можно сменить на PIND|=0b00110001;?

и зачем их смещать?))

так стоп кажись понял допустим 1 << PD0- это означает: присваиваем 1 порту PD0, далее 1 << PD4: присваиваем 1 PD4 и т.д., |(или) - логическое сложение и все это дело присваивается(=) к пинам PIND, верно?
Последний раз редактировалось mastech Вт июл 31, 2012 00:42:13, всего редактировалось 1 раз.
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

mastech писал(а):значит эту запись (PIND|=((1 << PD0)|(1 << PD4)|1 << PD5) можно сменить на PIND|=0b00110001;?
и зачем их смещать?))
Для удобства чтения через год. Только непонятно, зачем вы модифицируете в этом примере порт ввода. Из него читают состояния на входных пинах.
Вы можете, безусловно, написать PORTD |= 0x31, но если вы плохо умеете "на лету" читать 16-ричную запись, то легче запомнить так "В PORTD надо выводы 0, 4 и 5 перевести в состояние "1". А вот запись в PIND бессмысленна. Попутно разберитесь, чем отличаются операции чтения из порта, записи в порт и чтение-модификация-запись. Т.е. уловите разницу между просто "=" и "|="...
С уважением,
Виктор.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

ut1wpr писал(а):Только непонятно, зачем вы модифицируете в этом примере порт ввода.

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

в реальной же жизни, конечно это безполезно.

так стоп кажись понял допустим 1 << PD0- это означает: присваиваем 1 порту PD0, далее 1 << PD4: присваиваем 1 PD4 и т.д., |(или) - логическое сложение и все это дело присваивается(=) к пинам PIND, верно?

логическое сложение это значит

что берется порт к примеру д
PORTD=0b0000 0001;// тут идет прямое присвоение константы.
PORTD|=0b0001 0000;//тут идет побитовое или
контроллер при этом делает операции
читает из регистра порта PORTD значение 0b0000 0001
и применяет операцию или
получается
0b0000 0001|0b0001 0000=0b0001 0001
получившееся значение он засовывает обратно в порт
и в итоге в порту 0b0001 0001
в отличие от команды
PORTD=0b0001 0000;
которая присвоила бы целиком значение порту, очистив нулевой бит.

другими словами побитовое или применяется, если необходимо выставить нужные биты

побитовое и применяется если нужно сбросить нужные биты
пример

Код: Выделить всё

PORTD=0b0101 0001; //выставили
начальное значение
PORTD&=~((1<<PD0)|(1<< PD5)); //сбрасываем биты 0 и 5
получится
PORTD=0b0101 0000;
остальные биты не трогаются


кстати вопрос был зачем сдвигать.

пример нужно сделать программу но пока неизвестно какие ноги будут использованы

пишем
#define Led 1

потом используем

PORTD|=(1<<Led);//зажигаем светодиод

таким образом можно изменять ногу на которую подключен светодиод в пределах порта.
В поисках истины человек развивается.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Год как освоил ассемблер для AVR (до этого на асме писал под ZILOG), теперь вот взялся C грызть (вообще раньше дела не имел), да чет буксую.....

Вопрос: как на C можно сдвинуть несколько байт, как одно целое. Чтобы старший бит младшего байта переходил в младший бит старшего байта (при сдвиге в лево, например).
На асме это выглядит так:

Код: Выделить всё

LSL ByteL
ROL ByteH

На С придумал тут кое как (правда еще не выяснил правильно ли оно работает), но одним местом чую что есть более цивилизованный способ.....

Код: Выделить всё

ByteHi <<= 1;
if (ByteLo & (1<<7))
   ByteHi |= (1<<0);      
ByteLo <<= 1;
a_skr
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Re: Вопросы по С/С++ (СИ)

Сообщение a_skr »

Код: Выделить всё

short a = 0x1234;
a = a << 1; // двигаем переменную из 2-х байт
long b = 0x12345678;
b <<= 1; // двигаем переменную из 4-х байт
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Понял. Но мне еще нужно работать с отдельными байтами данного числа, как это делается, с помощью указателя?

(Для ясности, опишу подробнее задачу:
Схемка на АВР обрабатывает радиосигнал с приемника 433МГц. Посылка с радиобрелка состоит из 3-х байт, вернее 24 бита (они передаются сплошным потоком). Т.е. мне нужно каждый принятый бит впихнуть в эти 3 байта, и после завершения приема, проанализировать эти 3 байта по отдельности.)
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вопросы по С/С++ (СИ)

Сообщение zero648 »

Может можно так:
word <<=1
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Аватара пользователя
Yuri_93
Вымогатель припоя
Сообщения: 505
Зарегистрирован: Пт окт 15, 2010 10:26:31
Откуда: Украина

Re: Вопросы по С/С++ (СИ)

Сообщение Yuri_93 »

shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?

Дизассемблировать hex в avr-студии и найти отладчиком место где переменная передается в регистр
ut1wpr
Вымогатель припоя
Сообщения: 581
Зарегистрирован: Ср янв 05, 2011 10:03:18

Re: Вопросы по С/С++ (СИ)

Сообщение ut1wpr »

shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Циклить не обязательно. Это зависит от задачи отладки.
Практически в каждом отладчике есть возможность открывать дополнительные окна в режиме отладки. WATCH, MEMORY, EEPROM, REGISTRY, CPU...
Переменные нужно вводить в окно watch. Но помнить, не все переменные всегда отображаются. Глобальные и статические почти всегда. А вот локальные, ла еще внутри функции - их будет видно только тогда, когда вы "шагнете" в эту функцию. Это и понятно, эти переменные "живут" только на время обращения к этой функции. Потом их пространство отдается другим локальным. Стек функции называется. Почитайте про этот механизм, многие вопросы отпадут. Особенно, если начнете с настраиваемыми параметрами компилятора "играться"... :)
С уважением,
Виктор.
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вопросы по С/С++ (СИ)

Сообщение zero648 »

shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?

Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELF
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

zero648 писал(а):Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELF
Это вы про эмуляцию в протеусе???
Я не знал что так можно, попробую.....
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вопросы по С/С++ (СИ)

Сообщение zero648 »

Именно про протеус :)
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Прога на С, указал файл ELF, поставил брекпойнт где надо, но эмуляция не тормозит, что я не так делаю?
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вопросы по С/С++ (СИ)

Сообщение zero648 »

В протеусе в окне "Source code" в тексте ставите брейкпоинт или нет? Если да, тогда в контекстном меню надо -разрешить точки останова-
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Таккссс..... Уже теплее.
Я болбес ставил точки останова в AVR Studio, и думал что протеус там остановится:)

Далее:
Запускаю протеус, эмуляция идет, ставлю на паузу чтобы увидеть окно "Source code", а там пусто и написано "No source line at PC adress".....
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Вопросы по С/С++ (СИ)

Сообщение zero648 »

В окне Source code вверху есть окно, там выбираешь файл.
Аватара пользователя
shads
Опытный кот
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Re: Вопросы по С/С++ (СИ)

Сообщение shads »

Там тоже пусто.....
А так в окошке рядом показывает переменные и их значение, т.е. эмуляция нормально работает и контроль над сишными переменными есть, тока вот текста нет хош расшибись.....

в поиске нашел похожую проблему (один в один), http://www.microchip.su/showthread.php? ... nextoldest
но чем закончилось непонятно, там советовали все файлы в одну папку, а у меня в схеме протеуса - 2 контроллера (один типа сигнал пульта передает, а другой соответственно отлаживаю), у каждого свой проект в AVRStudio, и соотв-но разные папки, соответственно файлы программы для протеуса берутся оттуда, а сам проект для протеуса в третьей папке. Короче я в ступрое, как быть.....

Скинул все, в одну папку, мож глянете.....
Новая папка.rar
(27.44 КБ) 184 скачивания
Ответить

Вернуться в «Разные вопросы по МК»