Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Вывод на жки результата АЦ преобразования

Непрочитано 28.09.2010, 23:50  
kushman
Прохожий
 
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
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-указатель на строку символов которые надо вывести.
Реклама:
kushman вне форума  
Сказали "Спасибо" kushman
warel (27.06.2019)
Непрочитано 29.09.2010, 13:21  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию 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;
Преобразовать эту величину в напряжение можно согласно того же ДШ, используя преобразование с учётом используемого опорного напряжения.
Миниатюры:
Нажмите на изображение для увеличения
Название: Снимок.PNG
Просмотров: 67
Размер:	62.3 Кб
ID:	13033  
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
Непрочитано 29.09.2010, 13:26  
kison
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Вывод на жки результата АЦ преобразования

Сообщение от ut1wpr Посмотреть сообщение
Выдержка из ДШ в аттачметне. Следуйте ей:
int adc = adcdatal + (adcdatah & 0x04) ‹‹ 8;
(adcdatah & 0x0F)
kison вне форума  
Сказали "Спасибо" kison
warel (27.06.2019)
Непрочитано 29.09.2010, 14:29  
kushman
Прохожий
 
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
kushman на пути к лучшему
По умолчанию Re: Вывод на жки результата АЦ преобразования

То есть преобразовать по следующей формуле? :

adc = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
ADCresult = (adc*2,5)/4096; //Uref=2.5V, n=12, 2^n=4096

А как дальше вывести это значение на дисплей?
kushman вне форума  
Сказали "Спасибо" kushman
warel (27.06.2019)
Непрочитано 29.09.2010, 15:08  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" MasterMushi
warel (27.06.2019)
Непрочитано 29.09.2010, 16:37  
kushman
Прохожий
 
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
kushman на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" kushman
warel (27.06.2019)
Непрочитано 29.09.2010, 17:09  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Вывод на жки результата АЦ преобразования

Сообщение от kushman Посмотреть сообщение
ADCValue = (ADCValue*2,5)/4096;
Вы не на Бейсике пишите. Уходите от float.
Или подключайте "math.h"
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
Непрочитано 29.09.2010, 17:22  
kushman
Прохожий
 
Регистрация: 15.09.2010
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 4 раз(а) в 4 сообщении(ях)
kushman на пути к лучшему
По умолчанию 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 вне форума  
Сказали "Спасибо" kushman
warel (27.06.2019)
Непрочитано 29.09.2010, 17:27  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Вывод на жки результата АЦ преобразования

Сообщение от kushman Посмотреть сообщение
ADCValue = ADCDATAL + (ADCDATAH & 0x0F) ‹‹8;
Try:
Код:
ADCValue = (float)(ADCDATAL + (ADCDATAH & 0x0F) ‹‹8);
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
Непрочитано 29.09.2010, 17:39  
ut1wpr
Почётный гражданин KAZUS.RUN
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,613
Сказал спасибо: 65
Сказали Спасибо 315 раз(а) в 264 сообщении(ях)
ut1wpr на пути к лучшему
По умолчанию Re: Вывод на жки результата АЦ преобразования

Сообщение от kushman Посмотреть сообщение
На дисплее одни нули. Хотя на входе АЦП напряжение есть.
Между подачей на вход напряжения и его отображением на дисплее - "дистанция огромного размера".
Какие приёмы отладки вам знакомы?
Может, есть смысл, пока не лезть в конец задачи, а пощупать поближе к началу?
Код:
char adcl = adcdatal;
char adch = adcdatah;
sprintf(lcd_buffer,"%2x %2x",adch&0x0F,adcl);

Последний раз редактировалось ut1wpr; 29.09.2010 в 17:54.
ut1wpr вне форума  
Сказали "Спасибо" ut1wpr
warel (27.06.2019)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Буферизация изображения при работе с ЖКИ serb-radio Микроконтроллеры, АЦП, память и т.д 2 16.09.2010 11:33
Помогите разобраться с работой ЖКИ Gonchar Микроконтроллеры, АЦП, память и т.д 8 23.04.2010 17:45
Подключение ЖКИ как внешней RAM alberio Микроконтроллеры, АЦП, память и т.д 7 20.04.2010 15:39
[Решено] Помогите определить семисегментник opylk Информация по радиокомпонентам 3 18.03.2010 19:38
Радиокалькулятор ColorAndCode 9.3 optima22 Информация по радиокомпонентам 0 10.11.2009 11:01


Часовой пояс GMT +4, время: 08:40.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.