реклама на сайте
подробности

 
 
> Обработка двух прерываний ?, ATMEGA162
zombi
сообщение Jan 27 2009, 12:09
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Столкнулся с проблемой.
Долго мучался и ветаки поборол, но как-то странно!

Опишу кратко.
Используется два прерывания:

1:0x01A Timer/Counter1 Compare Match A - режим CLC (частота 44100 Hz)
2:0x020 Timer/Counter0 Compare Match - режим CLC ( частота 500 Hz)

У второго прерывания приоритет ниже и первая команда его обработчика SEI.
Все регистры и флаги сохраняются в каждом обработчике.
Проблема в том что во втором прерывании необходимо читать состояние PIND.4
Состояние пина иногда считывается 0-м в то время как он в 1-це.

В таком виде глючило:

CBI PORTB,7
SBI PORTB,7
ROL RTMP
SBIC PIND.4
ANDI RTMP,$01

добавил запрет и разрешение прерываний и глюк ПОЛНОСТЬЮ пропал:

CLI
CBI PORTB,7
SBI PORTB,7
ROL RTMP
SBIC PIND.4
ANDI RTMP,$01
SEI

Что это, глюк меги или я чегото не понимаю?
Ктонибудь сталкивался с подобным?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zombi
сообщение Jan 27 2009, 13:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



Цитата
В стеке? Код полностью огласите плз.

Полность очень много!
Попробую частями.
Настройка и разрешение прерываний:
Код
;-- TIMER1 - SOUND --------------
    LDI    RTMP,$09
    OUT    TCCR1B,RTMP
    LDI    RTMP,HIGH(362)
    OUT    OCR1AH,RTMP
    LDI    RTMP,LOW(362)
    OUT    OCR1AL,RTMP

;-- TIMER0 - KEY --------------
    LDI    RTMP,$0E
    OUT    TCCR2,RTMP
    LDI    RTMP,124
    OUT    OCR2,RTMP
;-----------------
    LDI    RTMP,$50
    OUT    TIMSK,RTMP

Обработчик timer1:
Код
TIM1:
    PUSH    RTMPA
    IN    RTMPA,$3F
    PUSH    RTMPA
.
.
.
    POP    RTMPA
    OUT    $3F,RTMPA
    POP    RTMPA
    RETI

Обработчик timer0:
Код
TIM0:
    SEI
    PUSH    RTMPA
    IN    RTMPA,$3F
    PUSH    RTMPA
.
.
.
    CLI      <----------------------
    CBI    PORTB,7
    SBI    PORTB,7
    LSL    RTMPA
    SBIC    PIND,4
    ORI    RTMPA,$01
    SEI     <----------------------
.
.
.
    STS    $8000,RTMPA
    RET


Проблема в том что даже если на PIND.4 тупо VCC подать, то младший бит в ячейке $8000 не всегда =1 если в обработчике TIM0 нету CLI/SEI во время его опроса.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- zombi   Обработка двух прерываний ?   Jan 27 2009, 12:09
- - _Pasha   Цитата(zombi @ Jan 27 2009, 16:09) CLI CB...   Jan 27 2009, 12:30
- - zombi   Я ж написал что "Все регистры и флаги сохраня...   Jan 27 2009, 12:39
- - _Pasha   Цитата(zombi @ Jan 27 2009, 16:09) У втор...   Jan 27 2009, 12:50
|- - _Pasha   Опускаю Ваши небрежности (код выхода из TIM0, код ...   Jan 27 2009, 13:39
|- - defunct   Цитата(zombi @ Jan 27 2009, 15:23) Попроб...   Jan 27 2009, 14:20
- - zombi   Спасибо всем ответившим. Цитатапожертвуйте регистр...   Jan 27 2009, 15:16
|- - _Pasha   Цитата(zombi @ Jan 27 2009, 18:16) А что ...   Jan 27 2009, 16:06
|- - uau   Цитата(zombi @ Jan 27 2009, 18:16) А что ...   Jan 28 2009, 10:46
- - zombi   Цитатато проверьте таблицу векторов прерываний - в...   Jan 27 2009, 16:18
- - _Pasha   Значит где-то чистят Ваш RTMPA без сохранения/восс...   Jan 27 2009, 16:30
|- - zombi   Цитата(_Pasha @ Jan 27 2009, 19:30) Значи...   Jan 27 2009, 16:42
- - SasaVitebsk   Интересно. Я не сталкивался, но в первых моделях у...   Jan 27 2009, 18:12
- - zombi   Прошу прощения за поднятую бучу! Все оказалось...   Jan 28 2009, 14:48


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 03:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.02525 секунд с 7
ELECTRONIX ©2004-2016