Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.



Программный Reset МК

Сообщений 1 страница 3 из 3

1

Исходник

'===============================================================================
'                  Узнаём причину сброса МК
'===============================================================================
  'стр.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 * 2

  Gosub Причина_сброса_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 If

      If Причина_сброса_мк.2 = 1 Then
          Print "Reset от снижения питания"
          Причина_сброса_мк.2 = 0
          Mcusr.2 = 0
      End If

      If Причина_сброса_мк.1 = 1 Then
          Print "Reset от кнопки"
          Причина_сброса_мк.1 = 0
          Mcusr.1 = 0
      End If

      If Причина_сброса_мк.0 = 1 Then
          Print "Reset от подачи питания"
          Причина_сброса_мк.0 = 0
          Mcusr.0 = 0
      End If
'-------------------------------------------------------------------------------
  Return
'===============================================================================

0

2

Осталось только добавить какие фюзы прошивать. :)

0

3

RDW написал(а):

Осталось только добавить какие фюзы прошивать.

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

0