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

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

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

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

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

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

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

 
Опции темы
Непрочитано 03.04.2010, 01:28  
jafarkiller
Частый гость
 
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
jafarkiller на пути к лучшему
По умолчанию Как вывести данные из АЦП на индикатор

Доброго времени суток всем! Прошу сильно не пинать, если эта тема уже рассматривалась, я не нашел для себя ничего. Я новичёк в программировании. В общем, задача такая. Есть ATmega8. В нём 10-ти разрядный АЦП. Измеряем напряжение. Как полученные 10 бит преобразовать и вывести на ЖКИ типа 1602 (2строки по 16 символов). С самим индикаторм я работать умею. Мне нужен алгоритм преобразования, но только на ассемлере, языка С я не знаю. Готовых вольтметров, конечно, полно, но нужен сам принцип. Заранее спасибо всем, кто откликнется!
Реклама:
jafarkiller вне форума  
Непрочитано 03.04.2010, 03:09  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Выводить просто на ЖК можно на Си с помощью встроенных в компилятор CVAVR библиотек.

Выучить базу на си проще чем писать на асме для простой какойто задачи весь код.


Далее текст для тех кто мучается с проблемой вывода на 7ми сегментник
(Компилятор CVAVR)

PHP код:


// Приготовления

#define MINUSSIGN 1

int DigitCount=4// 

unsigned long int displaydata=присваеваем тут гдето из данных АЦП//Данные для вывода
char Display_Buffer[DigitCount]; //Дисплей буфера для вывода
CharacterMap[]= { /*сюда построчно пишем коды символов которые хотим выводить можно 
по порядку соответствовать к примеру индекс ноль соответствует символу ноль. пример символов после кода */
};

unsigned long int numlastnum//Переменные для деления данных
//---------------------------------------------------------------


//Код автоматически подстраивается под пределы измерений и отсекает 
//слишком высокие данные

//Вывод идет Справа на лево
//Младший бит буфера правее
num displaydata;
if ((
displaydata › 0)&&(displaydata ‹ 1000000)) 
  { 
//Если значение в пределе допустимого то выводим в буфер
    
while (num0)   
     { 
//Обязательно крутим пока строго больше нуля
      
while (num10000
        {
    
// если выходим за разрядность но все еще в пределах вычислений то 
   //делим на 10 пока не достигнем отображаемой разрядности 
   //максимальной в  (9999 для 4хсегментного индикатора) 
         
num=num/10;
        }
      
DigitCount--; //Смещаем разряд
      
lastnum num 10//Берем остаток от очередног деления на 10
      
num = (num lastnum) / 10//Смещаем на десятичный разряд вправо все наше число
      
Display_Buffer[DigitCount]=CharacterMap[lastnum]; //Пишем в буфер символ соответствующий коду
    

  }   
else if (
displaydata › 1000000)
   { 
//Показываем минусы во всех разрядах если перебор по счету или выводимым пределам
     
Display_Buffer[0]=MINUSSIGN;   
     
Display_Buffer[1]=MINUSSIGN;
     
Display_Buffer[2]=MINUSSIGN;
     
Display_Buffer[3]=MINUSSIGN;
   } 



Код:
Характеристика выводов МК при выдаче на 7сегментник:
7Seg       b    f    a   e   d   .    c   g
PORTx      7    6    5   4   3   2    1   0


Симв	BIN     	HEX
0	11111010	0xFA
1	10000010	0x82
2	10111001	0xB9
3	10101011	0xAB
4	11000011	0xC3
5	01101011	0x6B
6	01111011	0x7B
7	10100010	0xA2
8	11111011	0xFB
9	11101011	0xEB
A	11110011	0xF3
b	01011011	0x5B
C	01111000	0x78
d	10011011	0x9B
E	01111001	0x79
F	01110001	0x71
G	01111010	0x7A
h	01010011	0x53
I	01010000	0x50
L	01011000	0x58
n	00010011	0x13
q	11100011	0xE3
r	00010001	0x11
o	00011011	0x1B
P	11110001	0xF1
t	01011011	0x5B
U	11011010	0xDA
У	11001011	0xCB
-	00000001	0x01
с	00011001	0x19
u	00011010	0x1A
¬	10100000	0xA0
_	00001000	0x08
]	10101010	0xAA
¯	00100000	0x20
º	11100001	0xE1
ǁ	11010010	0xD2
ʴ	00001010	0x0A
ʳ	01100000	0x60

Последний раз редактировалось MasterMushi; 03.04.2010 в 03:55.
MasterMushi вне форума  
Непрочитано 03.04.2010, 07:01  
domowoj
Почётный гражданин KAZUS.RU
 
Аватар для domowoj
 
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
domowoj на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Сообщение от lvadia Посмотреть сообщение
Если измеренное значение, больше 1000 - прибавляем 1 к переменной "тысяча"...и отнимаем от результата измерения 1000....дальше то же самое с сотнями и десятками...
999 › 100 прибавляем единицу к переменной "сотни" ("сотни" ="сотни"+1) и вычитаем 999-100= 899...
899 › 100 и т.д... надеюсь понятно
в конце концов, получаем 4 переменных...их и выводим на индикатор)
Правда сначала нужно ваш результат привести в соответствие
измеряемому напряжению.
Например при опорном 2,56В, лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4.
И потом уже преобразование в двоично-десятичный код для дальнейшего вывода на индикатор. Получите 4х разрядное двоично-дес. число,
младший разряд - выкинуть.
__________________
И на камнях растут деревья!

Последний раз редактировалось domowoj; 03.04.2010 в 12:08.
domowoj вне форума  
Непрочитано 03.04.2010, 12:12  
Victor_72
Частый гость
 
Регистрация: 17.11.2009
Сообщений: 31
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
Victor_72 на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

1. Преобразовать двоичное значение в десятичное (FF -›255)
2. Разложить 256 на 2, 5, 5 (например в регистр Р1 = 2, Р2 = 5, Р3=5)
3. Вывести значения вподряд на индикатор (с адреса который необходим, цифры лягут вподряд если настроить соответствующим образом индикатор) в виде: цифровое значение + С0F...

Алгоритм по п1:
- отнимаете от значения 100, до переполнения - результат сотни
- отнимаете от остатка 10, до переполнения - результат десятки
- остаток единицы.

Последний раз редактировалось Victor_72; 03.04.2010 в 12:17.
Victor_72 вне форума  
Непрочитано 03.04.2010, 13:29  
jafarkiller
Частый гость
 
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
jafarkiller на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Спасибо всем, идея вроде бы понятна. Только вот это непонятно:
"Например при опорном 2,56В, лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4."

Вот что написано в дш на ATmega8:
Результат А/Ц преобразования:
ADC= Vin*1024/Vref
где Vin-входное напряжение
Vref-опорное напряжение
отсюда должно быть так:
Vin=ADC*Vref/1024
вроде бы?
У меня опорное напряжение 5В.
Таким образом Vin=ADC*5/1024
получаем значение напряжения Vin в двоичном коде,
затем
"Алгоритм по п1:
- отнимаете от значения 100, до переполнения - результат сотни
- отнимаете от остатка 10, до переполнения - результат десятки
- остаток единицы."
Правильно?
jafarkiller вне форума  
Непрочитано 03.04.2010, 14:55  
domowoj
Почётный гражданин KAZUS.RU
 
Аватар для domowoj
 
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
domowoj на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Сообщение от jafarkiller Посмотреть сообщение
Только вот это непонятно:
Допустим при опорном 5В и входном 5В ADC=1024
и какое число вы будете выводить на индикатор???
Вам нужно вывести 500, а у вас 1024.
Можно конечно опорное сделать 5.12В(2,56х2).
Тогда 5,12В входного соответствует код 1024,
поделив который на 2 получим 512, т.е. то число , кот. можно вывести на инд.
преобразовав конечно в дв.-десятичный код.
Почему умножить на 10.
Чтобы не потерять точности при делении(единичка младшего разряда результата может теряться)
__________________
И на камнях растут деревья!
domowoj вне форума  
Сказали "Спасибо" domowoj
jafarkiller (03.04.2010)
Непрочитано 03.04.2010, 18:43  
Victor_72
Частый гость
 
Регистрация: 17.11.2009
Сообщений: 31
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
Victor_72 на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Можно в цифровом виде привести - поделить на 2 (при опорном=Uпит = 5,12V)
А я делил входным R-R делителем, два резистора по 10К - на измерение от средней точки... и диапазон получается 0-10V, и с преобразованием не надо париться... нужно только запятую в нужном сегменте не забыть включить....
А если делитель поставить R-9R то и 0-100V, у меня например реализовано R-99R т.е. до 1000V...

Последний раз редактировалось Victor_72; 03.04.2010 в 18:46.
Victor_72 вне форума  
Сказали "Спасибо" Victor_72
jafarkiller (03.04.2010)
Непрочитано 03.04.2010, 20:19  
jafarkiller
Частый гость
 
Регистрация: 21.03.2008
Сообщений: 43
Сказал спасибо: 25
Сказали Спасибо 1 раз в 1 сообщении
jafarkiller на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Всем спасибо, врубился
jafarkiller вне форума  
Непрочитано 03.04.2010, 22:18  
domowoj
Почётный гражданин KAZUS.RU
 
Аватар для domowoj
 
Регистрация: 09.12.2007
Адрес: Новосибирск
Сообщений: 1,021
Сказал спасибо: 10
Сказали Спасибо 70 раз(а) в 63 сообщении(ях)
domowoj на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

И еще.
Опорное 5.12В может быть при условии питания МК напряжением,
большим или равным опорному.
__________________
И на камнях растут деревья!
domowoj вне форума  
Непрочитано 05.04.2010, 06:14  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Как вывести данные из АЦП на индикатор

Сообщение от domowoj Посмотреть сообщение
лучше его сделать внешним и подстраиваемым в небольших пределах,
результат умножте на 10, а затем поделите на 4.
Делаю по другому.
Умножаю на коефициент 1-65535. Коефициент получатся при калибровке. и делю на 1024 (сдвиг на 10 разрядов)

Допустим. Имеем пиание 4,95V. Подаём ровно 1В на вход и зпускаем режим калибровки.
АЦП = 1000/(4950/1024) = 1000 / 4.834 = 206.8

коефициент равен К = 1V*1000(кратно 1mV)*1024 / 206 = 4970

коефициент равен К = 1V*100(кратно 10mV)*1024 / 206 = 497

коефициент равен К = 1V*10(кратно 0.1V)*1024 / 206 = 49

А теперь при измерении:
АЦП = 155 * 4970 / 1024 = 0.752 V
АЦП = 155 * 497 / 1024 = 0.75 V
АЦП = 155 * 49 / 1024 = 0.7 V

АЦП = 391 * 4970 / 1024 = 1.898 V
АЦП = 391 * 497 / 1024 = 1.89 V
АЦП = 391 * 49 / 1024 = 1.8 V
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов
picavr вне форума  
Сказали "Спасибо" picavr
jafarkiller (07.04.2010)
 

Закладки
Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в CVAVR вывести 3х-значное число на порты? code-by Микроконтроллеры, АЦП, память и т.д 26 23.03.2010 23:23
[Решено] Как внедрялась АСУ chermnv Отвлекитесь, эмбеддеры! 743 14.02.2010 23:11
[Решено] Третье Послание Человечеству lelkanet Отвлекитесь, эмбеддеры! 201 06.01.2010 00:33
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


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


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