'===============================================================================
' Узнаём причину сброса МК
'===============================================================================
'стр.54 документации на МК
' +------ Bit 1 – EXTRF: External Reset Flag
' |+----- Bit 0 – PORF: Power-on Reset Flag
' ||
'MCUSR = &B_0000_0000 – MCU Status Register
' ||
' |+------- Bit 2 – BORF: Brown-out Reset Flag
' +-------- Bit 3 – WDRF: Watchdog System Reset Flag
Dim Причина_сброса_мк As Byte
!sts {Причина_сброса_мк} , R0 'В регистр R0 Bascom забирает значение регистра MCUSR – MCU Status Register$map ' Получаем карту распределения памяти компилятором Bascom
$regfile = "m328pdef.dat" 'Документация Atmel - http://www.atmel.com/images/Atmel-8271- … mplete.pdf
$crystal = 8000000
$framesize = 128 ' Размер области используемой и необходимой для преобразований
$hwstack = 128 ' Размер аппаратного стека
$swstack = 128 ' Размер программного стека$baud = 38400
Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
'Ucsr0a.1 = 1 ' Двойная скорость работы USART, скорость трансляции = $baud * 2Gosub Причина_сброса_atmega328p
Do
'В нужном месте программы - Gosub Reset_mk
Loop
End'===============================================================================
Reset_mk:
'-------------------------------------------------------------------------------
Config Watchdog = 32 '16; 32; 64; 128; 256; 512; 1024; 2048; 4096; 8192
Start Watchdog
Reset Watchdog
Wait 1
'-------------------------------------------------------------------------------
Return
'==============================================================================='===============================================================================
Причина_сброса_atmega328p:
'-------------------------------------------------------------------------------
' Print "&B_";
' Print Bin(причина_сброса_мк)If Причина_сброса_мк.3 = 1 Or Причина_сброса_мк = 0 Then
Print "Reset от Watchdog"
Причина_сброса_мк.7 = 1
Mcusr.3 = 0
End IfIf Причина_сброса_мк.2 = 1 Then
Print "Reset от снижения питания"
Причина_сброса_мк.2 = 0
Mcusr.2 = 0
End IfIf Причина_сброса_мк.1 = 1 Then
Print "Reset от кнопки"
Причина_сброса_мк.1 = 0
Mcusr.1 = 0
End IfIf Причина_сброса_мк.0 = 1 Then
Print "Reset от подачи питания"
Причина_сброса_мк.0 = 0
Mcusr.0 = 0
End If
'-------------------------------------------------------------------------------
Return
'===============================================================================
Программный Reset МК
Страница: 1
Сообщений 1 страница 3 из 3
Поделиться12019-05-09 06:23:12
Исходник
Поделиться22019-05-09 16:35:22
Осталось только добавить какие фюзы прошивать. 
Поделиться32019-05-11 04:06:44
RDW написал(а):
Осталось только добавить какие фюзы прошивать.
Применительно к новым версиям МК, фьюзы прошивать нет необходимости. Точнее подскажет документация на конкретный МК.
Страница: 1