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

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

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

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

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

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

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

 
Опции темы
Непрочитано 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
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(voidinterrupt 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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.RU
 
Аватар для ut1wpr
 
Регистрация: 19.08.2006
Адрес: Львов
Сообщений: 1,616
Сказал спасибо: 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, время: 16:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot