Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.09.2010, 23:50
|
|
Прохожий
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Вывод на жки результата АЦ преобразования
Контроллер - ADuC812, запускаю единичное преобразование АЦП. После окончания преобразования он генерирует прерывание. Вот тут начинается сама проблема. Результат преобразования лежит в регистрах адука ADCDATAH и ADCDATAL. АЦП 12ти битный, поэтому в регистре ADCDATAL последние 4 бита не используются. Так вот собственно вопрос, как преобразовать двоичное значение результата АЦ-преобразования в нормальный вид, и выдать это на ЖК-индикатор?
Сейчас функция обработки прерывания выглядит так:
void display_voltage(void) interrupt 6 {
unsigned char ADCH, ADCL;
unsigned char lcd_buffer[16];
ADCH = ADCDATAH;
ADCL = ADCDATAL;
sprintf (lcd_buffer,"U=%0*.%u\n", ADCH);
send_lcd(set_first_line, lcd_buffer);
}
Где собственно ошибка, понять не могу.
ЖКИ работает нормально, написал функцию send_lcd(a,b), где а-номер строки куда выводить, b-указатель на строку символов которые надо вывести.
|
|
|
Сказали "Спасибо" kushman
|
|
|
29.09.2010, 13:21
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Сообщение от kushman
|
Контроллер - ADuC812, запускаю единичное преобразование АЦП. После окончания преобразования он генерирует прерывание. Вот тут начинается сама проблема. Результат преобразования лежит в регистрах адука ADCDATAH и ADCDATAL. АЦП 12ти битный, поэтому в регистре ADCDATAL последние 4 бита не используются. Так вот собственно вопрос, как преобразовать двоичное значение результата АЦ-преобразования в нормальный вид, и выдать это на ЖК-индикатор?
Сейчас функция обработки прерывания выглядит так:
void display_voltage(void) interrupt 6 {
unsigned char ADCH, ADCL;
unsigned char lcd_buffer[16];
ADCH = ADCDATAH;
ADCL = ADCDATAL;
sprintf (lcd_buffer,"U=%0*.%u\n", ADCH);
send_lcd(set_first_line, lcd_buffer);
}
Где собственно ошибка, понять не могу.
ЖКИ работает нормально, написал функцию send_lcd(a,b), где а-номер строки куда выводить, b-указатель на строку символов которые надо вывести.
|
Основной вопрос: что значит в вашем понимании "нормальный вид".
Далее, почему вы игнорируете полное значение результата АЦП? Нормализуйте его в int.
Выдержка из ДШ в аттачметне. Следуйте ей:
int adc = adcdatal + (adcdatah & 0x04) ‹‹ 8;
Преобразовать эту величину в напряжение можно согласно того же ДШ, используя преобразование с учётом используемого опорного напряжения.
|
|
|
|
29.09.2010, 13:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Сообщение от ut1wpr
|
Выдержка из ДШ в аттачметне. Следуйте ей:
int adc = adcdatal + (adcdatah & 0x04) ‹‹ 8;
|
(adcdatah & 0x0F)
|
|
|
|
29.09.2010, 14:29
|
|
Прохожий
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
То есть преобразовать по следующей формуле? :
adc = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
ADCresult = (adc*2,5)/4096; //Uref=2.5V, n=12, 2^n=4096
А как дальше вывести это значение на дисплей?
|
|
|
Сказали "Спасибо" kushman
|
|
|
29.09.2010, 15:08
|
|
Вид на жительство
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Вначале надо назначить порт на дисплей и подключить драйвер
PHP код:
|
#include ‹delay.h›
#include ‹stdio.h› //Эту библиотеку надо подключить для нормализации результата вывода для LCD
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include ‹lcd.h›
void display_voltage(void) interrupt 6
{
unsigned int ADCvalue;
unsigned char lcd_buffer[16];
ADCvalue =ADCDATAL + (ADCDATAH & 0x0F) ‹‹8; //Сделаем INT
ADCvalue =(ADCvalue *2,5)/4096; //преобразуем в милливольты
lcd_gotoxy(0,0); //На первой строке дисплея
sprintf (lcd_buffer,"U=%0*.%dV ", ADCvalue); //Покажем U=0.xxV
lcd_puts(lcd_buffer); //Выведем на экран
}
void main(void)
{
// тут надо инициализировать все
lcd_init(16); //Укажем драйверу что дисплей 2 строки на 16 символов
#asm("sei")
while (1)
{
};
}
|
__________________
Найди путь или проложи сам!
|
|
|
Сказали "Спасибо" MasterMushi
|
|
|
29.09.2010, 16:37
|
|
Прохожий
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Дисплей у меня нормально функционирует, выводит строки, символы, с этим все в порядке.
Написал функцию как показано постом выше, в результате на дисплей выводится: U=%dV
void display_voltage(void) interrupt 6 {
unsigned char lcd_buffer[16];
unsigned int ADCValue;
ADCValue = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
ADCValue = (ADCValue*2,5)/4096;
sprintf (lcd_buffer,"U=%0*.%d V", ADCValue);
send_lcd(set_first_line, lcd_buffer); // вывести lcd_buffer в первой строке
}
Кстати тип int же будет выводить только целую часть напряжения? Десятые выводиться не будут?
Последний раз редактировалось kushman; 29.09.2010 в 16:45.
|
|
|
Сказали "Спасибо" kushman
|
|
|
29.09.2010, 17:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Сообщение от kushman
|
ADCValue = (ADCValue*2,5)/4096;
|
Вы не на Бейсике пишите. Уходите от float.
Или подключайте "math.h"
|
|
|
|
29.09.2010, 17:22
|
|
Прохожий
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Переделал вот так:
void display_voltage(void) interrupt 6 {
unsigned char lcd_buffer[16];
float ADCValue;
ADCValue = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
ADCValue = (ADCValue*2,5)/4096;
sprintf (lcd_buffer,"U=%f V", ADCValue);
send_lcd(set_first_line, lcd_buffer);
}
На дисплее одни нули. Хотя на входе АЦП напряжение есть.
|
|
|
Сказали "Спасибо" kushman
|
|
|
29.09.2010, 17:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Сообщение от kushman
|
ADCValue = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
|
Try:
Код:
|
ADCValue = (float)(ADCDATAL + (ADCDATAH & 0x0F) ‹‹8); |
|
|
|
|
29.09.2010, 17:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
|
Re: Вывод на жки результата АЦ преобразования
Сообщение от kushman
|
На дисплее одни нули. Хотя на входе АЦП напряжение есть.
|
Между подачей на вход напряжения и его отображением на дисплее - "дистанция огромного размера".
Какие приёмы отладки вам знакомы?
Может, есть смысл, пока не лезть в конец задачи, а пощупать поближе к началу?
Код:
|
char adcl = adcdatal;
char adch = adcdatah;
sprintf(lcd_buffer,"%2x %2x",adch&0x0F,adcl); |
Последний раз редактировалось ut1wpr; 29.09.2010 в 17:54.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:49.
|
|