AVRStudio не дружит с АЦП ?
Добавлено: Сб авг 26, 2006 20:45:40
Я пытался моделировать работу АЦП микроконтроллера АТМега16 в симуляторе AVRStudio 4. Конечно, работу самого АЦП эта программа не поддерживает, но она, вроде бы, должна по окончании преобразования менять состояние флагов ADSC (бит 6 ADSR-должен упасть) и ADIF (бит 4 ADSR-должен подняться) и генерировать прерывание. Алгоритм в пророграмме такой:
rcall ADC_ ;В первый раз из основной программы
;отправляю на подпрограмму инициали
;зации АЦП и обработки его прерыва
;ний "насильно"
sei ;разрешаю прерывания
;и кручусь в цикле, жду прерывания от АЦП
;.........
ADC_: ;Иниц. и обработка прерываний
cli ;глобальное запрещ. прерываний
ldi VAR5, 0b11100000
out ADMUX, VAR5 ;Регистром ADMUX выбрал канал 0 для
;АЦП,левое выравнивание результата,
;внутренний источник опорного напр.
ldi VAR5, 0b10001101
out ADCSR, VAR5 ;Pегистром ADCSR выбрал тактовую
;частоту, разрешил прерывания
;(бит 3),сбросил флаг завершения
;(бит 4),запретил автозапуск (бит
;5), разрешил использовать АЦП
;(бит 7)
;дальше идет несколько десятков строк, которые к
;делу не относятся
sbi ADCSR, 6 ;напоследок запускаю АЦП
reti ;и назад, в основную программу
Получается какая-то ерунда. АЦП запущен, программа
крутится в цикле, флаги не изменяются, прерывания нет. Добавишь (или убавишь) несколько строчек,совершенно левых (даже nop пробовал)- прерывание появилось, но от этого не легче. Программа идет почему-то не в начало, где прописаны вектора прерываний, а в середину, в основной цикл. Вопроса-три: кто- нибудь сталкивался с подобной проблемой, можно ли в AVRStudio нормально проверить мою программу и что за гадость такая с векторами прерываний. Всем спасибо.
rcall ADC_ ;В первый раз из основной программы
;отправляю на подпрограмму инициали
;зации АЦП и обработки его прерыва
;ний "насильно"
sei ;разрешаю прерывания
;и кручусь в цикле, жду прерывания от АЦП
;.........
ADC_: ;Иниц. и обработка прерываний
cli ;глобальное запрещ. прерываний
ldi VAR5, 0b11100000
out ADMUX, VAR5 ;Регистром ADMUX выбрал канал 0 для
;АЦП,левое выравнивание результата,
;внутренний источник опорного напр.
ldi VAR5, 0b10001101
out ADCSR, VAR5 ;Pегистром ADCSR выбрал тактовую
;частоту, разрешил прерывания
;(бит 3),сбросил флаг завершения
;(бит 4),запретил автозапуск (бит
;5), разрешил использовать АЦП
;(бит 7)
;дальше идет несколько десятков строк, которые к
;делу не относятся
sbi ADCSR, 6 ;напоследок запускаю АЦП
reti ;и назад, в основную программу
Получается какая-то ерунда. АЦП запущен, программа
крутится в цикле, флаги не изменяются, прерывания нет. Добавишь (или убавишь) несколько строчек,совершенно левых (даже nop пробовал)- прерывание появилось, но от этого не легче. Программа идет почему-то не в начало, где прописаны вектора прерываний, а в середину, в основной цикл. Вопроса-три: кто- нибудь сталкивался с подобной проблемой, можно ли в AVRStudio нормально проверить мою программу и что за гадость такая с векторами прерываний. Всем спасибо.