Вопросы по синтаксису СИ
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
Ааааа... Ээээээ... Почему, если счетчик вынести в тело цикла у него меняется диапазон? Можно подробнее?
Последний раз редактировалось megasvintus Ср сен 17, 2008 09:53:11, всего редактировалось 2 раза.
Трудно быть деревянным, совсем трудно....
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не меняется диапазон, просто сначала у вас i++ будет в теле цикла, а потом i будет printf-ом выводиться, т.е. для первого прогона цикла выведется 1, а не 0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
про прагму могу сказать лишь то, что это способ управлять компилятором (и/или компоновщиком) - вроде того, как в командной строке написать какой-то ключик... только прагма этот ключик может в середине работы как бы добавить, а потом, если надо - убрать... вот и получится, что кусок проги компилятор обработает как бы одинм способом, а кусок - другим... это хоть и распространенный метод, но в каждом компиляторе свой, а потому нестандартизирован...
#ifndef - директива условной компиляции, позволяет исключить кусок кода вплоть до #endif, если константа, указанная в этой директиве, уже определена
#ifndef - директива условной компиляции, позволяет исключить кусок кода вплоть до #endif, если константа, указанная в этой директиве, уже определена
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
chuchxe писал(а):savage писал(а):С WinAVR не все так гладко. С ATTiny13 у меня он почему то ругается на
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);
Наверно OUTBIT в хидере .h не определен - может и в даташите такого бита нету. Можно самому define сделать.
обижаете... я уже таких глупостей давно не допускаю.
Седня, если время будет что нибудь компильну - сброшу что он пишет
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
странный у вас WinAVR - сколько работаю - никаких проблем не замечал...
и с тини13 в том числе плотно работаю...
как описан OUTBIT ?
и с тини13 в том числе плотно работаю...
как описан OUTBIT ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Да это, скорее, к автору вопроса относилось - а-то, он так и подумал, что в примере к компилятору содержится стилистическая (да и синтаксическая!) ошибка.ARV писал(а):...файла этого я и в глаза не видел
Ага, для первого - 1, а не 0, а для последнего - devices, а не devices - 1; это и имелось ввиду под смещением диапазона значений. Просто, megasvintus не обратил внимание на то, что одна переменная используется и в качестве счетчика цикла, и в качестве номера устройства на шине.ARV писал(а):не меняется диапазон, просто ... для первого прогона цикла выведется 1, а не 0
Те, кто не экономит, написали бы так:
Код: Выделить всё
/* 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 отрабатывает только один раз, и никакой экономии там нет. Но писать нужно именно так!
Диапазон меняется не оттого, что приращение счетчика цикла вынесено в тело, а оттого, что перед передачей его значения в sprintf он инкрементируется. В работе цикла это инкрементированное значение используется на следующем проходе.megasvintus писал(а):Почему, если счетчик вынести в тело цикла у него меняется диапазон?
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
НИЧЕГО НЕ ПОНИМАЮ!!!!
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
- Откуда: Новочеркасск
- Контактная информация:
да живите долго!savage писал(а)::shock: Можете меня застрелить, но я ничего не понимаю. Проект который полгода назад ругался на команды сдвига, откомпилился без варнингов.
на ваш вопрос ответ один - дело было не в боббине... явно проблема была в другом, а не в сдвиге...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
Это понятно, но всеже интересно что было. Я просто взял проект, раскоментировал строки со сдвигом и описанием и закоментировал с явным двоичным описанием.
т.е. у меня сейчас
#define DATAOUT 0 //PINB0
#define CLOCKOUT 1 //PINB1
....
//#define DATAOUT b00000001 //PINB0
//#define CLOCKOUT b00000010 //PINB1
...
PORTB&= ~(1<<CLOCKOUT);
//PORTB&= ~CLOCKOUT;
К сожалению я не помню что он конкретно писал.
При таких операциях стек используется? У меня было много вызоыовподпрограм. По мере отладки их стало меньше. Я думаю после этого заработало. Стек то маленький. На сколько помню 16 байт всего.
т.е. у меня сейчас
#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
- Откуда: Новочеркасск
- Контактная информация:
уважаемый! я же говорил - дело не в сдвиге!!!
двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
а стек в тини13 до 64 байт - ОЗУ ведь такого размера... и при сдвиге он в общем-то нафик не нужен...
двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
//#define DATAOUT b00000001 //PINB0
а стек в тини13 до 64 байт - ОЗУ ведь такого размера... и при сдвиге он в общем-то нафик не нужен...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- tych
- Э...
- Сообщения: 2792
- Зарегистрирован: Ср апр 04, 2007 08:39:14
- Откуда: Москва
- Контактная информация:
savage писал(а): НИЧЕГО НЕ ПОНИМАЮ!!!!![]()
Я в ШОКЕ, в АУТЕ.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
двоичная константа обязана начинаться с 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
- Откуда: Новочеркасск
- Контактная информация:
попробовал я ваш проект - с любым способом задания констант - и с двоичными константами, и с десятичными - компилится без ошибок 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- savage
- Нашел транзистор. Понюхал.
- Сообщения: 187
- Зарегистрирован: Пн дек 17, 2007 14:06:09
- Откуда: Саранск
О чем я и говорю.
А когда я его делал, вначале весны кажется. он ругался
После чего я закоментировал все что относилось к сдвигу и откомпилировал с заранее вычисленными константами. Девайс заработал и ладно. Потом правил расчет среднего значения еще чтото, но вывод в порт не трогал.
А сейчас вот вспомнилось про этот глюк. Всетаки странно както.
Сколько флуда получилось....
А когда я его делал, вначале весны кажется. он ругался
После чего я закоментировал все что относилось к сдвигу и откомпилировал с заранее вычисленными константами. Девайс заработал и ладно. Потом правил расчет среднего значения еще чтото, но вывод в порт не трогал.
А сейчас вот вспомнилось про этот глюк. Всетаки странно както.
Сколько флуда получилось....
- megasvintus
- Вымогатель припоя
- Сообщения: 568
- Зарегистрирован: Вт мар 04, 2008 20:03:03
- Откуда: Нижний Новгород
Флуд тоже полезен. бывает что это приводит к нахождению ответов на некоторые вопросы. Вот флудил я флудил, задавал дурацкие вопросы, а ARV случайно обмолвился что после #define не надо применять комментарии после //. Меня осенило... Убрал такие из одного кода, и он(код) перестал глючить. До этого просто вскипел, пытаясь разобраться почему вроде все правильно НО НЕ РАБОТАЕТ!
Сорри за флуд!
Сорри за флуд!
Трудно быть деревянным, совсем трудно....
Требуется выводить на ЖКИ индикатор значение напряжения, расчитанного по формуле "(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){
}
}
#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
- Откуда: Москва
- Контактная информация:
Посмотри пример вывода на LCD температуры с десятыми в примрах к CVAVR
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru