Доброго дня
Столкнулся с очень интересным фактом.
У меня есть 10 устройств прошитых одинаково. Микроконтроллер в них общается с исполнительным устройством по USART причем общается раз в определенный интервал. В промежутках между интервалами контроллер засыпает. Вот код:
$regfile = "M128def.dat"
$crystal = 8000000
$baud = 4800
$hwstack = 256
$swstack = 256
$framesize = 256
Dim In_bit as bit 'если 0 - входа в основной цикл не было, 1- вход был
In_bit = 0
Dim Pow_ctrl_adc As Integer 'здесь хранится значение, измеренное АЦП на аккумуляторе
Dim R_bit As Bit
R_bit = 0
Dim Timer3_schet As Integer
Timer3_schet = 0
Dim Schet As Integer
Schet = 0
Dim Schet_ee As Eram Integer
Schet = Schet_ee
Dim Analog As Integer
Analog = 0
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Config Serialin = Buffered , Size = 170 , Bytematch = All 'конфигурация com порта на перехва всех прерываний
Dim Simbol As String * 2 'сюда приходит символ
Simbol = ""
Dim Command As String * 170 'здесь формируется комманда
Command = ""
Dim Pvr_save_bit As Bit 'разрешение на сбережение энергии 0 - запрещено 1-разрешено
Pvr_save_bit = 0
Config Timer0 = Timer , Async = On , Prescale = 1024
Enable Ovf0
On Timer0 Timer_0
Start Timer0
'===============================================================================
'Тело программы////////////////////////////////////////////////////////////////
Enable Interrupts
Do
In_bit = 1 'говорим, что вошли в цикл программы
Pow_ctrl_adc = Getadc(0) 'измеряем зарядку аккумулятора
If Pvr_save_bit = 0 And Pow_ctrl_adc <= 1000 Then
Print Schet
End If
If Pow_ctrl_adc > 1000 And R_bit = 1 Then
Pvr_save_bit = 1
End If
If Pvr_save_bit = 1 Then
Stop Adc
Clear Serialin ' чистим буфер
Ucsr0b.3 = 0 'выключаем ком порт
Config Porte.1 = Input 'ногу TxD как вход, чтоб ток не тек
Powersave
End If
Loop
End
'//////////////////////////////////////////////////////////////////////////////
Timer_0:
Start Adc
Ucsr0b.3 = 1
Incr Timer3_schet
If Timer3_schet >= 800 Then
Pvr_save_bit = 0
Incr Analog
Incr Schet
Schet_ee = Schet
End If
Return
'//////////////////////////////////////////////////////////////////////////////
Serial0bytereceived: 'метка обработчика прерываний на нулевом com порту
Simbol = Waitkey() 'здесь ждем символ
If Simbol <> Chr(13) Then
Command = Command + Simbol 'формируем из символов комманду
If Len(command) >= 169 Then
Command = ""
Clear Serialin
End If
End If
If Simbol = Chr(13) Then 'если это конец посылки, то
If Command = "R" Then
R_bit = 1
End If
If Command = "N" Then
R_bit = 0
End If
Command = ""
End If
Return
'-------------------------------------------------------------------------------
Но после первого пробуждения на всех 10 устройствах происходит рестарт (In_bit становится равным 0, Analog также обнуляется). Долго ломал голову, не понял почему перезагрузка идет... дописал эту строку Stop Watchdog, вот сюда:
If Pvr_save_bit = 1 Then
Stop Adc
Clear Serialin ' чистим буфер
Ucsr0b.3 = 0 'выключаем ком порт
Config Porte.1 = Input 'ногу TxD как вход, чтоб ток не тек
Stop Watchdog
Powersave
End If
и о чудо перезагрузка прекратилась, все работает, но только на 8 из 10, остальные два не перезагружаются (In_bit равен 1) , но переменная Analog по прежнему равна 0.
У меня два вопроса к знающим людям:
1. Как влияет строка Stop Watchdog на режим сна?
2. Почему все таки сбивается переменная Analog, что не так с кодом?
Спасибо
