Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: АЦП Atmega8, вывод данных
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
-DAVID-
Здравствуйте!
Помогите пожалуйста - есть проект в proteus , демонстрирующий работу АЦП Atmega 8 и там происходит вывод данных через UART . У меня простой вопрос - как вывести дробные значения в Virtual Terminal (параметр pressure)? Прошивка написана на с++ откомпилирована в CodeVisionAVR. Сам уже пробовал выводить через printf, scanf - ничего толком не получилось , может надо делать вставку на ассемблере ?...
Нажмите для просмотра прикрепленного файла

в протеусе:
Нажмите для просмотра прикрепленного файла

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

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


да, это CodeVisionAVR, а куда писать?
Виктория
Цитата(-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 понравился


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

Как может понравиться Протез?
Тем более за бабло?
В натуре оно как-то быстрее и надежнее...
-DAVID-
Цитата(Виктория @ 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 вместе с запятой или точкой) подскажете как реализовать?
Master of Nature
CodeVision не умеет форматировать %6.1f
А также не умеет выводить лидирующие нули.
Лучше отделять целую часть от дробной и выводить по отдельности.
А формат использования команды sprintf смотрели?
sprintf(string,"ADC=%f",float);
Результат операции помещается в строку и дальше эту строку можно отправить куда угодно.
maksimp
Цитата(-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 компилятор вычислит на этапе компиляции.
hd44780
Цитата(Master of Nature @ Aug 6 2012, 03:27) *
CodeVision не умеет форматировать %6.1f
А также не умеет выводить лидирующие нули.


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

Вот Вам мой рабочий проект - http://cxem.net/izmer/izmer90.php с фотографиями. Всё прекрасно выводится.
Там и прошивка лежит с исходниками.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.