Поклонники продукции Microchip Technology Inc тусуются тут.
Ответить

Как софтово перезагрузить 16f628a

Вс мар 20, 2022 15:54:02

Добрый день. Подскажите, если не сложно, как именно софтово перезагрузить 628a? А именно - какие регистры требуется обнулить и что не забыть сделать помимо гото 0?
Просто надо сделать рестарт устройству по команде, прилетающей в уарт, а у меня клешни вместо рук и коржик вместо мозга, и что-то я туплю в это прекрасное и солнечное воскресенье. С прерываниями научился работать, с таймерами и ШИМом - тоже. А вот как делать пику рестарт - что-то не соображаю.

Re: Как софтово перезагрузить 16f628a

Вс мар 20, 2022 16:09:48

. А вот как делать пику рестарт - что-то не соображаю.

Примеры:
для PIC18F
CCS --> disasm
reset_cpu(); --> 087A 00FF RESET
или
для PIC16F
88: reset_cpu();
0D9 018A CLRF 0xa
0DA 2800 GOTO 0
Последний раз редактировалось Steppe Вс мар 20, 2022 17:21:58, всего редактировалось 1 раз.

Re: Как софтово перезагрузить 16f628a

Вс мар 20, 2022 16:47:10

Steppe, спасибо.

Re: Как софтово перезагрузить 16f628a

Вс мар 20, 2022 17:20:26

Включи wdt. А в том месте где определяешь команду на сброс напиши goto $

Re: Как софтово перезагрузить 16f628a

Вс мар 20, 2022 23:29:38

Простой переход на 0х0000 не аналогия аппаратному сбросу - кой-чего из регистров специальных функций не переустановит.
Команда reset есть только в случае ПИК18 или улучшенной среднемладшей серий.
Как вариант - использование одного из свободных выводов МК...
:roll:

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 09:53:08

Вот я про то и говорю. Если кратко - у меня там типа флаговый автомат, написанный на JALе (знаю, извращение - но в мплабе я бы ковырялся дольше, и до него руки дойдут рано или поздно). Получается так, что при простом прыжке на нуль у меня девайс уходит в бут-луп как будто при этом не обнуляется приёмный буфер уарта (а с чего бы ему обнуляться, так-то по хорошему... или всё-таки должен? не знаю...), и при первом же проходе цикл получает из него ту же самую команду на ребут и весело её обрабатывает по кругу. Какой регистр надо пнуть чтоб такого не происходило - я найти пока не смог. И вообще по ребуту из прошивки, да ещё со сбросом состояния уарта как-то не много информации нашел - все советуют только гото 0 как попугаи. При этом, ощущение такое, что от этого гото 0 даже переменные не обнуляются. Какие регистры используются при инициализации порта - посмотрел в библиотеках JALа и ДШ, попробовал RCREG обнулять и всё такое - как-то не помогает пока. Хоть ты тресни - бут-луп.
Ватчдог не хочу использовать - у меня его прескейлер занят другим таймером, а без него он слишком часто тикает, а я ещё не от всех делеев везде избавился.

На счёт CLRF 0xA - это, полагаю, я программный счетчик PCLATH обнуляю? Ну это мало поможет в моём случае, но спасибо, почитаю, запомню.

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 10:18:43

чего-то мне кажется, что твоя хотелка просто неправильная: контроллер по внешним командам должен выполнять определённые действия, а не отключать себе питание....если это в качестве устранения какой-то нештатной ситуации, то нет гарантии, что контроллер примет и отработает эту команду.....надо исходить из того, что ВСЕ как-то пользуются контроллером и только тебе захотелось чего-то нестандартного, а скорее всего просто из-за недостатка опыта...

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 10:57:17

И вообще по ребуту из прошивки, да ещё со сбросом состояния уарта как-то не много информации нашел - все советуют только гото 0 как попугаи. При этом, ощущение такое, что от этого гото 0 даже переменные не обнуляются. Какие регистры используются при инициализации порта - посмотрел в библиотеках JALа и ДШ, попробовал RCREG обнулять и всё такое - как-то не помогает пока. .

В начале программы, где описываются всякие инициализации портов и регистров, а также переменные и массивы, добавьте строчки по обнулению нужных переменных и буферов. И фсЁ. Разве это проблема?

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 11:06:30

Steppe, не проблема. Это изначально сделано по примеру функции инициализации порта из джаловских библиотек. Но не работает как надо. Я что-то явно упускаю.

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 11:57:29

Нужно не только рабочую область ОЗУ обнулять, но и ставить в исходное состояние задействованные в прикладной программе регистры специальных функций.
А уж затем давать переход на стартовый адрес.
:roll:

Re: Как софтово перезагрузить 16f628a

Пн мар 21, 2022 12:42:22

Хорошо, попробую вечером написать функцию, приводящую МК в стандартные состояния регистров. Может быть, найду что забыл.
Ответить