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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » atmega168 и прерывание от WD


atmega168 и прерывание от WD

Сообщений 31 страница 52 из 52

31

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

Этот вариант будет работать не на всех камнях.

Вот строчки где происходит сброс

007E B784     IN   R24, $34
0080 2E08     MOV  R0, R24
0082 7F87     ANDI R24, $F7   '  $F7=&B1111 0 111  -  Bit 3 – WDRF: Watchdog System Reset Flag
0084 BF84     OUT  $34, R24

Отрабатывается всё, кроме Watchdog  -  проверено на Atmega48P_88P_168P_328P

Bascom 2.0.7.1

Отредактировано sasha_1973 (2014-03-14 08:44:54)

0

32

почитайте хелп, там же указано, что затирается бит wd и почему

0

33

Александр Д. написал(а):

почитайте хелп, там же указано, что затирается бит wd и почему

А ссылочку можно?

0

34

СПАСИБО за подсказку пользователю форума, ник IgorL!

Проверено Atmega48P_88P_168P_328P

Bascom 2.0.7.1; Bascom 2.0.7.7

Рабочий вариант

'*  Для корректного отображения, используйте в Bascom шрифт: Consolas; размер = 14

  $map              ' Получаем карту распределения памяти компилятором Bascom
'  $regfile = "m48pdef.dat"       ' Используемый контроллер
'  $regfile = "m88pdef.dat"       ' Используемый контроллер
'  $regfile = "m168pdef.dat"       ' Используемый контроллер
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц
'  $crystal = 7372800       ' 7,3728 МГц, кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма
  $framesize = 32   'размер области используемой и необходимой для преобразований
  $hwstack = 40     ' Размер аппаратного стека
  $swstack = 16     ' Размер программного стека

'--------------------------  Настройка USART  ----------------------------------

  $baud = 4800      '4800     '19200     '38400     '57600     '76800     '115200    '230400
  Ucsr0a.1 = 1      ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'-----------------------  Узнаём причину сброса МК  ----------------------------

  Dim Причина_сброса_мк As Byte

  !sts {Причина_сброса_мк} , R0

' Mcusr = &B00000000       ' Регистр флагов, причина сброса МК
'           ||||||||
'           |||||||+- 0 - PORF - включение питания
'           ||||||+-- 1 - EXTRF - внешний сброс
'           |||||+--- 2 - BORF - снижение питания
'           ||||+---- 3 - WDRF - Watchdog
'           |||+----- 4 - Зарезервировано производителем
'           ||+------ 5 - Зарезервировано производителем
'           |+------- 6 - Зарезервировано производителем
'           +-------- 7 - Зарезервировано производителем
' Примечание:

'-----------------------  Узнаём причину сброса МК  ----------------------------

  Config Watchdog = 4096       ' 16   32   64   128   256   512   1024   2048   4096   8192
  On Wdt Обработка_прерывания_watchdog

'--------------  Разрешаем работу необходимых прерываний  ----------------------
'  Enable Wdt
  Start Watchdog
'------------  Разрешаем работу всех включенных прерываний  --------------------
'  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
'===============================================================================
  Главный_цикл:

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

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

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

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

      Wait 1
'Idle
'   Powerdown
  Goto Главный_цикл
End
'===============================================================================
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Обработка_прерывания_watchdog:
'-------------------------------------------------------------------------------
    Print "Прерывание от Watchdog"
    Waitms 50
'-------------------------------------------------------------------------------
  Return
'===============================================================================

http://s9.uploads.ru/t/9jYrc.jpg

Отредактировано sasha_1973 (2014-03-14 08:46:42)

0

35

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

А ссылочку можно?

F1 и ввести config watchdog :)
вам ли задавать такие вопросы, Александр!

Most new AVR chips have an MCUSR register that contains some flags. One of the flags is the WDRF bit. This bit is set when the chip was reset by a Watchdog overflow. The CONFIG WATCHDOG will clear this bit, providing that the register and bit is available in the micro.

When it is important to examine at startup if the micro was reset by a Watchdog overflow, you need to examine this MCUSR.WDRF flag before you use CONFIG WATCHDOG, since that will clear the flag.

For chips that have an enhanced WD timer, the WD timer is cleared as part of the chip initialize procedure. This because otherwise  the WD timer will only work once. If it is important that you know the cause of the reset, you can read the register R0 before you run other code.

When the chip resets, the status registers with the reset cause bits is saved into register R0.

This is done because the compiler need to reset these flags since otherwise they can not occur again. And before clearing the bits, the status is saved into register R0.

Using the GETREG() function, you can read the cause if there is a need to do so.

The sample below demonstrates how to store the WDRF bit if you need it, and print it later.

0

36

Александр Д. написал(а):

вам ли задавать такие вопросы, Александр!

Санька, а поприкаловаться!!!

Свободный перевод из справки Bascoma:

Большинство новых AVR чипов имеют MCUSR регистр, который содержит флаги показывающие причину сброса МК.

Mcusr = &B00000000       ' Регистр флагов, причина сброса МК
                 ||||||||
                 |||||||+- 0 - PORF - включение питания
                 ||||||+-- 1 - EXTRF - внешний сброс
                 |||||+--- 2 - BORF - снижение питания
                 ||||+---- 3 - WDRF - Watchdog
                 |||+----- 4 - Зарезервировано производителем
                 ||+------ 5 - Зарезервировано производителем
                 |+------- 6 - Зарезервировано производителем
                 +-------- 7 - Зарезервировано производителем

Один из флагов является WDRF (сброс от переполнения таймера Watchdog).
CONFIG WATCHDOG  -  будет сбрасывать этот бит, при условии, что регистр доступен в используемом МК.
Когда важно изучить при запуске, если МК был сброшен от переполнения сторожевого таймера, необходимо прочитать флаг MCUSR.WDRF, прежде чем использовать CONFIG WATCHDOG!

+1

37

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

2.0.7.1
Юзаю на 48р

Да, действительно с какой то версии фишка с установкой WDIE в единицу командой Start Watchdog пропала. То то у меня как то попытка загнать ардуину на 328Р в Power down и будить "собачьим таймером" не получилось, ресет по WDR не сбрасывает и не отключает вачдог, а при ресете Arduno запускает загрузчик и  так по кругу.

Код:
                Start Watchdog
005A 9180     LDS  R24, $0060
005E 6088     ORI  R24, $08
0060 9380     STS  $0060, R24

0

38

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

СПАСИБО IgorL!

$noramclear  -  не помогает, данные затираются раньше!!!

Поэтому, остаётся только читать R0!!!

Отредактировано sasha_1973 (Сегодня 08:37:38)


Теме довольно много лет уже, я сейчас не помню было это в хелпе или нет, но что повозился в листинге порядком это помню хорошо. Есть еще $NOINIT она вроде сейчас не затирает, но надежнее именно

This because otherwise  the WD timer will only work once. If it is important that you know the cause of the reset, you can read the register R0 before you run other code.

вы можете прочитать регистр R0, прежде чем запускать другой код

0

39

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

Этот вариант будет работать не на всех камнях.

Может это поможет. http://avrhelp.mcselec.com/_initmicro.htm

0

40

Пётр написал(а):

Может это поможет. http://avrhelp.mcselec.com/_initmicro.htm

Ну так программирование это как и шахматы, гугол вариантов ведущих к победе. :) Код, что я приводил рабочий и работает до сих пор. Но да, я сталкивался не раз, что код хитрый код, отлично работавший раньше в предыдущих версиях в новых работает не так. Все же Bascom довольно сложный компилятор, а тестеров под него не так и много.

0

41

Александр Д. написал(а):

приветствую всех
вчитался в даташит на этот МК, понравилась возможность вызова прерывания от сторожевого таймера
но как это сделать средствами Bascom?
никакие команды как с обычными прерываниями не работают, нельзя сделать Config WDT или On WDT wdt_int

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

Если не секрет, для какого проекта? или ради интереса?

0

42

фрилансер я, где что нашел - на том и живу

0

43

Да я в смысле, для чего использовать прерывание от собаки? Я в одно время пришёл к тому, что использовать часовой кварц и софтовые часы удобней. Повердаун с включённой сабакой и поверсэйв кушают одинаково в спячке, а временной интервал удобней контролировать.

0

44

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

...Повердаун с включённой сабакой и поверсэйв кушают одинаково в спячке....

Откуда такая информация?

0

45

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

Повердаун с включённой сабакой и поверсэйв кушают одинаково в спячке


Atmega48P_88P_168P_328P

Power Consumption at 1MHz, 1.8V, 25C
– Active Mode: 0.2mA
– Power-down Mode: 0.1µA
– Power-save Mode: 0.75µA (Including 32kHz RTC)

0

46

Из практики.
Да ещё из логики. sasha_1973, может найдёте в ДШ информацию о потреблении собаки?, а то Ваш кусок из ДШ не коректен. Там приведён ток потребления чистого Power-down Mode
По логике,- Power-save Mode отличается от  Power-down Mode, тем что в последнем МК просыпается от асинхронного таймера, остальное всё тоже самое. Включите ту же собаку и получите аналог Power-save Mode

0

47

Измерение потребления МК -  B7-35 (после ЦЛИТа, спец. настройка и калибровка)

Минимальное потребление в режеме PowerSave при запущенном TIMER2 в асинхронном режиме (часы с внешним кварцем)  -  ~1.1 мкА

WATCHDOG  -  потребляет ~5,2 мкА

BodLevel (Контроль питания)  -  ~60 мкА

Запущенный АЦП  -  ~1.45 mА

Исходник

'===============================================================================
  $map       ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m328pdef.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 1 МГц    , кварц для стабильной работы USART во всём диапазоне скоростей передачи и приёма
  $framesize = 32       'размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

  Config Portb = Output : Reset Portb

  Dim Val_byte As Byte

'===============================================================================
'                  Узнаём причину сброса МК
'===============================================================================
  Dim Причина_сброса_мк As Byte
  Dim Регистр_причины_сброса As Byte

  !sts {Регистр_причины_сброса} , R0
  Причина_сброса_мк = Регистр_причины_сброса

'===============================================================================
'Всё включено ~ 2 mA

'~ 1.47 mA
'  Didr0.adc0d = 1
'  Didr0.adc1d = 1
'  Didr0.adc2d = 1
'  Didr0.adc3d = 1
'  Didr0.adc4d = 1
'  Didr0.adc5d = 1

'  Didr1.ain0d = 1
'  Didr1.ain1d = 1

'~ 930 мкA
  Ddrb = &B_1111_1111 : Portb = &B_0000_0000
  Ddrc = &B_1111_1111 : Portc = &B_0000_0000
  Ddrd = &B_1111_1111 : Portd = &B_0000_0000

'===============================================================================
'               Конфигурация питания аппаратных модулей МК
'===============================================================================
' PRR – Регистр управления питанием аппаратных средств МК
' Начальное значение регистра PRR = &B00000000       ' Регистр управления питанием аппаратных средств МК

'~ 860 мкА
  Prr = &B_1011_1110
'         |||| ||||
'         |||| |||+--- 0 - PRADC    - если 1, то модуль ADC (АЦП) выключен
'         |||| ||+---- 1 - PRUSART0 - если 1, то модуль USART выключен
'         |||| |+----- 2 - PRSPI    - если 1, то модуль SPI выключен
'         |||| +------ 3 - PRTIM1   - если 1, то Timer1/Counter1 выключен
'         |||+-------- 4 - PRUSART1 - если 1, то модуль USART1 выключен
'         ||+--------- 5 - PRTIM0   - если 1, то Timer0/Counter0 выключен
'         |+---------- 6 - PRTIM2   - если 1, то Timer2/Counter2 выключен
'         +----------- 7 - PRTWI    - если 1, то модуль TWI (I2c) выключен, после включени обязательна повторная инициализация
' Примечание:

'===============================================================================
'            Конфигурация TIMER2, пробуждение и временные интервалы
'==============================================================================
  Config Timer2 = Timer , Async = On , Prescale = 1024       ' Делитель 32768 / 128 / 256 = 1 сек (прерывание TIMER2 = 1 раз в секунду)
  'Const Количество_срабатываний_timer2 = 1       ' Значение константы используется в подпрограмме "Обработка_прерывания_timer2"
'Ссылка на подпрограмму обработчика прерывания TIMER2, для работы часов
  On Timer2 Обработка_прерывания_timer2 Nosave       ' Ссылка на подпрограмму обработчика прерывания TIMER2
  Dim Флаг_есть_прерывание_timer2 As Byte
  Stop Timer2
  Timer2 = 0

'---------------  Настройка пониженного энергопотребления МК  ------------------
  Assr.3 = 1 : Waitms 50       ' Включить НЧ-генератор AS2 и подождать стабилизации амплитуды генератора
'При включении  бита AS2 (3) в регистре ASSR (ASSR.3), становится возможным применение режима
'"Powersave" - разновидность спящего режима. Пробуждение МК от TIMER2

'===============================================================================
'                      Конфигурация USART
'===============================================================================
  $baud = 38400       '19200     '38400     '57600     '76800     '115200    '230400

  Config Com1 = Baud , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
  Ucsr0a.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

  On Utxc Передача_по_usart_закончена Nosave
  Dim Флаг_можно_поспать As Byte

  Gosub Причина_сброса_atmega328p

'===============================================================================
'                      Н А С Т Р О Й К А     АЦП
'===============================================================================
  Dim Флаг_данные_ацп As Byte

  Dim Данные_ацп_мк_word As Word       ': Данные_ацп_мк_word = 0
  Dim Данные_ацп_мк_single As Single       ' : Данные_ацп_мк_single = 0
  Dim Данные_ацп_мк_str As String * 10       ' : Данные_ацп_мк_str = "-.-"
'  Dim Уровень_батареи_str As String * 1       ' : Уровень_батареи_str = "0"

'Значение константы * 3 такта. Время ожидания стабилизации внутреннего источники опорного напряжения 1.1V
'http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf
'стр.305
'Table 29-11
'Bandgap reference start-up time
'1,08545 V - расчётное значение опорного напряжения тестового МК Atmega328P
  Const Const_ожидание_готовности_1_1v = 45       'Значение * 3 такта. Время ожидания стабилизации внутреннего источники опорного напряжения 1.1V
'Зависит от конкретного экземпляра МК, температуры и напряжения питания, чем больше Uпит, тем дольше надо ждать, пока внутренний источник опорного напряжения выйдет на рабочий уровень

  Const Const_коэффициент_перещета_1_1v = 1111.5       'Зависит от конкретного экземпляра МК, т.к., согласно документации 1...1.2V

'Ссылка на обработчик прерывания АЦП
  On Adc Опрос_ацп Nosave

  'Config Aci = Off , Compare = Off , Trigger = Toggle
  Acsr = &B_1000_0001

'Config Adc = Single , Prescaler = 2 , Reference = Avcc , (ADC14)
  Admux = &B_0100_1110
  Adcsra = &B_1100_0001
  Adcsrb = &B_0000_0000

'Ждём первого измерения, чтобы исключить неверные значения
Ждем_измерение:
  !lds R16 , ADCSRA
'Ждём флага готового измерения АЦП (Bit 4 – ADIF: ADC Interrupt Flag)
  !SBRs R16 , ADIF
  !rjmp Ждем_измерение
  !lds R17 , adcl
  !lds R17 , adch
  !andi R16 , &B_0000_0111
  !sts ADCSRA , R16

'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Adc       ' : Adcsra.adif = 0
  Enable Timer2       'Tifr2 = &B_0000_0000 :
  Start Timer2
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts
'===============================================================================
'                   Г Л А В Н Ы Й         Ц И К Л
  Главный_цикл:
'===============================================================================

      If Флаг_есть_прерывание_timer2 > 0 Then

         'Замеряем собственное напряжение питания МК
         'Включаем АЦП
          Adcsra.aden = 1       ' Включаем АЦП

         'Waitus 121       ' граница 121 при Uпит = 4.1V
          !ldi R16 , Const_Ожидание_готовности_1_1V
         Пауза_125_циклов:
          !dec R16
          !brne Пауза_125_циклов

         'ADC Noise Reduction
          !ldi R16 , &B_0000_0011       ' ADC Noise Reduction
          !sts smcr , R16
          !sleep

         'Выключаем АЦП
          Adcsra.aden = 0       ' Выключаем АЦП

         'Занимаемся расчётами и отображением значений на LCD TIC-5234
          'Config Single = Scientific , Digits = 3
          'Данные_ацп_мк_single = Данные_ацп_мк_word * 0.00106       'Const_коэффициент_перещета_1_1v / Данные_ацп_мк_word       ' U пит. = 1024 * 1.1 / ADC
          Данные_ацп_мк_single = Const_коэффициент_перещета_1_1v / Данные_ацп_мк_word
          'Данные_ацп_мк_str = Str(данные_ацп_мк_single)
          Данные_ацп_мк_str = Fusing(данные_ацп_мк_single , "&.&&&")
          Данные_ацп_мк_str = Format(данные_ацп_мк_str , "     0")

          Print Данные_ацп_мк_str

          Val_byte = Rnd(63)
          Portb = Val_byte

          Флаг_есть_прерывание_timer2 = 0
          Goto Главный_цикл
      End If

    Power Powersave

'===============================================================================
  Goto Главный_цикл
' End
'                        П О Д П Р О Г Р А М М Ы
'===============================================================================

'===============================================================================
  Опрос_ацп:
'-------------------------------------------------------------------------------
    !push R16
    !lds R16 , adcl
    !sts {Данные_ацп_мк_word} , R16
    !lds R16 , adch
    !sts {Данные_ацп_мк_word + 1} , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
' Подпрограмма обработки прерывания TIMER2, происходит 1 или 2 раза в секунду, в зависимости от настроек TIMER2
'===============================================================================
  Обработка_прерывания_timer2:
'-------------------------------------------------------------------------------
    !push R16
    !ldi R16 , 1
    !sts {Флаг_есть_прерывание_timer2} , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Причина_сброса_atmega328p:
'-------------------------------------------------------------------------------
    If Причина_сброса_мк.3 = 1 Then
        Print "Reset от Watchdog"
        Причина_сброса_мк.3 = 0
        Mcusr.3 = 0
        Waitms 5
    End If

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

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

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

'===============================================================================
  Передача_по_usart_закончена:
'-------------------------------------------------------------------------------
    !push R16
    !ldi R16 , 1
'    !sts {Флаг_можно_поспать} , R16
    !pop R16
    !reti
'-------------------------------------------------------------------------------
  Return
'===============================================================================

Отредактировано sasha_1973 (2015-06-27 13:32:44)

+1

48

Привет! При падении температуры ниже -5 перестал стартовать микроконтроллер, решил включить WDTON но возникла другая проблема, не срабатывает прерывание по WDT, несмотря на то что в коде есть обработка прерывания он все равно сразу уходит в сброс. Пример -

код

$regfile = "m328pdef.dat"
  $crystal = 16000000
  $framesize = 32                                           ' Ðàçìåð îáëàñòè èñïîëüçóåìîé è íåîáõîäèìîé äëÿ ïðåîáðàçîâàíèé
  $hwstack = 40                                             ' Ðàçìåð àïïàðàòíîãî ñòåêà
  $swstack = 16                                             ' Ðàçìåð ïðîãðàììíîãî ñòåêà

  Enable Interrupts
Config Watchdog = 8192                                      'Watchdog auf Resetmodus mit 8sek Zeit einstellen
Wdtcsr.wdie = 1                                             'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgefuhrt wird und kein Reset
Start Watchdog
On Wdt Isr_wdt

Dim A As Byte

  $baud = 19200

  Config Portd.5 = Output                                   'âûõîä äëÿ ïîäêëþ÷åíèÿ íîãè moden_off
Modem_off Alias Portd.5
Modem_off = 1

Print "start"

  Do
  Incr A
  Print A

Wait 10
Loop

Isr_wdt:
    Reset Watchdog
     Wdtcsr.wdie = 1
    Print "wathdog"
Return

По даташиту вроде должна обработка прерывания праводится так же как и при программном включение - может есть какие идеи?

Отредактировано mvn77 (2015-12-19 22:37:49)

0

49

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

решил включить WDTON но возникла другая проблема

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

При падении температуры ниже -5 перестал стартовать микроконтроллер


Китайский вариант Atmega


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

решил включить WDTON но возникла другая проблема, не срабатывает прерывание по WDT


Документация Atmega328P

WDTON - более приоритетный (стр. 55; Table 11-1. Watchdog Timer Configuration)

Отредактировано sasha_1973 (2015-12-20 06:49:01)

0

50

Привет ! Да уже разобрался - проблема в том что надо вводить настройки, и на input естественно происходит сброс. В общем из даташита я так понял WDTON, работает только на сброс. Поэтому пришлось идти извранченчиским путем и реализовывать прерывание по таймеру, и каждые несколько секунд инициировать сброс wathdog.

пример кода

$regfile = "m328pdef.dat"
  $crystal = 16000000
  $framesize = 32                                           ' Ðàçìåð îáëàñòè èñïîëüçóåìîé è íåîáõîäèìîé äëÿ ïðåîáðàçîâàíèé
  $hwstack = 40                                             ' Ðàçìåð àïïàðàòíîãî ñòåêà
  $swstack = 16                                             ' Ðàçìåð ïðîãðàììíîãî ñòåêà

Const 100us = 64536
   Config Timer1 = Timer , Prescale = 8
   Timer1 = 100us
    Dim Flag1 As Bit
   'Then the usuals
   On Timer1 Timer_1_int
   Enable Timer1
   Enable interrupts
   Dim Tcount1 As Word

Config Watchdog = 8192                                      'Watchdog auf Resetmodus mit 8sek Zeit einstellen
                                           'WDIE Bit auf 1 setzen, damit beim WDT-Timeout ein Interrupt ausgefuhrt wird und kein Reset

Dim A As Byte

  $baud = 19200

  Config Portd.5 = Output                                   'âûõîä äëÿ ïîäêëþ÷åíèÿ íîãè moden_off
Modem_off Alias Portd.5
Modem_off = 1

Print "start"

  Do
   Input "input byte" , A
    Print A
Wait 2
Loop

Timer_1_int:
Timer1 = 100us
Incr Tcount1
If Tcount1 >= 10000 Then
      Tcount1 = 0
        Reset Watchdog
   End if
Return

0

51

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

Привет! При падении температуры ниже -5 перестал стартовать микроконтроллер

У меня на улице две атмеги работают. Не, даже три, одна в гараже. 48р, 32, (куплены в нашем интернет магазине), и 328 - ардуина из Китая. 48р- конкретно градусник, в связке с  nRF24l01 и батарея ср2032.
максимум (точнее минимум) -25С. Ни каких проблем ни когда не возникало.

Видимо Вам очень повезло!.

0

52

Кто знает, может не стартует не из-за МК, а из-за кварца, кстати он на 16 МГц - максимум для МК. Может еще и напряжение меньше 5 вольт...
Интересно чем поможет прерывание от собаки если МК не стартанул?

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » atmega168 и прерывание от WD