| Автор |
Съобщение |
|
iko
Ранг: Минаващ
Регистриран на: Вто Мар 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 |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Хм, при 38400 предаването на 1 байт отнема 0,2083 ms, или се лъжа?
|
| Сря Май 10, 2006 12:38 am |
|
 |
|
paregov
Ранг: Ориентиран
Регистриран на: Сря Мар 01, 2006 2:21 pm Мнения: 267 Местоположение: Fort Lauderdale, FL
|
Зависи колко бита предава (колко стоп бита, контрол по четност/нечетност и колко за данни), но все пак е доста под една милисекунда.
_________________ Всички обичаме да печелим, но колко от нас обичат да тренират!
|
| Сря Май 10, 2006 11:02 am |
|
 |
|
paregov
Ранг: Ориентиран
Регистриран на: Сря Мар 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 |
|
 |
|
iko
Ранг: Минаващ
Регистриран на: Вто Мар 14, 2006 12:01 am Мнения: 6 Местоположение: Пловдив
|
Явно единственото решение да е се вдигне скоростта. Не ставаше на по-висока скорост на редаване, защото използвах вътрешния осцилатор на 8Mhz, а той не се дели точно на стандартните скорости на RS-a и се вдигаше процента на грешка. Днес сложих кварц на 11,0592 MHz и ще го карам така на 57600kbs или по-висока. Сега се появиха едни други проблеми, но те не са за тази тема. Принципно въпроса ми беше какво става, ако докато предавам по сериен интерфейс, процесора се прекъсва по таймерни и АЦП прекъсвания ? Трябва ли да пусна проверката по четност или да забраня прекъсванията по време на предаването ?
|
| Сря Май 10, 2006 5:44 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
1. Веднъж влезли в хардуерната машина на UART-а (т.е като си ги записал в регистъра за изпращане), данните се обслужват без намеса на ядрото. Т.е. прекъсванията не пречат.
2. Проверката по четност няма никакво отношение към т.1. По принцип тая проверка има много спорен ефект и масово се отрича във съвремието. По добре е да има софтуерна защита на база цели пакети. Как ще я организираш - ти си реши.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Сря Май 10, 2006 6:25 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
На 38400 bps и период на повторение 1 ms работата опира до това колко бита ще предаваш за канал. Реално ще ти стигне с излишък за 8 бита, за 10 няма да ти стигне. Пресметни си пак нещата, за 1 байт / канал работата ти направо спи и не би следвало да имаш никакви проблеми. Организирай си нещата в пакети по 100 - 200 байта, за да се синхронизираш културно отсреща.
|
| Сря Май 10, 2006 7:23 pm |
|
|