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

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

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

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


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


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

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

1

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

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

0

2

На сколько я помню, вачдог таймер используется не для прерываний, а защиты от повисания МК. Где об этом написано?

0

3

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

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

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

Как это "не работают"?

ON WDT WDT_Int

Config Watchdog = 2048
WDTCSR.WDCE = 1
....
Start Watchdog
....
WDR

Wait 50

WDT_Int:

Print "Coo Coo"

Return

Отредактировано IgorL (2014-03-13 15:50:10)

0

4

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

На сколько я помню, вачдог таймер используется не для прерываний, а защиты от повисания МК. Где об этом написано?

Новые камни имеют режим, когда вачдог не ресетит, а уходит на прерывание WDT.

0

5

нашел на форуме Баскома
попозже скину свой код

0

6

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

Новые камни имеют режим, когда вачдог не ресетит, а уходит на прерывание WDT.

Фигасе, а какие эти "Новые камни"?

Да, на немецком форуме эту тему обсуждали.

0

7

ATmega8 этот режим поддерживает? В даташите не нашел упоминания о нем.

0

8

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

Фигасе, а какие эти "Новые камни"?


Atmega48_88_168_328

Atmega164_324_644_1284

0

9

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

ATmega8 этот режим поддерживает?


Atmega8 не поддерживает

0

10

$regfile = "m168pdef.dat" 
'  //////////////
 
Config Watchdog = 2048
On Wdt Wd_isr
Wdtcsr = &B0100_0000     ' Включаем прерывание от переполнения Сторожевого таймера WDT

'  //////////////

Wd_isr:
   Incr Error_a
   Wdtcsr = &B0100_0000
Return

0

11

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

$regfile = "m168pdef.dat" 
'  //////////////
 
Config Watchdog = 2048
On Wdt Wd_isr
Wdtcsr = &B0100_0000     ' Включаем прерывание от переполнения Сторожевого таймера WDT

'  //////////////

Wd_isr:
   Incr Error_a
   Wdtcsr = &B0100_0000
Return


В железе проверяли?

0

12

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

ON WDT WDT_Int

Config Watchdog = 2048
WDTCSR.WDCE = 1
....
Start Watchdog
....
WDR

Wait 50

WDT_Int:

Print "Coo Coo"

Return

Аналогичный вопрос: в железе проверяли???

0

13

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

Аналогичный вопрос: в железе проверяли???

Кусок из рабочего кода на tiny85. Набирал правда по памяти, но должно работать. Код, кстати, одинаковый.

0

14

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

Кусок из рабочего кода на tiny85. Набирал правда по памяти, но должно работать. Код, кстати, одинаковый.


Atmega48_88_168_328_644_1284  -  не работает ни один из приведённых вариантов включая вариант по ссылке?

0

15

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

Atmega48_88_168_328_644_1284  -  не работает ни один из приведённых вариантов включая вариант по ссылке?

Так не бывает :) Задержка точно установлена? Wait 50 есть?
А, да надо же еще прерывания разрешить.

Отредактировано IgorL (2014-03-13 19:03:45)

0

16

Заработал такой вариант, проверил на Atmega48_88_168_328_644_1284:

Исходник

'  $regfile = "m48def.dat"
'  $regfile = "m88def.dat"
'  $regfile = "m168pdef.dat"
'  $regfile = "m328pdef.dat"
'  $regfile = "m644pdef.dat"
  $regfile = "m1284pdef.dat"

  $crystal = 1000000
  $framesize = 32
  $hwstack = 40
  $swstack = 16

  $baud = 4800
  Ucsr0a.1 = 1

  Config Watchdog = 128
  On Wdt Обработка_прерывания_watchdog

  Enable Wdt
  Start Watchdog
  Enable Interrupts

  Главный_цикл:

   Powerdown
  Goto Главный_цикл
End

  Обработка_прерывания_watchdog:
    Print "Проверка"
    Print
  Return

Вместо "Powerdown", можно использовать любой энергосберегающий режим!

Не забудьте про фьюзы!!!

http://s8.uploads.ru/t/4R5fM.jpg

Отредактировано sasha_1973 (2014-03-13 19:12:20)

0

17

Не важно насчет режима энергосбережения. Можно просто зациклить и будет срабатывать Print каждую секунду (при Config Watchdog = 128). Что бы не срабатывало прерывание надо перед кусками кода, выполняющимися скеунду и дольше  вставлять WDR
Но таймер этот плывет от температуры!

Отредактировано IgorL (2014-03-13 19:18:42)

0

18

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

Правильнее так:
WDTCSR.WDIE = 1

В принципе BasCom сам разбирается и видя On WDR на команду Start Watchdog включает нужный битик для данного типа камня. Так что беззаботнее будет Start Watchdog :)

0

19

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

Но таймер этот плывет от температуры!


Пускай себе плавает, для опроса чего нибудь, а потом в спячку - самое то!!!

Потребление мизерное и работа делается!

0

20

я работаю только в железе и никогда не пользуюсь Протеусом, у меня его даже нет
я старой закалки :)

0

21

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

я работаю только в железе и никогда не пользуюсь Протеусом, у меня его даже нет
я старой закалки

О Протеусе небыло ни слова.

0

22

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

Пускай себе плавает, для опроса чего нибудь, а потом в спячку - самое то!!!

Потребление мизерное и работа делается!

Подобный код хорош для опроса не сдохла ли батарейка, причем устанавливается максимальная выдержка и в прерывании стоит короткий инкремент с проверкой на нуль, что бы как можно реже включать жрущий АЦП.
В прочих применениях лично я предпочитаю один из таймеров, а собачка либо на ресет либо на выход из склонных к зависанию кусков кода, типа как у  Александр Д. в опросе датчиков.

0

23

Кстати, может кому пригодится код для определения причины нештатного ресета:

Код:
Dim V_MCUSR as Byte
$asm
Sts {V_MCUSR} , R0
$end asm

If V_MCUSR.WDRF = 1 then Call ...
If V_MCUSR.BORF = 1 then Call ...

Позволяет понять отчего камень перегрузился. Собака или просадки питания...

0

24

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

Кстати, может кому пригодится код для определения причины нештатного ресета:

Ещё вариант

If Mcusr.3 = 1 Then
          Print "Reset от Watchdog"
          Mcusr.3 = 0
          Waitms 50
      End If

      If Mcusr.2 = 1 Then
          Print "Reset от снижения питания"
          Mcusr.2 = 0
          Waitms 50
      End If

      If Mcusr.1 = 1 Then
          Print "Reset от кнопки"
          Mcusr.1 = 0
          Waitms 50
      End If

      If Mcusr.0 = 1 Then
          Print "Reset от подачи питания"
          Mcusr.0 = 0
          Waitms 50
      End If

0

25

Что бы работал WDT на прерывание, не стоит его включать его на сброс, и будет вам счастье.
Короче, не пишите Start Watchdog. Ну а прерывание, конечно включайте .
Постоянно юзаю этот режим.

0

26

Кстати, легко проверить в протеусе, в пошаговом режиме, наблюдая за регистрами. При команде Start Watchdog, регистр переключается на сброс.

0

27

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

Ещё вариант

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

Цитата ранее написанного

у Bascoma здесь есть аккуратненькие такие грабельки ввиде скрытой инициализации, которую он пихает вначало кода. В этой самой инициализации он не только обнуляет ОЗУ но сбрасывает битики у этого регистра, поэтому на некоторых камнях типа Tiny44 этот код будет всегда говорить, что нормально типа все стартануло. Сторожевой таймер точно не ловит. На камнях типа Tint26 все работает, там эти биты программно не сбрасываются. Посмотрев ассемблерный код иницализации, видно, что перед тем как сбросить битики у регистра  MCUSR bascom исходное значение сохраняет в регистре R0
Поэтому надо или писать команду $NORAMCLEAR или в самом начале своего кода написать:
Dim V_MCUSR as Byte
$asm
Sts {V_MCUSR} , R0
$end asm
и там где нужно
If V_MCUSR.wdrf = 1 then ...
Такие вот яйца пасхальные... :(

+1

28

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

Кстати, легко проверить в протеусе, в пошаговом режиме, наблюдая за регистрами. При команде Start Watchdog, регистр переключается на сброс.

Какя версия бейсика и какой МК?

0

29

2.0.7.1
Юзаю на 48р

0

30

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

у Bascoma здесь есть аккуратненькие такие грабельки ввиде скрытой инициализации, которую он пихает вначало кода. В этой самой инициализации он не только обнуляет ОЗУ но сбрасывает битики у этого регистра, поэтому на некоторых камнях типа Tiny44 этот код будет всегда говорить, что нормально типа все стартануло. Сторожевой таймер точно не ловит. На камнях типа Tint26 все работает, там эти биты программно не сбрасываются. Посмотрев ассемблерный код иницализации, видно, что перед тем как сбросить битики у регистра  MCUSR bascom исходное значение сохраняет в регистре R0
Поэтому надо или писать команду $NORAMCLEAR или в самом начале своего кода написать:

СПАСИБО IgorL!

Вот блин зараза!!!

007C 95A8     WDR
007E B784     IN   R24, $34
0080 2E08     MOV  R0, R24
0082 7F87     ANDI R24, $F7
0084 BF84     OUT  $34, R24
0086 E188     LDI  R24, $18
0088 2799     EOR  R25, R25
008A 9380     STS  $0060, R24
008E 9390     STS  $0060, R25
0092 E08C     LDI  R24, $0C
0094 9380     STS  $00C4, R24
0098 E080     LDI  R24, $00
009A 9380     STS  $00C5, R24
009E E188     LDI  R24, $18
00A0 9380     STS  $00C1, R24
00A4 2466     EOR  R6, R6
                $noramclear
                $regfile = "m328pdef.dat"
                $crystal = 1000000
                $framesize = 32
                $hwstack = 40
                $swstack = 16

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

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

Отредактировано sasha_1973 (2014-03-14 07:37:38)

0


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