Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

ATmega644, глюки при просыпании по внешнему прерыванию. Продолжение пятничных экспериментов

Отправлено Лунь 24 декабря 2008 г. 15:27


Всем привет!
Разобрался с причиной зависания мк на выходе из спячки. Повторю исходные данные:
Переделываю проект на ATmega32 под ATmega644. Проект большой, но все работает, только обратил внимание, что если коснуться чем-нибудь ножки, ответственной за внешнее прерывание по фронту (PCINT), проц не просыпается, но начинает потреблять около 8-10мА и уже не реагирует ни на какие внешние воздействия, спасает только reset. Уверенное нажатие на кнопку проц не подвешивает, глючит только когда есть помеха типа разработчика с отверткой в руке. Ножка притянута внешним резистором 3к3 к плюсу питания, 5В. Спячка глубокая, power down. Тактирование - внешний кварц 8,0.
То же самое наблюдалось если задействовать просыпание по уровню (INT0). Но это я убрал под воздействием общественности (короткий импульс - короткий импульс, говорили они :)) Сейчас нет low level, только PCINT. Глюк точно такой же.
В ходе изучения вопроса выяснил, что в ряде случаев, в результате действия помехи на ножку с прерыванием процессор как-то неверно декодирует то, что стоит в векторе соответствующего прерывания. Там у меня стоит переход на старт, все должно начаться заново. Как результат - мк переходит на команду, которая стоит после команды sleep, и продолжает выполнять то что там есть. В моем случае там встречался цикл ожидания чего-то там, чего не может быть в принципе, поэтому мк вис намертво.
Повторю главное, это видно только у ATmega644. Такого нет у ATmega32.
Для примера даю программу, которая с некоторой вероятностью виснет. На глаз - каждое второе касание ножки D,2 вызывает мертвый висяк. Если четко нажимать кнопку, происходит тоже, но значительно реже.
Для того, чтобы эта же программа работала четко, нужно убрать последнюю строку (ну или две), либо поставить jmp на START.
Добавление куда-то там nop-ов, игра с SUT-фьюзами и прочие заигрывания не дают ни какого результата. Питание чистое, уже проверено - перепроверено.
Буду рад услышать комментарии, особенно, если я все же где-то не прав, и зря грешу на ATMEL.


;--------------------------------
; fuckin'ATmega644 waking up test
;--------------------------------


.include "m644def.inc"
.org 0x000 ; reset vector
rjmp START

.org 0x00E ; PCINT3 interruption vector
rjmp START



.org 0x03E
START:

cli ; global interrupt disable

ldi r16,high(RAMEND) ; stack pointer
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16

ldi r16,0
sts PCMSK3,r16 ; disable interuption
sts PCICR,r16


ldi r17,0xF0 ; configure ports
out DDRA,r17 ;PortA
ldi r17,0x00
out PORTA,r17
ldi r17,0xA5
out DDRB,r17 ;PortB
ldi r17,0x60
out PORTB,r17
ldi r17,0xFC
out DDRC,r17 ;PortC
ldi r17,0x0B
out PORTC,r17
ldi r17,0xF0
out DDRD,r17 ;PortD
ldi r17,0x17
out PORTD,r17


sbi DDRD,1 ; turn the LED on
sbi PORTD,1

ldi r18,100 ; delay = 4*200*100*100 = 8000000 clocks = 1 second @ 8.0 MHz
L1: ldi r17,100
L2: ldi r16,200
L3: dec r16
nop
brne L3
dec r17
brne L2
dec r18
brne L1

cbi PORTD,1 ; turn the LED off


ldi r16,0 ; ports
out DDRB,r16
out DDRC,r16
out DDRA,r16
out DDRD,r16

ldi r16,0
out PORTA,r16
out PORTB,r16
out PORTC,r16
out PORTD,r16



ldi r16,0b00000100 ; PCINT26 interuption enable
sts PCMSK3,r16
ldi r16,0b00001000
sts PCICR,r16

ldi r16,0b00000100 ; sleep mode: power down
out SMCR,r16
ldi r16,0b00000101 ; enable sleep
out SMCR,r16

sei
sleep ; sleep well, my darling!






cli
LABEL: jmp LABEL ; вот тут - корень зла.



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 90:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru