Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
03.03.2010, 21:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Вложенные прерывания HITECH PIC16
Доброго времени суток. Возник вопрос по СИ.
Требуется обработать два прерывания. Таймер0 и Таймер1. Одно будет вкладываться в другое.
на АСМе делается так, кусок (SAV_TMR1 до RUTIN_TMR1) располагается во всех страничках програмной памяти с одного адреса, дабы переход по GOTO SAV_TMR1 работал не зависимо от состояния PCLATCH в момент прерывания.
Код:
|
BTFSS INTCON,T0IF
GOTO SAV_TMR1
;сохраняем контекст для таймера 0
SAV_TMR0 MOVWF T0W
MOVF STATUS,W
BANKSEL SAVREGISTR
MOVWF T0STAT
MOVF PCLATCH,W
MOVWF T0PCH
MOVF FSR,W
MOVWF T0FSR
CLRF PCLATCH
RUTIN_TMR0 BCF INTCON,T0IF;гасим флаг
;сохраняем контекст для таймера 1
SAV_TMR1 MOVWF T1W
MOVF STATUS,W
BANKSEL SAVREGISTR
MOVWF T1STAT
MOVF PCLATCH,W
MOVWF T1PCH
MOVF FSR,W
MOVWF T1FSR
CLRF PCLATCH
GOTO RUTIN_TMR1
RUTIN_TMR1
BANKSEL PIE ;
BCF PIE,TMR1IE;выкл прерывания TMR1
BANKSEL PIR ;
BCF PIR,TMR1IF;гасим флаг
BSF INTCON,GIF;РАЗРЕШАЕМ ПРЕРЫВАНИЯ для ТАЙМЕРА0 |
Как ЭТО ЖЕ моно изобразить на СИ? просматривал что генерит компилятор, сохраняет W и STATUS, а вот об FSR и PCLATH по моему забыл.
Меня интересует возможно ли заставить его генерить то что я изобразил на АСМ.
ИЛИ как это коректно делается на СИ.
может типа этого?
Код:
|
if((INTCON & 0x04)›0) // ещё вариант if((INTCON & 0x04)==4)
{
//вектор TMR0
INTCON =INTCON & 0xFB;//гасим флаг
}
else
{
//вектор TMR1
PIR1=PIR1 & 0xFE; //гасим флаг
PIE=PIE & 0xFE; //выкл прерывание TMR1
__enable_interrupt();
} |
Последний раз редактировалось picavr; 03.03.2010 в 21:52.
|
|
|
|
03.03.2010, 22:06
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Бросьте эту затею, это неправильно. Исходите из суперлупа. Пересмотрите решение задачи или вы обречены на долгий гемор.
|
|
|
|
03.03.2010, 22:12
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Код:
|
void interrupt ISR(void)
{
if(TMR0IF && TMR0IE)
{
TMR0IF = 0;
}
if(TMR1IF && TMR1IE)
{
TMR1IF = 0;
}
} |
Или нет?
|
|
|
|
03.03.2010, 22:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от realid
|
Или нет?
|
Может и так, я ещё не пробовал, посему и спрашиваю ходивших по этим граблям... Спасибо, примерно то же самое я и изобразил в первом посте...
Я думал здесь нужно будет заботится о сохранении контента для разных прерываний...
Сообщение от st_1
|
Бросьте эту затею, это неправильно. Исходите из суперлупа. Пересмотрите решение задачи или вы обречены на долгий гемор.
|
Ответ неправильный... Вопрос звучал как изобразить на СИ...
или СИ этого не позволяет ???
Покажите где написано что вложеные прерывания это не правильно?
Как правило гемора, при правильном распределени ресурсов МК, нет.
ИМХО. Прерывания более усточивы к сбоям нежели фоновая программа.
|
|
|
|
03.03.2010, 22:35
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от picavr
|
на АСМе делается так, кусок (SAV_TMR1 до RUTIN_TMR1) располагается во всех страничках програмной памяти с одного адреса, дабы переход по GOTO SAV_TMR1 работал не зависимо от состояния PCLATCH в момент прерывания.
|
Это неправильно, тем более на Си.
|
|
|
|
03.03.2010, 22:40
|
|
Заблокирован
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от picavr
|
Прерывания более усточивы к сбоям нежели фоновая программа.
|
Нонсенс. Почитайте про устойчивость программ к различным типам воздействий и правила написания отказоустойчивых программ.
|
|
|
|
03.03.2010, 22:47
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
W, STATUS и PCLATH сохряняются. А FSR то вам зачем?
|
|
|
|
03.03.2010, 22:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от realid
|
W, STATUS и PCLATH сохряняются. А FSR то вам зачем?
|
Возможно мне и незачем ))) привык к асемблере контролировать всё...
НО в вашем примере во время обработки прерывания TMR1 не может сработать и обработатся прерывание TMR0...
Если невозможно написать на СИ придётся прерывание писать на асме...
Последний раз редактировалось picavr; 03.03.2010 в 23:15.
|
|
|
|
03.03.2010, 23:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от st_1
|
Нонсенс.
|
Покажите где написано что вложеные прерывания это не правильно?
Попробуйте расположить ТОЛЬКО в странице 0-7FF FLASH тот обработчик из моего поста... при срабатывани прерывания TMR1 с PCLATH = 800...1F00 по команде GOTO переход происходит на адрес в
соответствующей странице...))) в котором неизвестно что.
более чем за 10 лет ассемблера я уже разобрался что правильно )))
|
|
|
|
03.03.2010, 23:12
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,529
Сказал спасибо: 172
Сказали Спасибо 1,560 раз(а) в 810 сообщении(ях)
|
Re: Вложенные прерывания HITECH PIC16
Сообщение от picavr
|
Возможно мне и незачем ))) привык к асемблере контролировать всё...
НО в вашем примере во время обработки прерывания TMR1 не может сработать и обработатся прерывание TMR0...
|
С чего вы взяли это? Ваш код на си и мой делают одно и тоже.
PS. Не обижайтесь, но эта запись if((INTCON & 0x04)›0) меня улыбнула. Это тоже самое, что if(TMR0IF).
Последний раз редактировалось realid; 03.03.2010 в 23:16.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:22.
|
|