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

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

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

Сообщение ibiza11 »

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

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

Сообщение 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

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

Сообщение isx »

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

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

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

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

Сообщение 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

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

Сообщение 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 ранее не работал, поэтому не в курсе как правильно его использовать. Инфа в интернете очень расплывчатого и тугопонятного характера....
Реклама
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

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

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

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

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

Сообщение isx »

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

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

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

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

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

Сообщение isx »

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

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

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

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

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

Сообщение isx »

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

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

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

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

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

Сообщение isx »

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

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

Сообщение 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

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

Сообщение isx »

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

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

Сообщение vitalik_1984 »

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

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

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

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

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

Сообщение vitalik_1984 »

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

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

Сообщение isx »

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

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

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

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

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

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

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

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

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