Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Сброс контроллера
Сброс контроллера
tolyan249 Дата: Ср, 28.05.2014, 04:51  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Можно ли сбросить контроллер програмно? Что бы не паять схему сброса через MCLR.

нашел тут на сайте вот это

Сброс для ПИК18: Reset
для 16 @goto 0
что это за собака и где это метка 0 где ее ставить?  непонятно.

Вся поблема  в том что       переменная     моя   redim   принимает разное значение ,хотя должна менть значения в порядке возрастания, если заремить аппаратное прерывание тогда все нормально.
такое ощщущение что данные не сохраняються в регистрах после прерывания . хотя в программе это описано.

и уходит не попорядку по меткам как должно быть а хоатчно.

и нужно ли ставить это  в прерывание  и что это значит?
Int_Sub_Start
Int_Sub_End

и отваливаються 2 ноги контроллера через неопределенное время через (час два), помогает только сбросс.
может тоже из за прерывания.

Спасибо.

Сообщение отредактировал tolyan249 - Ср, 28.05.2014, 14:27
ЯНДЕКС Дата: 28.05.2014
ADMIN Дата: Ср, 28.05.2014, 07:36  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Символ собаки означает, что после него будет написана строка кода на ассемблере. цифра 0 означает переход на 0 адрес исполнения программы. Можно и на basic написать то же самое. Указать метку в начале программы, и для сброса переходить на нее.
tolyan249 Дата: Ср, 28.05.2014, 08:39  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline



Добавлено (28.05.2014, 08:39)
---------------------------------------------
СПАСИБО.

Сообщение отредактировал tolyan249 - Ср, 28.05.2014, 09:56
MiXaS Дата: Ср, 28.05.2014, 10:25  |                                                                                                                Сообщение # 4
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Ого! Вот это код! Сколько костылей! Можно все упростить в десятки раз. Оссобенно не понятно вот это:
Цитата tolyan249 ()
''----------Управление портами каналов--------------- If s=yark  Then  PORTB.1=1 If s= yark  Then  PORTB.2=1 if s=yark  Then  PORTB.3=1 If s=yark  Then PORTB.4=1 If s=yark  Then PORTB.5=1 If s=yark  Then PORTB.6=1 If s=  yark  Then PORTB.7=1 ''--------------------------------------- If s=yark  Then PORTC.0=1 If s= yark  Then PORTC.1=1 If s= yark  Then PORTC.2=1 If s=  yark Then PORTC.3=1 If s=  yark Then PORTC.4=1 If s=  yark  Then PORTC.5=1 If s=  yark   Then PORTC.6=1 If s=   yark Then PORTC.7=1 ''----------------------------------------------------------------- If s=  yark   Then PORTD.0=1 If s=   yark  Then PORTD.1=1 If s=   yark Then PORTD.2=1 If s=  yark  Then PORTD.3=1 If s=  yark  Then PORTD.4=1 If s=  yark  Then PORTD.5=1 If s=  yark Then PORTD.6=1 If s=  yark  Then PORTD.7=1 ''--------------------------------------------------------------- If s=  yark  Then PORTE.0=1 If s=  yark Then PORTE.1=1 If s=  yark Then PORTE.2=1
portb=0
portc=0
portd=0
porte=0


Как по Вашему это должно работать?
Есть подозрение, что включаются все порты при условии If s=  yark  Then, а потом все сбрасывается portb=0 portc=0 portd=0 porte=0

вообще непонятно зачем это писать.

Код
main:  

  GoSub minnapr  
  rndm=0  
  col=0  
  l=0  
  m=0  
  n=51  
  times=100  
  DelayMS 100  
redim = redim + 5
  if redim=50 then redim=0

yark = redim  
delayms 500

  GoTo main

'------------------------------------------------------------------------------------------------------------------------------------------- ------------------
Вот так будет работать стабильнее, меньше кода (в разы), и понятнее

По поводу портов, порт А, В, С, отконфигурированны нормально, а вот остальные не так просто конфигурятся на этом камне. Найдите русский мануал на этот камень и почитайте все регистры на этом порту.
Цитата tolyan249 ()
Declare PortB_Pullups = OFF   ' Выключить подтягивающие резисторы на PORTB Declare  All_Digital = On   ' Установить все порты цифровыми входами/выходами

Вот эти две дерективы не рекомендую использовать. Гораздо надежнее через регистры конфигурации это сделать.

Вот что еще не понятно, вы сначало выключаете подтяжки через Declare PortB_Pullups = OFF, а потом включаете, optionreg.7=1. Вы уж определитесь!

Также рекомендую использовать оператор аппаратных прерываний On_Hardware_Interrupt.

te:

Context Save
'Сначало нужно запретить все прерывания!

INTCON.4=0 '1 Бит разрешения прерывания по PORTB.0(INT) -включен
INTCON.5=0 ' Бит разрешения прерывания по переполнению TMR0 -включен пока
INTCON.6=0 ' Бит разрешения прерывания от периферийных устройств -включен
INTCON.7=0 'Бит глобального разрешения прерываний -включен

If INTCON.1=1 Then 'произошло прерывание по PORTB.0
If OPTION_REG.6=0 Then 'если это фронт то делать сдедующие

s=0
TMR0=0

EndIf

INTCON.1=0
EndIf

'переполнение таймера
If INTCON.2=1 Then 'пришло прерывание от таймера TMR0-что он переполнился
Inc s 'переполнение происходит каждые 256мкс-микросекунд
INTCON.2=0 'считываем эти переполнения и увеличеваем переменную на 1
EndIf 'что бы знать сколько переполнений было

INTCON.4=1 '1 Бит разрешения прерывания по PORTB.0(INT) -включен
INTCON.5=1 ' Бит разрешения прерывания по переполнению TMR0 -включен пока
INTCON.6=1 ' Бит разрешения прерывания от периферийных устройств -включен
INTCON.7=1 'Бит глобального разрешения прерываний -включен

Context Restore

Как-то так.
tolyan249 Дата: Ср, 28.05.2014, 12:52  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Кака я понял из вашего ,то что когда вошли в прерывание то в это время нужно отменить все прерывания, затем их включить заного при выходе из прерывания,  так или нет?

redim = redim + 5 так не пойдет потому что это переход на метку, а в метках переменная yark может быть любой от 0-255 ,яркость свечения лампочки.

Спасибо за разьяснения, порты управляют семисторами, импульс включения симисторов ,угол открывания.
проверено в железе работает почти нормально только отваливаються 2 порта и уход по меткам не тот который мне нужен, если переменная  yark=0  то симстор не открыветься и лампочка не горит, то что мне нужно, чем больше переменная yark тем больше яркость, это все раьотает, но есть не большие огрехи.
 
Вот что еще не понятно, вы сначало выключаете подтяжки через Declare PortB_Pullups = OFF, а потом включаете, optionreg.7=1. Вы уж определитесь!

optionreg.7=1.
с описания мануала
 

бит 7: -RBPU: Включение подтягивающих резисторов на входах PORTB
1 = подтягивающие резисторы отключены
0 = подтягивающие резисторы включены
 
так что вроде вс правильно написал optionreg.7=1.
 

СПАСИБО за ответы понимание и помощь.

Сообщение отредактировал tolyan249 - Ср, 28.05.2014, 14:00
MiXaS Дата: Ср, 28.05.2014, 20:33  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Цитата tolyan249 ()
OPTION_REG.7=1       ' Включение подтягивающих резисторов на PORTB -включен
ямануал не открывал. Взял это с вашего же кода, возможно вы правы, не хочу смотреть.
Цитата tolyan249 ()
Кака я понял из вашего ,то что когда вошли в прерывание то в это время нужно отменить все прерывания, затем их включить заного при выходе из прерывания,  так или нет?

так точно!
Цитата tolyan249 ()
redim = redim + 5 так не пойдет потому что это переход на метку, а в метках переменная yark может быть любой от 0-255 ,яркость свечения лампочки.

Цитата tolyan249 ()
redim = redim + 5 так не пойдет потому что это переход на метку, а в метках переменная yark может быть любой от 0-255 ,яркость свечения лампочки.


Я посмотрел логику вашего кода и написал как упростить. Я дощел до 10 метки и мне надоело. Можно использовать что я вам посоветовал, только дороботать под значения, которые выше255.
xvovanx Дата: Чт, 29.05.2014, 09:19  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 326
Репутация: 59   ±
Замечания:   ±
На сайте с 02.05.2013

Статус: Offline

Цитата tolyan249 ()
Можно ли сбросить контроллер програмно?...

Я тут подумал, что можно сотворить и програмно-железный метод. С ножки выхода подать управление на транзистор, который "посадит на ноль" MCLR. перезапустит сам себя, так сказать, уж наверняка.

Сообщение отредактировал xvovanx - Чт, 29.05.2014, 09:19
MiXaS Дата: Чт, 29.05.2014, 09:41  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Можно и так. Я, если честно, не помню как сбрасывал програмно 16f, но 18f очень просто и работоспособно reset будет вам счастье.
tolyan249 Дата: Пт, 30.05.2014, 13:52  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 183
Репутация: 0   ±
Замечания:   ±
На сайте с 11.10.2007

Статус: Offline

Спасибо всем огромное за помомощь и советы, решил вопрос таким оьразом,добавил в прерывание вот это-
-------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------
_Sub_Start
Int_Sub_End

-------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------
и все сало работать нормально проверено в железе гонял целые сутки без отключения., нашел где то тут на сайте ,хотя не знаю что это обозначает.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Сброс контроллера
  • Страница 1 из 1
  • 1
Поиск: