Вопросы по синтаксису СИ
Ааааа... Ээээээ... Почему, если счетчик вынести в тело цикла у него меняется диапазон? Можно подробнее?
Последний раз редактировалось megasvintus Ср сен 17, 2008 09:53:11, всего редактировалось 2 раза.
Трудно быть деревянным, совсем трудно....
- Реклама
не меняется диапазон, просто сначала у вас i++ будет в теле цикла, а потом i будет printf-ом выводиться, т.е. для первого прогона цикла выведется 1, а не 0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
про прагму могу сказать лишь то, что это способ управлять компилятором (и/или компоновщиком) - вроде того, как в командной строке написать какой-то ключик... только прагма этот ключик может в середине работы как бы добавить, а потом, если надо - убрать... вот и получится, что кусок проги компилятор обработает как бы одинм способом, а кусок - другим... это хоть и распространенный метод, но в каждом компиляторе свой, а потому нестандартизирован...
#ifndef - директива условной компиляции, позволяет исключить кусок кода вплоть до #endif, если константа, указанная в этой директиве, уже определена
#ifndef - директива условной компиляции, позволяет исключить кусок кода вплоть до #endif, если константа, указанная в этой директиве, уже определена
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
обижаете... я уже таких глупостей давно не допускаю.chuchxe писал(а):Наверно OUTBIT в хидере .h не определен - может и в даташите такого бита нету. Можно самому define сделать.savage писал(а):С WinAVR не все так гладко. С ATTiny13 у меня он почему то ругается на
PORTB|=1<<OUTBIT;
и
PORTB&=~(1<<OUTBIT);
Седня, если время будет что нибудь компильну - сброшу что он пишет
странный у вас WinAVR - сколько работаю - никаких проблем не замечал...
и с тини13 в том числе плотно работаю...
как описан OUTBIT ?
и с тини13 в том числе плотно работаю...
как описан OUTBIT ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 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 он инкрементируется. В работе цикла это инкрементированное значение используется на следующем проходе.megasvintus писал(а):Почему, если счетчик вынести в тело цикла у него меняется диапазон?
НИЧЕГО НЕ ПОНИМАЮ!!!!
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;
}
да живите долго!savage писал(а):Можете меня застрелить, но я ничего не понимаю. Проект который полгода назад ругался на команды сдвига, откомпилился без варнингов.
на ваш вопрос ответ один - дело было не в боббине... явно проблема была в другом, а не в сдвиге...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Это понятно, но всеже интересно что было. Я просто взял проект, раскоментировал строки со сдвигом и описанием и закоментировал с явным двоичным описанием.
т.е. у меня сейчас
#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 байт всего.
уважаемый! я же говорил - дело не в сдвиге!!!
двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
а стек в тини13 до 64 байт - ОЗУ ведь такого размера... и при сдвиге он в общем-то нафик не нужен...//#define DATAOUT b00000001 //PINB0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Я в ШОКЕ, в АУТЕ.savage писал(а): НИЧЕГО НЕ ПОНИМАЮ!!!!![]()
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Это я набирал сейчас. Поскольку уже выгрузил VmWare с виндой и WinAVR, AVRStudio и CVAVR. К сожалению мне не понравилась связка Eclipse+AVRGCC в Linux.двоичная константа обязана начинаться с 0b а не просто b!!! вот вам и ошибка!
То есть, эта опечатка к проблеме отношения не имеет.
Если интересно вот сам файл. Вместе с мусором правда.
http://radiokot.ru/forum/files/fuel13_661.c
- Вложения
-
- fuel13.c
- (3.47 КБ) 371 скачивание
попробовал я ваш проект - с любым способом задания констант - и с двоичными константами, и с десятичными - компилится без ошибок 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
О чем я и говорю.
А когда я его делал, вначале весны кажется. он ругался
После чего я закоментировал все что относилось к сдвигу и откомпилировал с заранее вычисленными константами. Девайс заработал и ладно. Потом правил расчет среднего значения еще чтото, но вывод в порт не трогал.
А сейчас вот вспомнилось про этот глюк. Всетаки странно както.
Сколько флуда получилось....
А когда я его делал, вначале весны кажется. он ругался
После чего я закоментировал все что относилось к сдвигу и откомпилировал с заранее вычисленными константами. Девайс заработал и ладно. Потом правил расчет среднего значения еще чтото, но вывод в порт не трогал.
А сейчас вот вспомнилось про этот глюк. Всетаки странно както.
Сколько флуда получилось....
Флуд тоже полезен. бывает что это приводит к нахождению ответов на некоторые вопросы. Вот флудил я флудил, задавал дурацкие вопросы, а 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 раза.
Посмотри пример вывода на LCD температуры с десятыми в примрах к CVAVR
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru


