реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> АЦП Atmega8, вывод данных, CVAVR+Proteus 7.7
-DAVID-
сообщение Apr 27 2012, 18:40
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Пользователь №: 60 585



Здравствуйте!
Помогите пожалуйста - есть проект в proteus , демонстрирующий работу АЦП Atmega 8 и там происходит вывод данных через UART . У меня простой вопрос - как вывести дробные значения в Virtual Terminal (параметр pressure)? Прошивка написана на с++ откомпилирована в CodeVisionAVR. Сам уже пробовал выводить через printf, scanf - ничего толком не получилось , может надо делать вставку на ассемблере ?...
Прикрепленное изображение


в протеусе:
Прикрепленное изображение


Так как раньше на си не программировал, буду благодарен если ещё подскажете как можно сохранить считываемые ацпухой данные в массив.

Сам проект:
Прикрепленный файл  ______WinRAR.rar ( 127.88 килобайт ) Кол-во скачиваний: 193
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 27 2012, 19:41
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(-DAVID- @ Apr 27 2012, 21:40) *
Так как раньше на си не программировал, буду благодарен если ещё подскажете как можно сохранить считываемые ацпухой данные в массив.


Как-то так:
Код
#define ADC_ARRAY_SIZE 16
unsigned short ADCSample[ADC_ARRAY_SIZE];
volatile unsigned char ADCNext;
interrupt [ADC_INT] void adc_isr(void){
ADCSample[ADCNext]=ADC;
if (++ADCNext>=ADC_ARRAY_SIZE) ADCNext=0;
}


P.S. CodeVisionAVR или WinAVR? Если CodeVisionAVR (на него похоже) то почему в этот подфорум пишете?
Go to the top of the page
 
+Quote Post
-DAVID-
сообщение Apr 28 2012, 05:19
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Пользователь №: 60 585



Спасибо Артём! я проверю Ваш код, если точнее - мне надо было сохранить параметры pressure и voltage
Цитата(_Артём_ @ Apr 27 2012, 23:41) *
P.S. CodeVisionAVR или WinAVR? Если CodeVisionAVR (на него похоже) то почему в этот подфорум пишете?


да, это CodeVisionAVR, а куда писать?
Go to the top of the page
 
+Quote Post
Виктория
сообщение Apr 30 2012, 17:01
Сообщение #4


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Цитата(-DAVID- @ Apr 27 2012, 21:40) *
Здравствуйте!
Помогите пожалуйста - есть проект в proteus , демонстрирующий работу АЦП Atmega 8 и там происходит вывод данных через UART . У меня простой вопрос - как вывести дробные значения в Virtual Terminal (параметр pressure)? Прошивка написана на с++ откомпилирована в CodeVisionAVR. Сам уже пробовал выводить через printf, scanf - ничего толком не получилось , может надо делать вставку на ассемблере ?...


Для переменных типа float в функциях printf(), sprintf() используется формат %f
Код
pressure=rezult*1.6;
printf("voltage=%6.1f mv", pressure);


Два преподовских замечания:
1) В предыдущей строке кода коряво как-то погрешности учитываете через целочисленную арифметику. Хотя может быть у Вас это какой-то фирменный трюк?
2) Навскидку вроде бы все-таки должна использоваться sprintf. Не охота тщательно изучать Ваш проект, но скорее всего вывод в VT осуществляется посредством строковых массивов.

З.Ы.: а Proteus понравился


Go to the top of the page
 
+Quote Post
Прохожий
сообщение Apr 30 2012, 17:10
Сообщение #5


Cундук
*****

Группа: Участник
Сообщений: 1 478
Регистрация: 13-11-06
Из: Ростов-на-Дону
Пользователь №: 22 269



Цитата(Виктория @ Apr 30 2012, 21:01) *
З.Ы.: а Proteus понравился

Как может понравиться Протез?
Тем более за бабло?
В натуре оно как-то быстрее и надежнее...
Go to the top of the page
 
+Quote Post
-DAVID-
сообщение May 1 2012, 20:01
Сообщение #6





Группа: Участник
Сообщений: 14
Регистрация: 1-11-10
Пользователь №: 60 585



Цитата(Виктория @ Apr 30 2012, 21:01) *
Для переменных типа float в функциях printf(), sprintf() используется формат %f
Код
pressure=rezult*1.6;
printf("voltage=%6.1f mv", pressure);


Виктория, спасибо что откликнулись, вот что получилось:

Прикрепленное изображение


Цитата
Два преподовских замечания:
1) В предыдущей строке кода коряво как-то погрешности учитываете через целочисленную арифметику. Хотя может быть у Вас это какой-то фирменный трюк?
2) Навскидку вроде бы все-таки должна использоваться sprintf. Не охота тщательно изучать Ваш проект, но скорее всего вывод в VT осуществляется посредством строковых массивов.

З.Ы.: а Proteus понравился


1)нет, не трюк) как посоветуете учитывать погрешности?
2) через sprintf - CVAVR не компилирует!!



Есть мысль считывать целочисленную и дробную части параметра pressure отдельно, (затем выводить в VT вместе с запятой или точкой) подскажете как реализовать?
Go to the top of the page
 
+Quote Post
Master of Nature
сообщение Aug 6 2012, 00:27
Сообщение #7


Мыслящий
*****

Группа: Свой
Сообщений: 1 729
Регистрация: 20-07-07
Из: Самара
Пользователь №: 29 270



CodeVision не умеет форматировать %6.1f
А также не умеет выводить лидирующие нули.
Лучше отделять целую часть от дробной и выводить по отдельности.
А формат использования команды sprintf смотрели?
sprintf(string,"ADC=%f",float);
Результат операции помещается в строку и дальше эту строку можно отправить куда угодно.


--------------------
FAQ по AD
Форум по AD
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью.
...стоит запомнить ...вернее задуматься.
Go to the top of the page
 
+Quote Post
maksimp
сообщение Aug 6 2012, 18:54
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Цитата(-DAVID- @ May 2 2012, 00:01) *
1)нет, не трюк) как посоветуете учитывать погрешности?

result = ADCW*5-ADCW/10;
эквиваленто умножению на 4.9 . Это можно сразу объединить с следующим умножением на 1.6 :
pressure = ADCW * (4.9*1.6);
Произведение 4.9*1.6 написано в скобках, поэтому порядок выполнения операций будет сначала 4.9*1.6 а затем умножить на ADCW. И тогда 4.9*1.6 компилятор вычислит на этапе компиляции.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Aug 16 2012, 07:52
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Цитата(Master of Nature @ Aug 6 2012, 03:27) *
CodeVision не умеет форматировать %6.1f
А также не умеет выводить лидирующие нули.


Не рассказывайте сказки. В CvAVR эти вещи управляются в настройках проекта. Пошарьте по меню.
Реализация этих форматов более объёмная, а требуется не всегда и не всем, они и сделали её отключаемой.

Вот Вам мой рабочий проект - http://cxem.net/izmer/izmer90.php с фотографиями. Всё прекрасно выводится.
Там и прошивка лежит с исходниками.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 14:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0236 секунд с 7
ELECTRONIX ©2004-2016