Прошу строго не судить, только начал осваивать...
Ацп atmega8
- Сообщения: 5
- Зарегистрирован: Чт янв 28, 2016 04:55:27
Здравствуйте, подскажите, пожалуйста, как выводить данные из ADCH на wh0802? И нужно ли использовать таймер при работе ацп? Или можно задать непрерывное преобразование, и если непрерывное, то как считывать данные?
Прошу строго не судить, только начал осваивать...
Прошу строго не судить, только начал осваивать...
- Реклама
Считать регистр ADCH и согласно протоколу общения с ЖКИ вывести оные.
Таймер не обязательно.
Можно. Там взводится флаг об окончании очередного преобразования.
Таймер не обязательно.
Можно. Там взводится флаг об окончании очередного преобразования.
Docendo discimus
Таки желательно таймер использовать, и по нему забирать данные из АЦП, причём довольно редко (или редко отправлять их в индикатор), иначе цифры мельтешить будут, слишком часто меняясь. Но это уже вопрос эргономики, а не устройства софта.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Нет. Все используют флаг окончания преобразования АЦП:anslepnev писал(а):нужно ли использовать таймер при работе ацп?
while ((ADCSRA & 0x10)==0); //...1 .... ADIF - 1- флаг завершения преобразования (1-сброс при каждом Старте. 2-для прерывания очищается аппаратно)
можно... регистр ADCSRA , где:anslepnev писал(а):Или можно задать непрерывное преобразование
//1... .... ADEN - 1- вкл ADC.
//.1.. .... ADSC - 1- Старт ADC. При завершении преобразования сбрасывается аппаратно.
//..1. .... ADFR - 1- режим Непрерывного Преобразования.
//...1 .... ADIF - 1- флаг завершения преобразования
-сброс при каждом Старте.
-для прерывания очищается аппаратно
//.... 1... ADIE - 1- Разрешение прерывания
//.... .1.. ADPS2 - предделетель 0 -
//.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты.
//.... ...1 ADPS0 - предделетель 0 -
но зачем непрерывное преобразование?
читаем ADCH после окончания преобразования (когда установится флаг окончания преобразования). //...1 .... ADIF - 1- флаг завершения преобразованияanslepnev писал(а): как считывать данные?
- Сообщения: 5
- Зарегистрирован: Чт янв 28, 2016 04:55:27
спасибо за ответы. Насколько я понял из даташита, преобразованное значение хранится в ADCH:ADCL и битом ADLAR выставляем выравнивание, если мы берем, например, переменную v (напряжение) и записываем, что v=ADCH, предварительно выставив бит ADLAR, то ничего не работает...подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?
- Реклама
В АЦП mega8 два регистра настройки: ADMUX и ADCSRA.anslepnev писал(а):подскажите, пожалуйста, как правильно выводить (считывать) преобразованное значение?
Значение АЦП хранится в ADCH (00000011):ADCL(11111111) или ADCW(00000011 11111111).
Подробней:
------------------------------------------------------------------------------------------------------------------------------------
Регистр ADMUX (00000000), где:
//1... .... REFS1 - опорное напряжение
//.1.. .... REFS0 - опорное напряжение
//..1. .... ADLAR - Выравнивание результата
//...1 .... -
//.... 1... MUX3 - номер канала
//.... .1.. MUX2 - номер канала
//.... ..1. MUX1 - номер канала
//.... ...1 MUX0 - номер канала
------------------------------------------------------- подробней:
//REFS1=0 REFS0=0 - ИОН=AREF
//REFS1=0 REFS0=1 - ИОН=AVCC
//REFS1=1 REFS0=0 - не используется (зарезервировано)
//REFS1=1 REFS0=1 - ИОН=2.56V (встроенный ИОН 2.56V)
//ADLAR=1
// Выравнивание результата в левую сторону < (8-бит):
// ADCH // 1111 1111 - читать первым ????????????????????????????????????????
// ADCL // 0000 0000 - читать первым ????????????????????????????????????? ... Надо уточнить по даташиту... не помню))
//ADLAR=0
// Выравнивание результата в правую сторону > (10-бит):
// ADCH // 0000 0011 - читать вторым
// ADCL // 1111 1111 - читать первым !!!
---------------
// MUX3...MUX0 - номер канала:
// 0000 - ADC0
// 0001 - ADC1
// .................
// 0111 - ADC7
-----------------------------------------------------------------------------------------------------------------------------------------
Регистр ADCSRA (00000000), где:
//1... .... ADEN - 1- вкл ADC.
//.1.. .... ADSC - 1- Старт. При завершении преобразования сбрасывается аппаратно.
//..1. .... ADFR - 1- режим Непрерывного Преобразования.
//...1 .... ADIF - 1- флаг завершения преобразования
-сброс программно.
-для прерывания очищается аппаратно
//.... 1... ADIE - 1- Разрешение прерывания
//.... .1.. ADPS2 - предделетель 0 -
//.... ..1. ADPS1 - предделетель 0 - =1/2 тактовой частоты.
//.... ...1 ADPS0 - предделетель 0 -
------------------------------------------------------- подробней:
предделитель ADC:
ADPS2 -ADPS1 -ADPS0
// 000: 1 МГц/2=500.000 Hz
// 001: 1 МГц/2=500.000 Hz
// 010: 1 МГц/4=200.000 Hz
// 011: 1 МГц/8=125.000 Hz
// 100: 1 МГц/16=62.500 Hz
// 101: 1 МГц/32=31.250 Hz
// 110: 1 МГц/64=15.625 Hz
// 111: 1 МГц/128=7.812,5 Hz
------------------------------------------------------------------------------------------------------------------------------------------------
Чтобы не забивать себе мозги с ADCH:ADCL, делаем по другому:
Берем, например, переменную v (Int (00000000 00000000)) (напряжение) и записываем v=ADCW; (00000011 11111111).
------------------------------------------------------------------------------------------------------------------------------------------------
Рабочий пример (вариант 1):
int v;
ADMUX=0b01000101; // канал 5
delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования
ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования
v=ADCW; // (напряжение) (00000011 11111111).
--------------------------------------------------------------------------------------------------------------------------------------------------
Рабочий пример (вариант 2):
int v;
ADMUX=0b01000101; // канал 5
delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while (ADCSRA & 0b01000000); // ADSC - При завершении преобразования этот бит сбрасывается аппаратно.
v=ADCW; // (напряжение) (00000011 11111111).
----------------------------------------------------------------------------------------------------------------------------------------------------
P.S. Даже если мне достаточно точности измерения АЦП 8-бит, я настраиваю АЦП в режим 10-бит (ADLAR=0, Выравнивание результата в правую сторону). Зачем? Чтобы убрать шум на входе АЦП и шум самого АЦП.
- Сообщения: 5
- Зарегистрирован: Чт янв 28, 2016 04:55:27
float v;
InitLcd();
ADMUX=0b01000101; // канал 5
_delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования
ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования
v=ADCW*0.00489; // (напряжение) (00000011 11111111).
char buffer [10];
//InitADC();
sprintf(buffer, "U=%.1f", v);
LcdWriteCom(0b00000001);
_delay_ms(10);
Send_Str(buffer,10); // Отправляем строку
_delay_ms(100); //Пауза
ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование
while(1);
{
}
Подскажите, пожалуйста, где ошибка в программе, просто текст у меня выводится на wh0802, а вот с выводомданных из ацп проблемы..вместо данных мигающий курсор...
InitLcd();
ADMUX=0b01000101; // канал 5
_delay_us(10); // стабилизация входа...
ADCSRA|=0b01000000; // Старт преобразования.
while ((ADCSRA & 0x10)==0); // ждём ADIF - флаг завершении преобразования
ADCSRA|=0x10; // сброс ADIF - флаг завершении преобразования
v=ADCW*0.00489; // (напряжение) (00000011 11111111).
char buffer [10];
//InitADC();
sprintf(buffer, "U=%.1f", v);
LcdWriteCom(0b00000001);
_delay_ms(10);
Send_Str(buffer,10); // Отправляем строку
_delay_ms(100); //Пауза
ADCSRA |=(1<<ADSC); //Запускаем следующее преобразование
while(1);
{
}
Подскажите, пожалуйста, где ошибка в программе, просто текст у меня выводится на wh0802, а вот с выводомданных из ацп проблемы..вместо данных мигающий курсор...
А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))
- Сообщения: 5
- Зарегистрирован: Чт янв 28, 2016 04:55:27
у меня на макетке собрано, на дисплее просто мигающий курсор, а не значения АЦП...roman.com писал(а):А что если закинуть всё в протеус и глянуть что происходит... подродно.. пошагово)) Или спаять на макетке и всё внимательно посмотреть? ))
Выведите туда для начала любое число вместо отсчёта АЦП, хотя бы 123, и посмотрите, вывелось ли оно. Очень вероятно, что не работает вывод в 44780 и АЦП тут вовсе не при делах.
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
- Сообщения: 5
- Зарегистрирован: Чт янв 28, 2016 04:55:27
Число выводится на дисплей, текст выводится, в общем статическая индикация работает, где то ошибка в программе, а вот где- никак не пойму
Наблюдаю взаимоисключающие параграфы.
С одной стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100149#p3100149"]на дисплее просто мигающий курсор, а не значения АЦП...[/uquote]С другой стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100935#p3100935"]Число выводится на дисплей, текст выводится, в общем статическая индикация работает[/uquote]Так есть индикация или нет её?
С одной стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100149#p3100149"]на дисплее просто мигающий курсор, а не значения АЦП...[/uquote]С другой стороны:
[uquote="anslepnev",url="/forum/viewtopic.php?p=3100935#p3100935"]Число выводится на дисплей, текст выводится, в общем статическая индикация работает[/uquote]Так есть индикация или нет её?
И хрюкотали зелюки,
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
Как мюмзики в мове.
На каждый РКН
Найдётся VPN.
а почему преобразование написано до цикла, а не внутри? так оно всего 1 раз выполнится.
для поиска неисправности постепенно продвигайся от экрана к ацп (сначала в v какое нибудь число впиши, потом int переменную вместо ADCW подставь...)
Добавлено after 12 minutes 9 seconds:
я полагаю, это ардуино, а в ней функция sprintf не поддерживает формат чисел с плавающей запятой.
Добавлено after 6 minutes:
[uquote="Другой сайт по ардуинам ",url="http://mypractic.ru/urok-30-tekstovye-stroki-v-arduino-konvertirovanie-dannyx-v-stroki-i-naoborot-klass-string.html"]Самый простой способ преобразования float в текстовую строку – использование функции dtostrf.
char* dtostrf(double data, signed char width, unsigned char prec, char *string)
data – это конвертируемая переменная;
width – число значащих разрядов;
prec – число разрядов после запятой;
char* string – указатель на строку (имя массива).[/uquote]
для поиска неисправности постепенно продвигайся от экрана к ацп (сначала в v какое нибудь число впиши, потом int переменную вместо ADCW подставь...)
Добавлено after 12 minutes 9 seconds:
я полагаю, это ардуино, а в ней функция sprintf не поддерживает формат чисел с плавающей запятой.
Добавлено after 6 minutes:
[uquote="Другой сайт по ардуинам ",url="http://mypractic.ru/urok-30-tekstovye-stroki-v-arduino-konvertirovanie-dannyx-v-stroki-i-naoborot-klass-string.html"]Самый простой способ преобразования float в текстовую строку – использование функции dtostrf.
char* dtostrf(double data, signed char width, unsigned char prec, char *string)
data – это конвертируемая переменная;
width – число значащих разрядов;
prec – число разрядов после запятой;
char* string – указатель на строку (имя массива).[/uquote]
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


