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

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

Сообщение megasvintus »

Ааааа... Ээээээ... Почему, если счетчик вынести в тело цикла у него меняется диапазон? Можно подробнее?
Последний раз редактировалось megasvintus Ср сен 17, 2008 09:53:11, всего редактировалось 2 раза.
Трудно быть деревянным, совсем трудно....
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

не меняется диапазон, просто сначала у вас i++ будет в теле цикла, а потом i будет printf-ом выводиться, т.е. для первого прогона цикла выведется 1, а не 0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение megasvintus »

Спасибо! Понял!
А расскажите еще про директивы #pragma и #ifndef
что такое #pragma used +- ? Много перерыл информации по си, но эти директивы лишь упоминаются без подробного разбора.
Трудно быть деревянным, совсем трудно....
Аватара пользователя
megasvintus
Вымогатель припоя
Сообщения: 568
Зарегистрирован: Вт мар 04, 2008 20:03:03
Откуда: Нижний Новгород

Сообщение megasvintus »

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

Сообщение ARV »

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

#ifndef - директива условной компиляции, позволяет исключить кусок кода вплоть до #endif, если константа, указанная в этой директиве, уже определена
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение megasvintus »

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

Сообщение savage »

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

Наверно OUTBIT в хидере .h не определен - может и в даташите такого бита нету. Можно самому define сделать.

обижаете... я уже таких глупостей давно не допускаю. :)) Как грится, не первый год за мужем. Но тем не менее факт медицинский.

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

Сообщение ARV »

странный у вас WinAVR - сколько работаю - никаких проблем не замечал...
и с тини13 в том числе плотно работаю...
как описан OUTBIT ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

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

ARV писал(а):...файла этого я и в глаза не видел
Да это, скорее, к автору вопроса относилось - а-то, он так и подумал, что в примере к компилятору содержится стилистическая (да и синтаксическая!) ошибка.

ARV писал(а):не меняется диапазон, просто ... для первого прогона цикла выведется 1, а не 0
Ага, для первого - 1, а не 0, а для последнего - devices, а не devices - 1; это и имелось ввиду под смещением диапазона значений. Просто, megasvintus не обратил внимание на то, что одна переменная используется и в качестве счетчика цикла, и в качестве номера устройства на шине.
Те, кто не экономит, написали бы так:

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

/* configure each DS18B20 device for 12 bit temperature
   measurement resolution */
for (i=0;i<devices;++i)
    if (!ds18b20_init(&rom_code[i++][0],20,30,DS18B20_12BIT_RES))
       {
       sprintf(lcd_buffer,"Init error for\ndevice #%u",i+1);
       lcd_clear();
       lcd_puts(lcd_buffer);
       while (1); /* stop here if init error */
       };

Но авторы этого кода, действуя по привычке, "избежали" операций сложения с единицей, которые, если не присматриваться, кажутся многократно исполняемыми. На самом деле, участок кода с вызовом sprintf отрабатывает только один раз, и никакой экономии там нет. Но писать нужно именно так! :)

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

Сообщение savage »

:shock: Можете меня застрелить, но я ничего не понимаю. Проект который полгода назад ругался на команды сдвига, откомпилился без варнингов.
НИЧЕГО НЕ ПОНИМАЮ!!!! :shock:

ARV
OUTPIN описан стандартно. с помощью define.
Вот кусочки из проекта

#define DATAOUT 0 //PINB0
#define CLOCKOUT 1 //PINB1
#define DIGIT1 2 //PINB2
#define DIGIT2 3 //PINB3
#define DIGIT3 5 // PINB5
......

for (i= 0;i<8;i++)
{
PORTB&= ~(1<<CLOCKOUT);
if (num % 2)
{
PORTB|=1<<DATAOUT;
}
else
{
PORTB&= ~(1<<DATAOUT);
}
PORTB|= 1<<CLOCKOUT;
num = num / 2;
}
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

savage писал(а)::shock: Можете меня застрелить, но я ничего не понимаю. Проект который полгода назад ругался на команды сдвига, откомпилился без варнингов.
да живите долго! :)
на ваш вопрос ответ один - дело было не в боббине... явно проблема была в другом, а не в сдвиге... ;)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение savage »

Это понятно, но всеже интересно что было. Я просто взял проект, раскоментировал строки со сдвигом и описанием и закоментировал с явным двоичным описанием.

т.е. у меня сейчас
#define DATAOUT 0 //PINB0
#define CLOCKOUT 1 //PINB1
....
//#define DATAOUT b00000001 //PINB0
//#define CLOCKOUT b00000010 //PINB1
...

PORTB&= ~(1<<CLOCKOUT);
//PORTB&= ~CLOCKOUT;

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

Сообщение ARV »

уважаемый! я же говорил - дело не в сдвиге!!!
двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
//#define DATAOUT b00000001 //PINB0


а стек в тини13 до 64 байт - ОЗУ ведь такого размера... и при сдвиге он в общем-то нафик не нужен...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

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

Сообщение tych »

savage писал(а): НИЧЕГО НЕ ПОНИМАЮ!!!! :shock:

Я в ШОКЕ, в АУТЕ.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
savage
Нашел транзистор. Понюхал.
Сообщения: 187
Зарегистрирован: Пн дек 17, 2007 14:06:09
Откуда: Саранск

Сообщение savage »

двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!


Это я набирал сейчас. Поскольку уже выгрузил VmWare с виндой и WinAVR, AVRStudio и CVAVR. К сожалению мне не понравилась связка Eclipse+AVRGCC в Linux.
То есть, эта опечатка к проблеме отношения не имеет.
Если интересно вот сам файл. Вместе с мусором правда.
http://radiokot.ru/forum/files/fuel13_661.c
Вложения
fuel13.c
(3.47 КБ) 370 скачиваний
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

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

Сообщение savage »

О чем я и говорю.
А когда я его делал, вначале весны кажется. он ругался :(
После чего я закоментировал все что относилось к сдвигу и откомпилировал с заранее вычисленными константами. Девайс заработал и ладно. Потом правил расчет среднего значения еще чтото, но вывод в порт не трогал.
А сейчас вот вспомнилось про этот глюк. Всетаки странно както.

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

Сообщение megasvintus »

Флуд тоже полезен. бывает что это приводит к нахождению ответов на некоторые вопросы. Вот флудил я флудил, задавал дурацкие вопросы, а ARV случайно обмолвился что после #define не надо применять комментарии после //. Меня осенило... Убрал такие из одного кода, и он(код) перестал глючить. До этого просто вскипел, пытаясь разобраться почему вроде все правильно НО НЕ РАБОТАЕТ!

Сорри за флуд! :)))
Трудно быть деревянным, совсем трудно....
KIP
Первый раз сказал Мяу!
Сообщения: 36
Зарегистрирован: Ср июл 09, 2008 11:48:16
Откуда: Обнинск

Сообщение KIP »

Требуется выводить на ЖКИ индикатор значение напряжения, расчитанного по формуле "(adcl*5)/1024". Проблемма в том, что функция расчёта возвращает только целое значение напряжения, а дробную часть отсекает. Подскажите, где ошибка?


#include <mega16>
#include <delay>
#include <stdio>
#include <stdlib>

#asm
.equ __lcd_port=0x18 ;PORTB
#endasm


#include <lcd>

#define ADC_VREF_TYPE 0x00
#define quantity_of_chanel 2

char lcd_buffer[10];
float f;
unsigned int adcl;
unsigned int adch;
unsigned char number_of_chanel;

float raschet_naprygeniay(unsigned int adcl){
//float q;
//q=(adcl*5)/1024;
return (adcl*5)/1024;
}

interrupt [ADC_INT] void adc_conv (void) {


if(number_of_chanel<=quantity_of_chanel)
{
adcl = ADCL;
adch = ADCH;
adch = adch<<8>quantity_of_chanel)
{
{
number_of_chanel=0;
}
ADMUX=number_of_chanel;

//delay_ms(20);

ADCSRA|=0x40;
}


}


void main(void) {


PORTB=0x00;
number_of_chanel = 0;

ADCSRA=0x8E;
lcd_init(16);
lcd_putsf("U=");
lcd_gotoxy(6,0);
lcd_putsf("V");
SREG |= (1 << 7);
ADMUX=0;
ADCSRA|=0x40;
while (1){

}


}
Последний раз редактировалось KIP Вс сен 21, 2008 15:35:21, всего редактировалось 4 раза.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Посмотри пример вывода на LCD температуры с десятыми в примрах к CVAVR
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Закрыто

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