Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

возможно, что предупреждение выдается из-за того, что ADCSRA является volatile переменной и изменение одного бита делается путем чтение-модификация-запись, в течение которого может измениться значение других битов. скомпилируйте и укажите на hex, может изменится поведение?
Ставим плюсы: )
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Блин че за проблема вообще я не понял? Раньше в винавр если был проект почему нельзя тупо перенести? это ведь не наоборот.

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

Либо используйте прерывание, либо тупой цикл, чтобы убедиться, что преобразование закончено.

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

 
 interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
ADCSRA|=0b01000000; 
}

main (){
//// настройка периферии
 ADCSRA|=0b01000000;
while (1){
if( adc_data>500){
//тут все что нужно делать при соблюдении условия
} 
} 

}  
Контактная информация:
Реклама
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

В винавр другой проект был, да и было это давно...
Я пробовал ждать окончания

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

while ((ADCSRA&0b00010000)==0);
но результат тот же..
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Используйте стандартную функцию CVAVR если самостоятельно не можете настроить. Вот так можно при соответствующей настройке периферии код визардом.

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

 
if (Read_adc(номер_входа)>500){
//тут что нужно;
}  
если вы это называете кодом, в котором вы пробовали ждать окончания преобразования, то тут не хватает довольно таки значимого участка кода.

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

 
 while (1)
      {     
   unsigned int aa;   
  ADCSRA |=0b01000000;
  while ((ADCSRA&0b00010000)==0);
 
// вот тут неплохо было бы добавить
//aa =ADCW; 
      
    if (aa > 500) {PORTB = 0b00000001;}  else {PORTB = 0b00000000;};
     ADCSRA|= 0b00010000;
      }
}  


PS. как правило если хотят добиться результата, делают снимок экрана и отправляют сюда. Без него происходит гадание на кофейной гуще. Может вы зря к этому регистру вообще привязались.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Доброй ночи!
Помогите пожалуйста разобраться с float.
Пишу в цвавре.
Объявил переменную "float koord = 1.0;"
Далее сделал счётчик по событию:
If (a == 1) {koord = koord + 1;}
И вывод этого всего на дисплей:
lcd_clear();
lcd_gotoxy(0,1);
sprintf(lcd_buf, "%u", koord);
lcd_puts(lcd_buf);

Пока переменная была объявлена как int, то всё работало нормально, а как только объявил её float, то на дисплее выводятся хаотичные 5-ти значные числа.
С float ранее не работал, поэтому не в курсе как правильно его использовать. Инфа в интернете очень расплывчатого и тугопонятного характера....
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

хаотичные 5-ти значные числа
Это какие ? Пример приведите.
Реклама
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

52429 39321 52428 65535 и т.д.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

"%u" - это вывод беззнакового целого числа.
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Тоесть он сам не отрежет десятичную часть получается?
Кстати пробовал и "e" ставить вместо "u" . Результат тот же...
Кстати, результат мне нужен с округлением до тысячной...
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Не понятно, почему не использовать тот параметр, который соответствует типу переменной ? Ну или тип, который соответствует параметру. К чему весь этот гемор ?
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Можно по подробнее... Если вы о "f", то я и его пробовал....
Ранее не приходилось сталкиватся с дробными числами, но вот теперь пришлось... И может не float надо использовать, а что то другое? :dont_know:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

isx писал(а):Можно по подробнее...
Подробнее и быстрее гугла никто не расскажет. Находится за 10 секунд.
http://www.cplusplus.com/reference/cstdio/printf/
isx писал(а):Если вы о "f", то я и его пробовал....:
И что, то-же цифры "прыгают" ?
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

ага..
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Сообщение blackx »

isx писал(а):ага.
Ну, вот так сделайте чтоли..

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

sprintf(lcd_buf, "%u", (unsigned int)koord);
Вообще вывод дробных чисел printf-ами... весьма затратная операция, может быть ваша реализация C Runtime Library не поддерживает %f вовсе.
Изображение only pure true norwegian blackx Изображение
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

blackx писал(а):Ну, вот так сделайте чтоли..
Это я к тому, что я так уже делал и
Аlex писал(а):то-же цифры "прыгают"
blackx писал(а):Вообще вывод дробных чисел printf-ами... весьма затратная операция, может быть ваша реализация C Runtime Library не поддерживает %f вовсе.
А как мне тогда правильно реализовать вывод. Вывод дробной части мне по сути и не нужен, главное чтоб она просто считалась. Если как то можно, то можно было бы и округлить до десятых перед выводом на дисплей...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Так считайте и храните в 100 или 1000 раз больший результат, смотря какая точность нужна. А перед выводом делить на это же число.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

А зачем тогда вообще float нужен ?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Для того, чтобы дробь считать.
Но показывать раз не требуется можно еще перед выводом преобразовывать в целое и выводить целое.
Контактная информация:
isx
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2316
Зарегистрирован: Вс июн 26, 2011 20:03:21

Сообщение isx »

Вообщем тупо приравнял я переменную float к переменной int прямо перед выводом на дисплей. Поставил при объявлении переменной суффикс f

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

 float koord = 1.0f;  // может кому пригодится пример...
и всё заработало как надо.
Теперь проблема в следующем. Была создана ещё одна переменная

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

eeprom float koord2 = 1.0f;
и при попытке приравнять её перед циклом к переменной koord она перестаёт реагировать на счётчик (всегда показывает 0).
Вот не пойму теперь, может eeprom в принципе не хранит такие данные или их надо объявлять как то иначе?
P.S. когда были целые числа, то всё работало норм.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 343
Зарегистрирован: Пн апр 01, 2013 15:13:40
Откуда: Москва

Сообщение Мikа »

Привет, коты :)
Подскажите, пожалуйста, как на Си правильно написать:
if (c!=(PINC, обрезанный по маске, например 0b00000001), не используя ещё одну переменную. Это можно сделать? :)
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Ответить

Вернуться в «Разные вопросы по МК»