Страница 103 из 386
Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 30, 2012 22:15:49
Аlex
А вопрос то какой ? Вы вроде задали вопрос и сами же на него ответили.
как понять эти символы
<< - это вроде смещение влево
а это >> а это вправо

Re: Вопросы по С/С++ (СИ)
Добавлено: Пн июл 30, 2012 23:55:01
vitalik_1984
mastech писал(а):у меня вопрос по Си как понять эти символы << - это вроде смещение влево а это >> а это вправо, просто не могу понять их работу.
их вроде можно записать по другому?
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
while ((PIND&(1 << PD0)) == 1){}[/quote]
смотрим файл 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;
исправил ошибку, пока не поздно, чтобы остальных не вводить в заблуждение.
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт июл 31, 2012 00:21:37
mastech
значит эту запись (PIND|=((1 << PD0)|(1 << PD4)|1 << PD5) можно сменить на PIND|=0b00110001;?
и зачем их смещать?))
так стоп кажись понял допустим 1 << PD0- это означает: присваиваем 1 порту PD0, далее 1 << PD4: присваиваем 1 PD4 и т.д., |(или) - логическое сложение и все это дело присваивается(=) к пинам PIND, верно?
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт июл 31, 2012 00:38:26
ut1wpr
mastech писал(а):значит эту запись (PIND|=((1 << PD0)|(1 << PD4)|1 << PD5) можно сменить на PIND|=0b00110001;?
и зачем их смещать?))
Для удобства чтения через год. Только непонятно, зачем вы модифицируете в этом примере порт ввода. Из него читают состояния на входных пинах.
Вы можете, безусловно, написать PORTD |= 0x31, но если вы плохо умеете "на лету" читать 16-ричную запись, то легче запомнить так "В PORTD надо выводы 0, 4 и 5 перевести в состояние "1". А вот запись в PIND бессмысленна. Попутно разберитесь, чем отличаются операции чтения из порта, записи в порт и чтение-модификация-запись. Т.е. уловите разницу между просто "=" и "|="...
Re: Вопросы по С/С++ (СИ)
Добавлено: Вт июл 31, 2012 10:20:13
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);//зажигаем светодиод
таким образом можно изменять ногу на которую подключен светодиод в пределах порта.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 10:49:18
shads
Год как освоил ассемблер для AVR (до этого на асме писал под ZILOG), теперь вот взялся C грызть (вообще раньше дела не имел), да чет буксую.....
Вопрос: как на C можно сдвинуть несколько байт, как одно целое. Чтобы старший бит младшего байта переходил в младший бит старшего байта (при сдвиге в лево, например).
На асме это выглядит так:
На С придумал тут кое как (правда еще не выяснил правильно ли оно работает), но одним местом чую что есть более цивилизованный способ.....
Код: Выделить всё
ByteHi <<= 1;
if (ByteLo & (1<<7))
ByteHi |= (1<<0);
ByteLo <<= 1;
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 10:55:00
a_skr
Код: Выделить всё
short a = 0x1234;
a = a << 1; // двигаем переменную из 2-х байт
long b = 0x12345678;
b <<= 1; // двигаем переменную из 4-х байт
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 11:08:53
shads
Понял. Но мне еще нужно работать с отдельными байтами данного числа, как это делается, с помощью указателя?
(Для ясности, опишу подробнее задачу:
Схемка на АВР обрабатывает радиосигнал с приемника 433МГц. Посылка с радиобрелка состоит из 3-х байт, вернее 24 бита (они передаются сплошным потоком). Т.е. мне нужно каждый принятый бит впихнуть в эти 3 байта, и после завершения приема, проанализировать эти 3 байта по отдельности.)
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 11:35:46
zero648
Может можно так:
word <<=1
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 14:46:53
shads
Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 16:37:11
Yuri_93
shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Дизассемблировать hex в avr-студии и найти отладчиком место где переменная передается в регистр
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 17:25:31
ut1wpr
shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Циклить не обязательно. Это зависит от задачи отладки.
Практически в каждом отладчике есть возможность открывать дополнительные окна в режиме отладки. WATCH, MEMORY, EEPROM, REGISTRY, CPU...
Переменные нужно вводить в окно watch. Но помнить, не все переменные всегда отображаются. Глобальные и статические почти всегда. А вот локальные, ла еще внутри функции - их будет видно только тогда, когда вы "шагнете" в эту функцию. Это и понятно, эти переменные "живут" только на время обращения к этой функции. Потом их пространство отдается другим локальным. Стек функции называется. Почитайте про этот механизм, многие вопросы отпадут. Особенно, если начнете с настраиваемыми параметрами компилятора "играться"...

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 18:21:42
zero648
shads писал(а):Еще вопросик: Как отлаживать прогу на С?
В асме там все просто, зациклил в нужном месте прогу, запустил эмуляцию в протеусе, остановил и смотриш содержимое нужного регистра.
А на С, как узнать содержимое переменной?
Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELF
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 18:44:12
shads
zero648 писал(а):Чтобы не зацикливать, нужно в свойствах МК указывать не .НЕХ файл, а объектный файл .OBJ, тогда просто поставил брейкпоинт в нужной строке программы и всё, если прога на С, тогда указывай файл .ELF
Это вы про эмуляцию в протеусе???
Я не знал что так можно, попробую.....
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 18:49:36
zero648
Именно про протеус

Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 18:52:29
shads
Прога на С, указал файл ELF, поставил брекпойнт где надо, но эмуляция не тормозит, что я не так делаю?
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 19:00:56
zero648
В протеусе в окне "Source code" в тексте ставите брейкпоинт или нет? Если да, тогда в контекстном меню надо -разрешить точки останова-
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 19:18:57
shads
Таккссс..... Уже теплее.
Я болбес ставил точки останова в AVR Studio, и думал что протеус там остановится:)
Далее:
Запускаю протеус, эмуляция идет, ставлю на паузу чтобы увидеть окно "Source code", а там пусто и написано "No source line at PC adress".....
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 20:11:52
zero648
В окне Source code вверху есть окно, там выбираешь файл.
Re: Вопросы по С/С++ (СИ)
Добавлено: Сб авг 04, 2012 20:47:22
shads
Там тоже пусто.....
А так в окошке рядом показывает переменные и их значение, т.е. эмуляция нормально работает и контроль над сишными переменными есть, тока вот текста нет хош расшибись.....
в поиске нашел похожую проблему (один в один),
http://www.microchip.su/showthread.php? ... nextoldest
но чем закончилось непонятно, там советовали все файлы в одну папку, а у меня в схеме протеуса - 2 контроллера (один типа сигнал пульта передает, а другой соответственно отлаживаю), у каждого свой проект в AVRStudio, и соотв-но разные папки, соответственно файлы программы для протеуса берутся оттуда, а сам проект для протеуса в третьей папке. Короче я в ступрое, как быть.....
Скинул все, в одну папку, мож глянете.....