|
Поддержи наш сайт! |
Через WebMoney
R785211844650
Z210696637574
E368177590409
|
|  | | | |
Дозиметр на ATmega 8 (1 просматривает)
|
|
TOPIC: Дозиметр на ATmega 8
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| Дозиметр на ATmega 8 30.11.2008 13:34 |
Репутация: 0   |
|
Здравствуйте. Написал программу для реализации дозиметра на основе упомянутого в заголовке темы МК. Суть такая: МК, по прерыванию от прихода импульса со счётчика Гейгера инкрементирует регистр R17. По истечению 40 секунд срабатывает компаратор таймера, МК осуществляет следующий алгоритм: >проверяет регистр R18 на равенство нулю
>если не равен, то декрементит его и выводит на один из портов единицу, если равен, то перепрыгивает на регистр R17 >вызывает задержку >выводит 0 >опять идёт на проверку
Загоняю прогу в симуляцию ,в AVR Studio 4, а там начинается беспорядочное прыгание по прерываниям. Проверьте, пожалуйста, программный код.
Содержимое поста отредактировано: GRAF, в: 30.11.2008 13:35
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 13:36 |
Репутация: 0   |
Что-то не получилось при редактировании предыдущего поста вставить файл. Здесь код ASM.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 14:20 |
Репутация: 167   |
|
что я могу сказать по вашему коду... как минимум, там 2 ошибки: 1. Нет инициализации указателя стека в начале программы. Отсюда вызов rcall Delay приводит к тому, что все начинается сначала - стек-то не установлен и адрес возврата из подпрограммы Вудфн неизвестно куда пропал. 2. Путаница с прерываниями. Настраивается вроде бы INT1, но разрешается и обрабатывается INT0.
возможно, есть и еще какие-то проблемы, но не зная полного алгоритма и схемы сложно гадать - верно написана программа или нет.
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 14:39 |
Репутация: 0   |
|
Вставил указатель стека. Всё равно начинается прыгание по прерываниям.
Прерывание хочу сделать от INT0, по даташиту настраивал, проглядел, видимо, что-то.
Алгоритм такой: МК считает импульсы со счётчика Гейгера, инкрементит регистр, по истечению 40 сек. выводит значение регистра, отведённого под хранение числа импульсов со счётчика ( путём его декремента), на один из выводов порта В (0-й байт) в виде последовательности импульсов. На этот порт вешаются последовательно включённые 4 счётчика К176ИЕ4 и 7-ми сегментные индикаторы. Тактирование внешнее, от кварца 9.6 МГц.
Прохождение 40 секунд определяется сравнением регистра Temp2 на равенство 40, который инкрементится каждую секунду по прерыванию компаратора таймера.
Содержимое поста отредактировано: GRAF, в: 30.11.2008 14:41
Содержимое поста отредактировано: GRAF, в: 30.11.2008 14:42
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 14:48 |
Репутация: 167   |
я тоже в ваш код вставил инициализацию стека, и сразу оказалось, что постоянно непрерывно идут прерывания INT0. У вас для INT0 не заданы значения битов ICS00 и ICS01 регистра MCUCR, т.е. они нулевые (по умолчанию) - а это означает "прерывание по низкому уровню на входе INT0". Этот тип зпроса характерен тем, что если уровень 0 на INT держится постоянно - то прерывания так же генерируются непрерывно. если изменить состояние PIND на единички - запросы прекращаются и, по меньшей мере, программа ваша не скачет никуда. что дальше делать - я пока не в курсе
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 15:11 |
Репутация: 0   |
INT1 использоваться не будет, посажу его чз конденсатор на землю. Подправил код, теперь с регистрами MCUCR и GICR всё впорядке. Это нормально, что после обработки задержки прога возвращается опять на начало кода обработки RESET?
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 16:08 |
Репутация: 167   |
|
нет конечно! в нормальном состоянии ваша прога должна доковылять до метки PROGA и на ней "стоять", отвлекаясь только на обработку прерываний.
почему вы инициализируете только SPL? а SPH кто будет инициализировать?
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 16:18 |
Репутация: 0   |
|
Пардон. Поставил. Теперь, после обработки задержки, возвращается на начало RESET,а не на то место, с которого ушло на задержку.
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
ARV (Администратор)
Администратор
Постов: 2027
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 16:24 |
Репутация: 167   |
ну что вы там такое творите?! повторяю: если все нормально сделать, то программа доходит до команды и далее никуда не девается. после должна выполняться соманда | Code: | ldi Temp, 0b00000010
|
а вовсе не переход на метку RESET
Не стыдно не знать, стыдно не учиться
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
GRAF (Пользователь)
Новичок
Постов: 33
|
| В ответ на: Дозиметр на ATmega 8 30.11.2008 16:28 |
Репутация: 0   |
Ничего не творю, смотрите код:
|
|
|
|
Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
|
|
|
|
| | |  |
|