Вопросы по С/С++ (СИ)
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
возможно, что предупреждение выдается из-за того, что ADCSRA является volatile переменной и изменение одного бита делается путем чтение-модификация-запись, в течение которого может измениться значение других битов. скомпилируйте и укажите на hex, может изменится поведение?
Ставим плюсы: )
- Реклама
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Блин че за проблема вообще я не понял? Раньше в винавр если был проект почему нельзя тупо перенести? это ведь не наоборот.
Еще замечание, если используете вызов преобразования Ацп, то нужно здесь же ждать пока оно закончится, иначе будет ошибка, того, что результат еще не готов, а уже запускается новое преобразование.
Ошибка в протеусе будет звучать как невозможно записать в регистр, так как он занят.
Либо используйте прерывание, либо тупой цикл, чтобы убедиться, что преобразование закончено.
Еще замечание, если используете вызов преобразования Ацп, то нужно здесь же ждать пока оно закончится, иначе будет ошибка, того, что результат еще не готов, а уже запускается новое преобразование.
Ошибка в протеусе будет звучать как невозможно записать в регистр, так как он занят.
Либо используйте прерывание, либо тупой цикл, чтобы убедиться, что преобразование закончено.
Код: Выделить всё
interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
ADCSRA|=0b01000000;
}
main (){
//// настройка периферии
ADCSRA|=0b01000000;
while (1){
if( adc_data>500){
//тут все что нужно делать при соблюдении условия
}
}
} Re: Вопросы по С/С++ (СИ)
В винавр другой проект был, да и было это давно...
Я пробовал ждать окончания
но результат тот же..
Я пробовал ждать окончания
Код: Выделить всё
while ((ADCSRA&0b00010000)==0);- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Используйте стандартную функцию CVAVR если самостоятельно не можете настроить. Вот так можно при соответствующей настройке периферии код визардом.
если вы это называете кодом, в котором вы пробовали ждать окончания преобразования, то тут не хватает довольно таки значимого участка кода.
PS. как правило если хотят добиться результата, делают снимок экрана и отправляют сюда. Без него происходит гадание на кофейной гуще. Может вы зря к этому регистру вообще привязались.
Код: Выделить всё
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. как правило если хотят добиться результата, делают снимок экрана и отправляют сюда. Без него происходит гадание на кофейной гуще. Может вы зря к этому регистру вообще привязались.
Re: Вопросы по С/С++ (СИ)
Доброй ночи!
Помогите пожалуйста разобраться с 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 ранее не работал, поэтому не в курсе как правильно его использовать. Инфа в интернете очень расплывчатого и тугопонятного характера....
Помогите пожалуйста разобраться с 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: Вопросы по С/С++ (СИ)
Это какие ? Пример приведите.хаотичные 5-ти значные числа
Re: Вопросы по С/С++ (СИ)
52429 39321 52428 65535 и т.д.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
"%u" - это вывод беззнакового целого числа.
Re: Вопросы по С/С++ (СИ)
Тоесть он сам не отрежет десятичную часть получается?
Кстати пробовал и "e" ставить вместо "u" . Результат тот же...
Кстати, результат мне нужен с округлением до тысячной...
Кстати пробовал и "e" ставить вместо "u" . Результат тот же...
Кстати, результат мне нужен с округлением до тысячной...
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Не понятно, почему не использовать тот параметр, который соответствует типу переменной ? Ну или тип, который соответствует параметру. К чему весь этот гемор ?
Re: Вопросы по С/С++ (СИ)
Можно по подробнее... Если вы о "f", то я и его пробовал....
Ранее не приходилось сталкиватся с дробными числами, но вот теперь пришлось... И может не float надо использовать, а что то другое?
Ранее не приходилось сталкиватся с дробными числами, но вот теперь пришлось... И может не float надо использовать, а что то другое?
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Подробнее и быстрее гугла никто не расскажет. Находится за 10 секунд.isx писал(а):Можно по подробнее...
http://www.cplusplus.com/reference/cstdio/printf/
И что, то-же цифры "прыгают" ?isx писал(а):Если вы о "f", то я и его пробовал....:
- blackx
- Говорящий с текстолитом
- Сообщения: 1518
- Зарегистрирован: Пт дек 28, 2012 21:56:46
- Откуда: St. Petersburg
Re: Вопросы по С/С++ (СИ)
Ну, вот так сделайте чтоли..isx писал(а):ага.
Код: Выделить всё
sprintf(lcd_buf, "%u", (unsigned int)koord);
only pure true norwegian blackx 
Re: Вопросы по С/С++ (СИ)
Это я к тому, что я так уже делал иblackx писал(а):Ну, вот так сделайте чтоли..
Аlex писал(а):то-же цифры "прыгают"
А как мне тогда правильно реализовать вывод. Вывод дробной части мне по сути и не нужен, главное чтоб она просто считалась. Если как то можно, то можно было бы и округлить до десятых перед выводом на дисплей...blackx писал(а):Вообще вывод дробных чисел printf-ами... весьма затратная операция, может быть ваша реализация C Runtime Library не поддерживает %f вовсе.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Так считайте и храните в 100 или 1000 раз больший результат, смотря какая точность нужна. А перед выводом делить на это же число.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
А зачем тогда вообще float нужен ?
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Для того, чтобы дробь считать.
Но показывать раз не требуется можно еще перед выводом преобразовывать в целое и выводить целое.
Но показывать раз не требуется можно еще перед выводом преобразовывать в целое и выводить целое.
Re: Вопросы по С/С++ (СИ)
Вообщем тупо приравнял я переменную float к переменной int прямо перед выводом на дисплей. Поставил при объявлении переменной суффикс f и всё заработало как надо.
Теперь проблема в следующем. Была создана ещё одна переменная
и при попытке приравнять её перед циклом к переменной koord она перестаёт реагировать на счётчик (всегда показывает 0).
Вот не пойму теперь, может eeprom в принципе не хранит такие данные или их надо объявлять как то иначе?
P.S. когда были целые числа, то всё работало норм.
Код: Выделить всё
float koord = 1.0f; // может кому пригодится пример...Теперь проблема в следующем. Была создана ещё одна переменная
Код: Выделить всё
eeprom float koord2 = 1.0f;Вот не пойму теперь, может eeprom в принципе не хранит такие данные или их надо объявлять как то иначе?
P.S. когда были целые числа, то всё работало норм.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Привет, коты 
Подскажите, пожалуйста, как на Си правильно написать:
if (c!=(PINC, обрезанный по маске, например 0b00000001), не используя ещё одну переменную. Это можно сделать?
Подскажите, пожалуйста, как на Си правильно написать:
if (c!=(PINC, обрезанный по маске, например 0b00000001), не используя ещё одну переменную. Это можно сделать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.


