Вопросы по С/С++ (СИ)
возможно, что предупреждение выдается из-за того, что ADCSRA является volatile переменной и изменение одного бита делается путем чтение-модификация-запись, в течение которого может измениться значение других битов. скомпилируйте и укажите на hex, может изменится поведение?
Ставим плюсы: )
- Реклама
Блин че за проблема вообще я не понял? Раньше в винавр если был проект почему нельзя тупо перенести? это ведь не наоборот.
Еще замечание, если используете вызов преобразования Ацп, то нужно здесь же ждать пока оно закончится, иначе будет ошибка, того, что результат еще не готов, а уже запускается новое преобразование.
Ошибка в протеусе будет звучать как невозможно записать в регистр, так как он занят.
Либо используйте прерывание, либо тупой цикл, чтобы убедиться, что преобразование закончено.
Еще замечание, если используете вызов преобразования Ацп, то нужно здесь же ждать пока оно закончится, иначе будет ошибка, того, что результат еще не готов, а уже запускается новое преобразование.
Ошибка в протеусе будет звучать как невозможно записать в регистр, так как он занят.
Либо используйте прерывание, либо тупой цикл, чтобы убедиться, что преобразование закончено.
Код: Выделить всё
interrupt [ADC_INT] void adc_isr(void)
{
adc_data=ADCW;
ADCSRA|=0b01000000;
}
main (){
//// настройка периферии
ADCSRA|=0b01000000;
while (1){
if( adc_data>500){
//тут все что нужно делать при соблюдении условия
}
}
} - Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
В винавр другой проект был, да и было это давно...
Я пробовал ждать окончания
но результат тот же..
Я пробовал ждать окончания
Код: Выделить всё
while ((ADCSRA&0b00010000)==0);Используйте стандартную функцию 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. как правило если хотят добиться результата, делают снимок экрана и отправляют сюда. Без него происходит гадание на кофейной гуще. Может вы зря к этому регистру вообще привязались.
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Доброй ночи!
Помогите пожалуйста разобраться с 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 ранее не работал, поэтому не в курсе как правильно его использовать. Инфа в интернете очень расплывчатого и тугопонятного характера....
- Реклама
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Тоесть он сам не отрежет десятичную часть получается?
Кстати пробовал и "e" ставить вместо "u" . Результат тот же...
Кстати, результат мне нужен с округлением до тысячной...
Кстати пробовал и "e" ставить вместо "u" . Результат тот же...
Кстати, результат мне нужен с округлением до тысячной...
Не понятно, почему не использовать тот параметр, который соответствует типу переменной ? Ну или тип, который соответствует параметру. К чему весь этот гемор ?
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Можно по подробнее... Если вы о "f", то я и его пробовал....
Ранее не приходилось сталкиватся с дробными числами, но вот теперь пришлось... И может не float надо использовать, а что то другое?
Ранее не приходилось сталкиватся с дробными числами, но вот теперь пришлось... И может не float надо использовать, а что то другое?
Подробнее и быстрее гугла никто не расскажет. Находится за 10 секунд.isx писал(а):Можно по подробнее...
http://www.cplusplus.com/reference/cstdio/printf/
И что, то-же цифры "прыгают" ?isx писал(а):Если вы о "f", то я и его пробовал....:
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Ну, вот так сделайте чтоли..isx писал(а):ага.
Код: Выделить всё
sprintf(lcd_buf, "%u", (unsigned int)koord);
only pure true norwegian blackx 
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Это я к тому, что я так уже делал иblackx писал(а):Ну, вот так сделайте чтоли..
Аlex писал(а):то-же цифры "прыгают"
А как мне тогда правильно реализовать вывод. Вывод дробной части мне по сути и не нужен, главное чтоб она просто считалась. Если как то можно, то можно было бы и округлить до десятых перед выводом на дисплей...blackx писал(а):Вообще вывод дробных чисел printf-ами... весьма затратная операция, может быть ваша реализация C Runtime Library не поддерживает %f вовсе.
Так считайте и храните в 100 или 1000 раз больший результат, смотря какая точность нужна. А перед выводом делить на это же число.
Для того, чтобы дробь считать.
Но показывать раз не требуется можно еще перед выводом преобразовывать в целое и выводить целое.
Но показывать раз не требуется можно еще перед выводом преобразовывать в целое и выводить целое.
- Сообщения: 2316
- Зарегистрирован: Вс июн 26, 2011 20:03:21
Вообщем тупо приравнял я переменную float к переменной int прямо перед выводом на дисплей. Поставил при объявлении переменной суффикс f и всё заработало как надо.
Теперь проблема в следующем. Была создана ещё одна переменная
и при попытке приравнять её перед циклом к переменной koord она перестаёт реагировать на счётчик (всегда показывает 0).
Вот не пойму теперь, может eeprom в принципе не хранит такие данные или их надо объявлять как то иначе?
P.S. когда были целые числа, то всё работало норм.
Код: Выделить всё
float koord = 1.0f; // может кому пригодится пример...Теперь проблема в следующем. Была создана ещё одна переменная
Код: Выделить всё
eeprom float koord2 = 1.0f;Вот не пойму теперь, может eeprom в принципе не хранит такие данные или их надо объявлять как то иначе?
P.S. когда были целые числа, то всё работало норм.
Привет, коты 
Подскажите, пожалуйста, как на Си правильно написать:
if (c!=(PINC, обрезанный по маске, например 0b00000001), не используя ещё одну переменную. Это можно сделать?
Подскажите, пожалуйста, как на Си правильно написать:
if (c!=(PINC, обрезанный по маске, например 0b00000001), не используя ещё одну переменную. Это можно сделать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.


