Так вот с ее помощью задаю число, а потом пишу его в переменную key (unsigned int) . Переменная полностью совпадает с тем что ввел с клавы. Далее это число нужно умножить на регистр IRC1 и разделить на 100, по началу казалось фигней, но когда IRC1 умножаю на любое число походу происходит переполнение и в результате вижу совсем другой конечный результат. Переменная в которую пишу (f) имеет уже тип unsigned long int, но это так и не помогло вот так вот делаю: f=(unsigned int)(ICR1*key/100); Компилятор ругается мол переполнение: overflow is possible in 16 bit multiplication, casting to 'long' may be required В чем я прокололся?
вы, как и многие до вас, не учитываете правило неявного преобразования типов операндов в выражениях. а правило таково: 1. при вычислении выражения с двумя операндами значения обоих операндов приводятся к наибольшему (по размеру) типу этих операндов. 2. если оба операнда имеют тип char - оба преобразуются к int. 3. результат вычисления выражения имеет тот же тип, что и операнды. 4. после того, как выражение вычислено к результату применяется правило приведения типа так же, как было сказано. если больше вычислений в операторе нет - тип результата приводится к типу переменной, принимающей значение.
итак, разберем ваш пример. переменная а имеет тип long (знак пока роли не играет). поэтому то, что результату выражения (ICR1 * key / 100) вы принудительно назначаете тип int - ничего не меняет, после того, как вы измените тип на int он будет снова ПРИНУДИТЕЛЬНО изменен на тип, соответствующей f, т.е. long. ваше действие БЕССМЫСЛЕННО. теперь смотрим на выражение. оно вычисляется слева направо, т.е. сначала вычисляется ICR1 * key. key у вас char, поэтому без всяких рассуждений превращается в int. ICR1, как я понимаю, уже имеет тип int. результат выражения тоже будет int!!! но при умножении int * int результат может быть long - вот ваша проблема! и компилятор об этом вас честно предупреждает - скажите ему спасибо. что же надо сделать, чтобы исправить ситуацию? надо заставить компилятор считать, что в умножении участвует хотя бы один операнд long - никак иначе! то есть вам надо не тип результата менять, а тип операнда! то есть решением будет f= (long)ICR1 * key / 100; для страховки я бы еще и к константе 100 приписал суффикс L, чтобы она тоже считалась не int-ом, а long-ом. итак, окончательное решение: f= (long)ICR1 * key / 100L;
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
void main() { PORTA=0; DDRA=0xFF; while(1) { PORTA=0xFF; //зажигаем светик for(i=0;i<3*60;i++)//ждём 3 минуты { Delay_ms(1000); //задержка в секунду } PORTA=0; //гасим светик for(i=0;i<3*60*60;i++)//ждём 3 часа { //3*60*60= 10800 укладываемся в int Delay_ms(1000); } // и всё с начала } }
Последний раз редактировалось alex_ Пт дек 12, 2014 08:26:44, всего редактировалось 1 раз.
void main() { PORTA=0; DDRA=0xFF; while(1) { PORTA=0xFF; //зажигаем светик for(i=0;i<3*60;i++)//ждём 3 минуты { Delay_ms(1000); //задержка в секунду } PORTA=0; //гасим светик for(i=0;i<3*60*60;i++)//ждём 3 часа { //3*60*60= 10800 укладываемся в int Delay_ms(1000); } // и всё с начала } }
все гениальное просто) я почему то смотрел в аппаратную часть чтоб не загружать проц, а что если нужно чтоб при нажатии кнопки выполнялась другая функция?
_________________ Разработал: -BLDC -ФУОЗ/МПСЗ -SMART BMS -ECU/EDC на STM32F4(43%)+CPLD(57%) -Моноинжектор на ATSAMD20G16 -контроллер эффектов для RGB LED ленты -умные часы/обратный счет/секундомер -устройство измерения емкости АКБ
Заголовок сообщения: Re: Нескольно простых вопросов о программировании AVR на Си.
Добавлено: Пн мар 02, 2015 18:58:12
Родился
Зарегистрирован: Пн мар 02, 2015 18:49:18 Сообщений: 1
Рейтинг сообщения:0
Уважаемые КОТЫ!! А как опросить весь порт сразу? Я думал так: i=PORTD; и решил вывести данные сразу же на другой порт : PORTB=i; не получилось. подскажите что не так!!! CVAVR
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения