Отговори на тема  [ 8 мнения ] 
USART и ADC едновременно на AVR 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Мар 14, 2006 12:01 am
Мнения: 6
Местоположение: Пловдив
Мнение USART и ADC едновременно на AVR
Здравейте,

Трябва да измервам 3 аналогови сигнала с честота 8000Hz и едновременно да предавам стойностите им (достатъчни са дискретите) като ASCII символи по RS232 средноаритметичната стойност от 8 измервания на всяка 1 ms. Проблемът ми е че цялото предване на данните отнема повече от 1 ms (38400bps, при по-висока не иска да се синхронизира хубаво). Ако спра измерването докато се предава изпускам един период на дискретизация, а иначе променливите ми се променят без да са изпратени старите данни. Въпроса ми е леко принципен как е най-добре да стане ? Използвам ATmega8 на 8Mhz вътрешен осцилатор. Реших да пробвам CodeVision за проекта (ако има значение).


Вто Май 09, 2006 9:22 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
Хм, при 38400 предаването на 1 байт отнема 0,2083 ms, или се лъжа?


Сря Май 10, 2006 12:38 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Мар 01, 2006 2:21 pm
Мнения: 267
Местоположение: Fort Lauderdale, FL
Мнение 
Зависи колко бита предава (колко стоп бита, контрол по четност/нечетност и колко за данни), но все пак е доста под една милисекунда.

_________________
Всички обичаме да печелим, но колко от нас обичат да тренират!


Сря Май 10, 2006 11:02 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Сря Мар 01, 2006 2:21 pm
Мнения: 267
Местоположение: Fort Lauderdale, FL
Мнение 
А съм правил нещо подобно със ATmega128 и нямах никакви проблеми. Вземах данните от АЦП 8000 пъти за секунда обработвам ги и ги предавам по UART. Предаването на данните беше на 112500 защото на по-ниска скорост не можех да предавам всичко необходимо и нямах никакви проблеми.

_________________
Всички обичаме да печелим, но колко от нас обичат да тренират!


Сря Май 10, 2006 11:06 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ами няма как да предаваш нещо циклично на 1 мс, ако самото предаване е повече от 1мс.

Решението е или да предаваш по бързо, или да предаваш по малко данни.

Защо не можеш на по-висока скорост да предаваш. Проблемите може да са от неправилно подбран кварц или от средата за пренасяне - дълги линии, оптрони или нещо от сорта. Но ако искаш да предаваш тия данни - ще ти се наложи да вдигнеш скоростта.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Сря Май 10, 2006 11:31 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Мар 14, 2006 12:01 am
Мнения: 6
Местоположение: Пловдив
Мнение 
Явно единственото решение да е се вдигне скоростта. Не ставаше на по-висока скорост на редаване, защото използвах вътрешния осцилатор на 8Mhz, а той не се дели точно на стандартните скорости на RS-a и се вдигаше процента на грешка. Днес сложих кварц на 11,0592 MHz и ще го карам така на 57600kbs или по-висока. Сега се появиха едни други проблеми, но те не са за тази тема. Принципно въпроса ми беше какво става, ако докато предавам по сериен интерфейс, процесора се прекъсва по таймерни и АЦП прекъсвания ? Трябва ли да пусна проверката по четност или да забраня прекъсванията по време на предаването ?


Сря Май 10, 2006 5:44 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
iko написа:
Явно единственото решение да е се вдигне скоростта. Не ставаше на по-висока скорост на редаване, защото използвах вътрешния осцилатор на 8Mhz, а той не се дели точно на стандартните скорости на RS-a и се вдигаше процента на грешка. Днес сложих кварц на 11,0592 MHz и ще го карам така на 57600kbs или по-висока. Сега се появиха едни други проблеми, но те не са за тази тема. Принципно въпроса ми беше какво става, ако докато предавам по сериен интерфейс, процесора се прекъсва по таймерни и АЦП прекъсвания ? Трябва ли да пусна проверката по четност или да забраня прекъсванията по време на предаването ?


1. Веднъж влезли в хардуерната машина на UART-а (т.е като си ги записал в регистъра за изпращане), данните се обслужват без намеса на ядрото. Т.е. прекъсванията не пречат.

2. Проверката по четност няма никакво отношение към т.1. По принцип тая проверка има много спорен ефект и масово се отрича във съвремието. По добре е да има софтуерна защита на база цели пакети. Как ще я организираш - ти си реши.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Сря Май 10, 2006 6:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
На 38400 bps и период на повторение 1 ms работата опира до това колко бита ще предаваш за канал. Реално ще ти стигне с излишък за 8 бита, за 10 няма да ти стигне. Пресметни си пак нещата, за 1 байт / канал работата ти направо спи и не би следвало да имаш никакви проблеми. Организирай си нещата в пакети по 100 - 200 байта, за да се синхронизираш културно отсреща.


Сря Май 10, 2006 7:23 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 8 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни