Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
14.10.2006, 19:01
|
|
Прохожий
Регистрация: 07.10.2006
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Внутреннее АЦП ATMEGA8535 в непрерывном режиме.
Работаю с ATMEGA8535.
АЦП по прерыванию таймера 0 производит оцифровку 4 канала и выдает результат в порты.
Код:
|
WDR
LDI tmp,24
OUT WDTCR,tmp ;установка сторожа
LDI tmp,12 ;2 сек
OUT WDTCR,tmp
SEI ;разрешение обработки прерываний
LDI tmp,(1‹‹TOIE0)
OUT TIMSK,tmp
LDI tmp,skor ;интервал времени таймера 0
OUT TCNT0,tmp
LDI tmp,(5‹‹CS00) ;установка предделителя таймепа 0
OUT TCCR0,tmp ;запуск таймера
LDI tmp,(0‹‹ADLAR)|(4‹‹MUX0)|(0‹‹REFS0) ;4 канал, внешний REF
OUT ADMUX,tmp
LDI tmp,(7‹‹ADPS0)|(1‹‹ADEN)|(1‹‹ADIE)|(1‹‹ADATE) ; непрерывное преобразование
OUT ADCSRA,tmp
LDI tmp,(4‹‹ADTS0) ; по переполнению таймера
OUT SFIOR,tmp
AZPG:
--------------ОСНОВНАЯ ПРОГРАММА-----------------------
RJMP AZPG
;----------------------- -----Прерывание по переполнению таймера 0 ------------------------------
LTIMER0:
SBI ADCSRA,ADSC ;запуск преобразования
WDR
RETI
;******************** Прерывание по переполнению таймера 0******************
;*************************** Прерывание АЦП****************************
Ladc:
IN R16,ADCH
IN R17,ADCL
OUT PORTB,R16
OUT PORTА,R17
RETI |
АЦП выдает постоянно только результат первого измерения.
Если отключить сброс сторожа то, результат становить динамичным.
Но нужно чтобы программа работала без сброса контроллера. Подскажите где ошибка в коде!
Заранее благодарен!
|
|
|
|
15.10.2006, 02:22
|
|
Частый гость
Регистрация: 14.09.2005
Сообщений: 34
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Я не профессионал, могу ошибаться,
но, по моему ошибки в следующем:
***
1- wdr обычно нельзя ставить в прерываниях таймера,
потому что возможна ситуация когда, допустим из-за ошибки кода,
или помехи основная программа зависла, а прерывания исправно
происходят, wdt обнуляется, основная программа не перезапускается;
***
2- порядок чтения результатов замера АЦП неправильный,
читаем даташит (для мега8535 - doc2502.pdf, стр.220)
"When ADCL is read, the ADC Data Register is not updated until ADCH is read. Consequently,
if the result is left adjusted and no more than 8-bit precision is required, it is
sufficient to read ADCH. Otherwise, ADCL must be read first, then ADCH."
То есть надо читать сначала младший (ADCL),
а затем старший (ADCH) байты, иначе можем прочитать черте-что.
***
3-Разрешать прерывания (sei) нельзя до окончания инициализации.
***
4-Непонятно есть ли у Вас инициализация стэка, векторов.
То есть это кусок кода, или приведен весь код?
***
5-Если Вы используете непрерывное преобразование,
то флаг SBI ADCSRA,ADSC достаточно поставить один раз,
перед бесконечным циклом, а дальше он будет сам восстанавливаться.
***
6-Шо то я не углядел в коде где переключаются каналы.
***
Особо не вникал, скорее всего есть еще что нибудь.
_______________
Александр
2006 10 15
|
|
|
|
15.10.2006, 23:14
|
|
Прохожий
Регистрация: 07.10.2006
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Спасибо, за внимание Laksus
1. Это вопрос религии, если основная прога крутиться в бесконечном цикле…
2. Да согласен не досмотрел. Хотя ошибок по правильности оцифровки пока не наблюдал.
3. Согласен.
4. Вектора есть и стек есть.
5. В этом и проблема что не работат бесконечный цикл!
6. А что нужно обязательно переключать каналы, если датчик висит только на одном?
После внесения поправок 2 и 3 да 5 результат не изменился.
|
|
|
|
16.10.2006, 02:42
|
|
Частый гость
Регистрация: 14.09.2005
Сообщений: 34
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от fomalgaut
|
6. А что нужно обязательно переключать каналы, если датчик висит только на одном?
|
Виноват. Недопонял Ваше сообщение. Понял так, что у Вас
используется четыре входа, а сбой состоит в том,
что читает только с одного входа.
__________
Только что погонял на симуляторе AVRStudio,
(добавил инициализацию, и изменил на мегу16,
код Ваш совсем не менял,
только изменил русскую букву "А" на латинскую в строке:
OUT PORTА,R17),
вроде все делает нормально.
Заходит и в прерывания таймера и АЦП.
Обновляет результаты.
Может ошибка в инициализации?
__________
Александр
2006 10 16
|
|
|
|
16.10.2006, 07:34
|
|
Прохожий
Регистрация: 07.10.2006
Сообщений: 5
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
В AVRSTUDIO у меня все работает, а в живую код первого измерения!При том программа пробегает по всем прерываниям - ставил флажки вывод в порт.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Как очистить очередь прерываний в ATMega8535?
|
greafuger |
Микроконтроллеры, АЦП, память и т.д |
4 |
04.06.2008 23:03 |
Использование прерываний в ATMega8535
|
igor727 |
Микроконтроллеры, АЦП, память и т.д |
2 |
28.04.2007 15:50 |
ATMega8535
|
Sergeyich |
Микроконтроллеры, АЦП, память и т.д |
3 |
15.09.2005 01:01 |
[b]Тайминг для ATMEGA8535 в среде ICC[/b]
|
delay |
Микроконтроллеры, АЦП, память и т.д |
0 |
24.06.2005 01:06 |
ATmega8535 и CodeVision... прошу совета !!!
|
Виталий |
Микроконтроллеры, АЦП, память и т.д |
1 |
30.09.2004 12:35 |
Часовой пояс GMT +4, время: 19:16.
|
|