Можно ли сбросить контроллер програмно? Что бы не паять схему сброса через MCLR.
нашел тут на сайте вот это
Сброс для ПИК18: Reset для 16 @goto 0 что это за собака и где это метка 0 где ее ставить? непонятно.
Вся поблема в том что переменная моя redim принимает разное значение ,хотя должна менть значения в порядке возрастания, если заремить аппаратное прерывание тогда все нормально. такое ощщущение что данные не сохраняються в регистрах после прерывания . хотя в программе это описано.
и уходит не попорядку по меткам как должно быть а хоатчно.
и нужно ли ставить это в прерывание и что это значит? Int_Sub_Start Int_Sub_End
и отваливаються 2 ноги контроллера через неопределенное время через (час два), помогает только сбросс. может тоже из за прерывания.
Спасибо.
Сообщение отредактировал
tolyan249 - Ср, 28.05.2014, 14:27
Символ собаки означает, что после него будет написана строка кода на ассемблере. цифра 0 означает переход на 0 адрес исполнения программы. Можно и на basic написать то же самое. Указать метку в начале программы, и для сброса переходить на нее.
OPTION_REG.0=0 ' Бит установки предделителя TMR0 OPTION_REG.1=0 ' Бит установки предделителя TMR0 OPTION_REG.2=0 ' Бит установки предделителя TMR0 OPTION_REG.3=0 ' Выбор включения предделителя ,предделитель выключен OPTION_REG.4=1 '1- Выбор фронта приращения TMR0 при внешнем тактовом сигнале -выключен OPTION_REG.5=0 ' Выбор тактового сигнала для TMR0-приращение таймера от внутреннего генератора -включен OPTION_REG.6=0 ' Выбор активного фронта сигнала на входе внешнего прерывания INT, PORTB.0 OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -включен
INTCON.0=0 ' Флаг внешнего прерывания по PORTB.4-PORTB.7 -выключен INTCON.1=1 '1 Флаг внешнего прерывания по PORTB.0(INT) -включен INTCON.2=1 ' Флаг переполнения TMR0 -включен INTCON.3=0 ' Бит разрешения прерывания по PORTB.4-PORTB.7 -выключен INTCON.4=1 '1 Бит разрешения прерывания по PORTB.0(INT) -включен INTCON.5=1 ' Бит разрешения прерывания по переполнению TMR0 -включен пока INTCON.6=1 ' Бит разрешения прерывания от периферийных устройств -включен INTCON.7=1 'Бит глобального разрешения прерываний -включен
TMR0=0 'считать таймер будет до 256
'просто переменные Dim i As Byte Dim k As Byte Dim l As Byte Dim m As Byte Dim n As Byte Dim o As Byte Dim p As Byte Dim r As Byte Dim s As Byte Dim colcanel As Byte Dim smax As Byte Dim smin As Byte Dim mochnost As Byte Dim colb As Byte Dim col As Byte Dim redim As Word Dim colprg As Word Dim rndm As Word Dim times As Word Dim yark As Byte
PORTA=0 PORTB=0 PORTC=0 PORTD=0 PORTE=0 clear
goto proverka
On_Interrupt GoTo te
'моргаем светодиодом для проверки proverka: PORTA.0=1 DelayMS 100 PORTA.0=0 DelayMS 100 Inc col If col>5 Then col=0 GoTo main EndIf GoTo proverka:
'Основной цикл программы где идет перебор всех программ '======================================================================================== main:
rndm=0 col=0 l=0 m=0 n=51 times=100 DelayMS 100 inc redim if redim>51 then redim=0 'Переход по меткам вместо GOTO BranchL redim, [prg1,prg2,prg3,prg4,prg5,prg6,prg7,prg8,prg9,_ prg10,prg11,prg12,prg13,prg14, prg15,prg16,prg17,prg18,prg19,prg20,prg21,prg22,prg23,prg24,_ prg25,prg26,prg27,prg28,prg29,prg30,prg31,prg32,prg33,_ prg34,prg35,prg36,prg37,prg38,prg39,prg40,prg41,prg42,prg43,prg44,prg45,prg46,prg47,prg48,prg49,prg50] GoTo main '------------------------------------------------------------------------------------------------------------------------------------------- ------------------
prg1: yark=5 delayms 500 goto main prg2: yark=10 delayms 500 goto main prg3: yark=15 delayms 500 goto main
prg4: yark=20 delayms 500 goto main prg5: yark=25 delayms 500 goto main
prg6: yark=30 delayms 500 goto main
prg7: yark=35 delayms 500 goto main prg8: yark=40 delayms 500 goto main
prg9: yark=45 delayms 500 goto main
prg10: yark=50 delayms 500 goto main
prg11: yark=55 delayms 500 goto main prg12: yark=60 delayms 500 goto main prg13: yark=65 delayms 500 goto main
prg14: yark=70 delayms 500 goto main prg15: yark=75 delayms 500 goto main
prg16: yark=80 delayms 500 goto main
prg17: yark=85 delayms 500 goto main prg18: yark=90 delayms 500 goto main
prg19: yark=95 delayms 500 goto main
prg20: yark=100 delayms 500 goto main
prg21: yark=105 delayms 500 goto main prg22: yark=110 delayms 500 goto main prg23: yark=115 delayms 500 goto main
prg24: yark=200 delayms 500 goto main prg25: yark=150 delayms 500 goto main
prg26: yark=140 delayms 500 goto main
prg27: yark=135 delayms 500 goto main prg28: yark=140 delayms 500 goto main
prg29: yark=155 delayms 500 goto main
prg30: yark=100 delayms 500 goto main
prg31: yark=111 delayms 500 goto main prg32: yark=90 delayms 500 goto main prg33: yark=74 delayms 500 goto main
prg34: yark=36 delayms 500 goto main prg35: yark=87 delayms 500 goto main
prg36: yark=91 delayms 500 goto main
prg37: yark=55 delayms 500 goto main prg38: yark=5 delayms 500 goto main
prg39: yark=234 delayms 500 goto main
prg40: yark=241 delayms 500 goto main
prg41: yark=207 delayms 500 goto main prg42: yark=100 delayms 500 goto main prg43: yark=63 delayms 500 goto main
prg44: yark=20 delayms 500 goto main prg45: yark=200 delayms 500 goto main
prg46: yark=227 delayms 500 goto main
prg47: yark=220 delayms 500 goto main prg48: yark=240 delayms 500 goto main
If INTCON.1=1 Then 'произошло прерывание по PORTB.0 If OPTION_REG.6=0 Then 'если это фронт то делать сдедующие INTCON.5=0 'запрещаем счет прерываний от таймера TMR0 s=0 TMR0=0 INTCON.5=1' разрешаем счет прерываний от таймера TMR0 EndIf
INTCON.1=0 EndIf
'переполнение таймера If INTCON.2=1 Then 'пришло прерывание от таймера TMR0-что он переполнился Inc s 'переполнение происходит каждые 256мкс-микросекунд INTCON.2=0 'считываем эти переполнения и увеличеваем переменную на 1 EndIf 'что бы знать сколько переполнений было
''----------Управление портами каналов--------------- 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
Ого! Вот это код! Сколько костылей! Можно все упростить в десятки раз. Оссобенно не понятно вот это:
Цитата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 'Бит глобального разрешения прерываний -включен
Кака я понял из вашего ,то что когда вошли в прерывание то в это время нужно отменить все прерывания, затем их включить заного при выходе из прерывания, так или нет?
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
OPTION_REG.7=1 ' Включение подтягивающих резисторов на PORTB -включен
ямануал не открывал. Взял это с вашего же кода, возможно вы правы, не хочу смотреть.
Цитатаtolyan249 ()
Кака я понял из вашего ,то что когда вошли в прерывание то в это время нужно отменить все прерывания, затем их включить заного при выходе из прерывания, так или нет?
так точно!
Цитатаtolyan249 ()
redim = redim + 5 так не пойдет потому что это переход на метку, а в метках переменная yark может быть любой от 0-255 ,яркость свечения лампочки.
Цитатаtolyan249 ()
redim = redim + 5 так не пойдет потому что это переход на метку, а в метках переменная yark может быть любой от 0-255 ,яркость свечения лампочки.
Я посмотрел логику вашего кода и написал как упростить. Я дощел до 10 метки и мне надоело. Можно использовать что я вам посоветовал, только дороботать под значения, которые выше255.
Я тут подумал, что можно сотворить и програмно-железный метод. С ножки выхода подать управление на транзистор, который "посадит на ноль" MCLR. перезапустит сам себя, так сказать, уж наверняка.
Сообщение отредактировал
xvovanx - Чт, 29.05.2014, 09:19
Спасибо всем огромное за помомощь и советы, решил вопрос таким оьразом,добавил в прерывание вот это- -------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------- _Sub_Start Int_Sub_End
-------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------- и все сало работать нормально проверено в железе гонял целые сутки без отключения., нашел где то тут на сайте ,хотя не знаю что это обозначает.