Вопросы по синтаксису СИ

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Вопросы по синтаксису СИ

Сообщение megasvintus »

Всех приветствую!
Сижу, разбираю примеры, которые разработчики CVAVR любезно предоставили в комплекте с компилятором. Понятное дело- тексты писаны профессионалами, и кое-что в них совсем не понятно:

1) Файл ds18b20.с, есть строки:
#define MAX_DEVICES 8 //Тут всё ясно
unsigned char rom_code[MAX_DEVICES][9] /* а здесь непонятен синтаксис, вроде бы объявляется массив, но как-то интересно указывается количество членов. Компилятор потом же вместо MAX_DEVICES подставит цифру 8 и получится
unsigned char rom_code[8[9] Как это работает?

2) Код, в котором происходит инициализация термометров и настройка их на 12 битное разрешение, я если честно, мало не понял как сие работает.

for(i=0;i<devices)
if(!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
далее всего лишь вывод результатв на дисплей.

Насколько я понял, идет поочередная инициализация всех найденных девайсов и их настройка. Для этого тут есть цикл for, непонятно вот что:
а) Почему счетчик i++ вынесен в функцию if? неужели помимо проверки условия в скобках if(условие) сразу может исполняться код записанный в этих скобках?

б) для чего стоит ! и DS18B20_12BIT_RES- понятно. Объясните, пожалуйста как работает остальное, для чего, к примеру [0], 10, 20, 30- что это такое? Почему 0 в квадр. скобках, а остальное -нет?
А для чего стоит & перед rom_code?
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

1. с define не все так уж и ясно. очень рекомендую не использовать в строке #define комментарий типа // - лучше применяйте /* такой комментарий */
2. объявляется двумерный массив, т.е. матрица из 8 строк и 9 столбцов
3. синтаксис Си допускает использовать операторы ++ и -- всюду, где используются переменные.
4. рекомендую придерживаться стандартно-полного формата записи оператора for - в вашем случае так: for(i=0;i<devices;) - т.е. точка с запятой после второй части оператора
5. посмотрите на параметры функции ds18b20_init() и вы увидите, что у нее 4 параметра - первый это указатель на элемент вашего двумерного массива, а три остальных и указаны через запятые, что это означает - надо смотреть в описании функции (я не пользуюсь CVAVR потому и не могу сказать)
6. & перед rom_code - это оператор получения адреса элемента массива - первый параметр функции ds18b20_init() должен быть указателем, т.е. адресом - вот этот оператор и используется). я бы советовал использовать перед ним (void *) - так корректнее.

P.S. Все рекомендации мои касаются соблюдения стандарта языка Си - то, что компилятор CVAVR допускает вольности - не должно вводить вас в заблуждение, лучше придерживаться требований стандарта, тогда не возникнет проблем с переносимостью на другие компиляторы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Спасибо! Жаль, что авторы компилятора не придерживаются общих правил, а пользуются "вольностями". Это усложняет процесс понимания данных примеров
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

megasvintus писал(а):Спасибо! Жаль, что авторы компилятора не придерживаются общих правил, а пользуются "вольностями". Это усложняет процесс понимания данных примеров
пользуйтесь WinAVR - его авторы придерживаются стандарта С99 очень сильно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Для начала освою CVAVR, а то и так глаза разбегаются от обилия информации. А то если возьмусь еще и за WinAVR, то будет как в поговорке: за двумя зайцами погонишься...

Хотя чувствую что необходимость изучить WinAVR наступит.
Кстати, там есть такая полезная штука как генератор начального кода?
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

megasvintus писал(а):Кстати, там есть такая полезная штука как генератор начального кода?
нет. генератор начального кода с моей точки зрения штука для начинающих вредная
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Может быть я с вами и соглашусь по этому вопросу, когда дорасту хотя бы до 1/10 вашего уровня :)))

Дело вот в чем, я всегда смотрю в даташит почему мастер написал то-то... Есть эталон, где все совершенно верно.
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

если бы мастер CVAVR генерировал хороший код - я не так был бы настроен против него. но он генерирует код, который не помогает, а затрудняет понимание происходящего.
сравните:

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

// нормальный программист пишет так:
    ADCSRA = (1<<ADEN)|(1<<ADIE);

// для WinAVR можно написать так:
    ADCSRA = _BV(ADEN)|_BV(ADIE);

// "мастер" генерирует то же самое так:
    ADCSRA = 0x88;

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

P.S. К сожалению, я не встречал "автогенераторов кода", которые генерировали бы красивый код, хотя никакой проблемы в этом нет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

Спасибо! Четко доказали!
Трудно быть деревянным, совсем трудно....
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

megasvintus писал(а): я всегда смотрю в даташит почему мастер написал то-то...

Обязательно надо это читать и понимать значение записываемых в регистры чисел - в курсе я советую обязательно разбираться и писать СВОИ комментарии к коду мастера с указанием страниц даташита.

ARV писал(а): но с каждым разом все меньше и меньше понимаете, почему оно работает.

Вы своим опытом делитесь ? Спсибо ! он бесценен.
ARV писал(а):

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

// "мастер" генерирует то же самое так: 
    ADCSRA = 0x88;

И даже комментариев не даёт ? Ай-ай-ай ...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

tych писал(а):Вы своим опытом делитесь ? Спсибо ! он бесценен.
пожалуйста, пользуйтесь на здоровье :) к несчастью для себя, я делюсь действительно своим опытом, а не чужим, как вы, tych. правда на счет непонимания опыта у меня нет, делиться нечем...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

tych писал(а):И даже комментариев не даёт ? Ай-ай-ай ...
не знаю на счет комментариев - не пользуюсь CVAVR, если не считать пары опытов, чтоб войти в курс дела...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

ARV писал(а): на счет непонимания опыта у меня нет, делиться нечем...

У вас большой опыт врать цитируя то что вам выгодно ! Но зря вы им делитесь.

А реально код мастера в примере
C:\CVAVR\examples\ADC8535
выглядит вот так:

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

// ADC initialization
// ADC Clock frequency: 57.600 kHz
// ADC Voltage Reference: AREF pin
// ADC High Speed Mode: Off
// ADC Auto Trigger Source: None
// Only the 8 most significant bits of
// the AD conversion result are used
// Select ADC input 0
ADMUX=ADC_VREF_TYPE;
ADCSRA=0x8E;
SFIOR&=0xEF;

// Global enable interrupts
#asm("sei")

// Start the first AD conversion
ADCSRA|=0x40;


ПОЧУВСТВУЙТЕ РАЗНИЦУ !!!

ARV писал(а):не знаю на счет комментариев - не пользуюсь CVAVR, если не считать пары опытов, чтоб войти в курс дела...

Пастернака не читал, но осуждаю ...
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

tych писал(а):У вас большой опыт врать цитируя то что вам выгодно ! Но зря вы им делитесь.
в этом мы одинаковы - вы тоже цитируете только то, что вам выгодно. и назовите мне хоть кого-то, кто делает цитаты себе во вред :) кроме того, я не цитирую, а говорю по тем впечатлениям, что получил от нескольких опытов.

что же касается показанного вами примера - и что толку с тех комментариев?! я понимаю, что лично вам, благодаря мастеру-автогенератору кода, не надо думать ("было бы ошибкой думать" ©В.И.Ленин), как настроить АЦП на другую частоту сэмплов, но если придется - как поступать станете? много ли пользы получите от "// ADC Clock frequency: 57.600 kHz " и "ADCSRA=0x8E;"? для чего в хидерах расписаны имена всех битов всех регистров?! чтобы их использовать, а не загадочные числа шестнадцатеричные писать - вот мое мнение.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

В любом случае, если человеку оно надо, он возьмет шестнадцатиричное число, переведет его в двоичное, посмотрит название и функционал соответствующих битов в даташите и навсегда запомнит, ну а если человеку это не нужно - так и говорить не о чем. Такое мое мнение.
Заканчиваем оффтоп, дружненько так, хорошо?
Оптимизм х (Опыт + Знания) = const
kalobyte
Друг Кота
Сообщения: 13796
Зарегистрирован: Чт сен 20, 2007 14:08:00

Сообщение kalobyte »

в справке по компилятору описаны входные параметры для этой функции термометра
Аватара пользователя
savage
Нашел транзистор. Понюхал.
Сообщения: 187
Зарегистрирован: Пн дек 17, 2007 14:06:09
Откуда: Саранск

Сообщение savage »

С WinAVR не все так гладко. С ATTiny13 у меня он почему то ругается на
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);

Приходится указывать явно PORTB|=b00001000;
В тоже время CVAVR работает нормально.
С другими контроллерами работает нормально. Интересно почему?
Дня три убил пока разобрался.Так что не все так просто.
chuchxe
Родился
Сообщения: 8
Зарегистрирован: Вс сен 14, 2008 23:18:09

Сообщение chuchxe »

savage писал(а):С WinAVR не все так гладко. С ATTiny13 у меня он почему то ругается на
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);

Наверно OUTBIT в хидере .h не определен - может и в даташите такого бита нету. Можно самому define сделать.
Всем СПАТЬ !
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение Yellow Tiger »

ARV писал(а):рекомендую придерживаться стандартно-полного формата записи оператора for - в вашем случае так: for(i=0;i<devices;) - т.е. точка с запятой после второй части оператора
Вообще-то, в указанном файле так и написано - с двумя точко-запятыми:
Изображение
А кроме того - по идее, компилятор должен выдать ошибку "For statement missing ;" на такой фортель, как отсутствие точки с запятой.

megasvintus писал(а):Жаль, что авторы компилятора не придерживаются общих правил, а пользуются "вольностями".
Нет здесь вольности :)) - точка с запятой в исходнике на месте, а "i++" вынесен в тело цикла для того, чтобы в вызове sprintf счетчик цикла имел диапазон значений от 1, а не от 0 - так всем (кроме пишущих на Си) привычнее.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Yellow Tiger писал(а):Вообще-то, в указанном файле так и написано - с двумя точко-запятыми
я отвечал по тексту сообщения, файла этого я и в глаза не видел
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»