19.02.2015, 21:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Работа с WDT в МК PIC16F628
Что бы разрешить работу сторожевого таймера нужно в конфигурации МК установить соответствующий бит в 1 WDT=1.
Как запретить работу WDT в прерывании?
Код:
|
int i=0;
void main()
{
CMCON=0x07;
OPTION_REG=0X0F;
INTCON=0XF0;
TRISA.RA0=0;
TRISA.RA1=0;
TRISA.RA2=0;
while(1)
{
PORTA.RA1=~PORTA.RA1; //контроль работы основного цикла
Delay_ms(1);
}
}
void interrupt(void)
{
if(INTCON.T0IF==1)
{
INTCON.T0IF=0;
i++;
if(i›5000)
{
i=0;
PORTA.RA0=~PORTA.RA0;
asm {
CLRWDT
SLEEP
}
}
}
//================================================== ============================
if(INTCON.INTF==1) //в этом условии нужно отключть работу WDT
//условие выполняется при изменении лог. уровня на RB0
{
i=0;
PORTA.RA2=~PORTA.RA2;
INTCON.INTF=0;
}
} |
В этом коде происходит перевод МК в спящий режим на время переполнения WDT.
|
|
|
|
19.02.2015, 22:09
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,504
Сказал спасибо: 401
Сказали Спасибо 2,217 раз(а) в 1,315 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Никак. Только сбросом clrwdt
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
19.02.2015, 22:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
CLRWDT не обязательно ставить перед SLEEP. Команда перехода в спячку и так обнулит таймер WDT и его предделитель. А вообще, засыпать в обработчике прерываний как-то не есть гуд.
|
|
|
|
19.02.2015, 23:00
|
|
Почётный гражданин KAZUS.RU
Регистрация: 26.12.2007
Сообщений: 1,198
Сказал спасибо: 70
Сказали Спасибо 80 раз(а) в 69 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Сообщение от alvadep
|
CLRWDT не обязательно ставить перед SLEEP. Команда перехода в спячку и так обнулит таймер WDT и его предделитель. А вообще, засыпать в обработчике прерываний как-то не есть гуд.
|
Да я только начал разбираться. Да в прерывании точно не к чему.
Я так понял после выхода из SLEEP все переменные которые были изменены в процессе работы программы, потеряют свой принятые изменения и примут изначальные состояния?
|
|
|
|
20.02.2015, 00:04
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Все зависит от того, чем будить МК. В ДШ это все описано.
|
|
|
|
20.02.2015, 09:14
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,504
Сказал спасибо: 401
Сказали Спасибо 2,217 раз(а) в 1,315 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Откройте даташит этого МК на странице 104, таблица 14-7 показываетс остояние регистров при сбросах, последний столбец - при просыпании по WDT. Никакие регистры не меняют состояние, в том числе и пользовательские и даже W, ведь питание не выключается. А в зависимости от установленного до засыпания бита GIE программа либо продолжится после просыпания (GIE был = 0), либо перейдет по вектору прерывания (GIE был = 1) - в таблице строчка с состоянием регистра PCL (счетчика команд). Так же посмотрите таблицу 14-6 на предыдущей странице (последняя строчка этой таблицы).
Последний раз редактировалось NewWriter; 20.02.2015 в 09:19.
|
|
|
|
20.02.2015, 09:28
|
|
Прохожий
Регистрация: 27.01.2015
Сообщений: 9
Сказал спасибо: 0
Сказали Спасибо 5 раз(а) в 5 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Сообщение от vavan1983
|
.Я так понял после выхода из SLEEP все переменные которые были изменены в процессе работы программы, потеряют свой принятые изменения и примут изначальные состояния?
|
Если WDT выведет МК из спячки, то выполнение программы продолжится с команды, которая указана после SLEEP. На данные это повлияет, но для нормальной обработки прерывания, которое разбудит МК, следом за SLEEP рекомендуется писать NOP.
Последний раз редактировалось shindbad; 20.02.2015 в 09:30.
|
|
|
|
20.02.2015, 10:40
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.05.2011
Адрес: Харьков
Сообщений: 5,049
Сказал спасибо: 592
Сказали Спасибо 3,968 раз(а) в 1,826 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
А еще там есть раздел "WAKE-UP FROM SLEEP". Это я к этому.
И если выход по первому пункту, возможны варианты. Если начальная инициализация без проверки TO и PD, то именно так и будет
Цитата:
|
все переменные которые были изменены в процессе работы программы, потеряют свой принятые изменения и примут изначальные состояния
|
|
|
|
|
20.02.2015, 21:43
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Сообщение от alvadep
|
А вообще, засыпать в обработчике прерываний как-то не есть гуд.
|
Если сделать прямыми руками, то всё будет гуд.
А если пробуждение будет по WDT, то вообще никакой разницы.
|
|
|
|
20.02.2015, 21:51
|
|
Супер-модератор
Регистрация: 09.06.2011
Сообщений: 2,633
Сказал спасибо: 73
Сказали Спасибо 1,793 раз(а) в 647 сообщении(ях)
|
Re: Работа с WDT в МК PIC16F628
Сообщение от vavan1983
|
Я так понял после выхода из SLEEP все переменные которые были изменены в процессе работы программы, потеряют свой принятые изменения и примут изначальные состояния?
|
Только если подадите RESET. Потому что фактически это не пробуждение, а сброс МК. В остальных случаях все регистры сохраняют свои значения.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:56.
|
|