Страница 1 из 1

WatchDog Timer Attiny13. на коде Bascom не просыпается по WD

Добавлено: Чт апр 17, 2014 20:15:00
123ksn
Написал проектик на Bascom для ATtiny13. Питание от батарейки CR2032, т.е. от 3-х вольт. Поэтому МК должен подолгу (1-2 часа) спать(да, я знаю, что только несколько секунд). Проснувшись, сделать измерения, отправить потребителю и опять уснуть. Программу написал, но обнаружилась очень неприятная особенность Bascom - неправильно компилирует программу. Конкретнее: по даташиту на ATtiny13 он может просыпаться (пробуждаться) по WatchDog Timer(сторожевому псу) не только путем RESET'a МК, но и вызывая прерывание. Как бы такая функциональность в Bascom реализована, но реально, МК уснув, не просыпается. Пробовал компилировать в разных версиях Bascom (2.0.5.0, 2.0.7.1, 2.0.7.5) -без разницы. (2.0.7.7 у разработчика на сайте в демо нет. ) Вот здесь http://bascomavr.3bb.ru/viewtopic.php?id=1170&p=2 мужики, вроде, проблему для Atmega48,88,168,328 обнаружили, но они общаются на профессиональном языке, который я не могу "проглотить" и использовать для решения проблемы относительно ATtiny13. Теперь вопросы:
1)Может быть в ранних версиях Bascom'a компилировался правильный код (относительно прерывания от WDT)?
2)Если обозначенная мной проблема у всех версий Bascom'a, то может быть кто подскажет, ЧТО надо изменить в ассемблерном или hex коде и КАК, что бы вызывалось прерывание по WDT у ATtiny13?

Исходник, пожалуйста, не критикуйте. Я его как уже только не менял. Поэтому сейчас несколько сумбурный.

Просьба. Если у Вас "кажется есть ответ", но на железе не проверено - ничего не пишите. Я уже запробовался всяких вариантов, что видно по моему исходнику.
Спасибо, что прочитали.
Спойлер

Код: Выделить всё

'http://cxem.net/mc/mc179.php
'1)Проснулся раз в, например, пол часа
'2)?Измерил напряжение на батарейке (свое питание)
'3)Выставил пачку импульсов, например 1000, для датчика влажности
'4)Измерил напряжение на датчике влажности земли
'5)
'6)Определил день/ночь
'7)Отправил свой номер,напряжение питания, напряжение с датчика влажности
'8)Если ночь и малая влажность - подал импульс на одновибратор для включения полива
'9)Уснул

'************************-1-******************************************
'The HW stack, SW stack and frame space may not exceed the chip memory
' http://bascomavr.3bb.ru/viewtopic.php?id=745
'************************-2-******************************************
'EQU not found, probably using functions that are not supported by the selected chip [UBRR]
'EQU not found, probably using functions that are not supported by the selected chip [UCR]
'где-то в программе используются операторы ($baud,Print,...) для аппаратного UARTa, а его нет
'******************************************************************
'За работу со спящими режимами отвечает регистр MCUCR.
'Bits 1, 0 – ISC01, ISC00: Interrupt Sense Control 0 Bit 1 and Bit 0
' Bit 5 – SE: Sleep Enable
'Bits 4, 3 – SM1..0: Sleep Mode Select Bits 2..0
'Bit 6 – PUD: Pull-up Disable
'Bits 7, 2– Res: Reserved Bits
'SM1=1, SM0=0 Power-down

'one 8-bit Timer/Counter
'Interrupt Vectors  0x0008 WDT Watchdog Time-out

$regfile = "attiny13a.dat"
$crystal = 1200000                      '!!!CK8DIV Частота здесь должна совпадать с реальной, выставленной фьюз-битами.
$hwstack = 8
$swstack = 16
$framesize = 16

'Если эти параметры заполнены 0, то команда  Print #1 не отправляет переменные, отправляются только константы
'$hwstack = 0
'$swstack = 0
'$framesize = 0



' Скорость UART
'$baud = 4800 'Так Нельзя , Так Как Нет Аппаратного Uarta

'Чтобы в BASCOM-AVR реализовать программный UART нужно, сначала сконфигурировать порты ввода\вывода на передачу TXD:
'Open " порт : скорость , биты , чётность , стоп биты " For Output As #1
' И на приём RXD:
'Open " порт : скорость , биты , чётность , стоп биты " For Input As #2
 Open "comb.2:4800,8,n,1" For Output As #1       'выв7
 'Print #1 , "Program UART for AVR microcontroller Attiny13"

'Настройка АЦП:Auto-автоматич подбор частоты дискретизации, Reference- опорное напряжение
'Single - единичное считывание, также может быть Free (режим постоянной работы преобразователя)
'Prescaler = - выбираем частоту дискретизации путем деления частоты кварца на определенное
'число (также может быть 2,4,8,16,32,64 или Auto). Если выбрать Auto, то компилятор сам выберет подходящую частоту работы АЦП
'Reference – выбор источника опорного напряжения, у этого параметра может быть несколько значений:
'Aref – внешний источник, Avcc – напряжение питания схемы, Internal – внутренний
'ИОН на 2,56 вольт или в некоторых микроконтроллерах 1,1 (ATtiny13)вольт.
'Config Adc = Single , Prescaler = Auto , Reference = Internal
'Start Adc                               'запустили в работу АЦП
'этой командой на преобразователь поступает питание
'работу преобразователя также можно остановить в любой момент
'Stop Adc
'!!!АЦП измеряет напряжение (0-1023) на входе только в пределах от нуля до значения ИОН.
'реальное напряжение вычисляем по из пропорции 1023=ИОН(2.56 или 1.1) Uреальн=ИОН/1023*Измер.Число

'переменные
Dim Uak As Word                         'Напряж Аккумулятора надо бы Word, т.к. АЦП 10бит
Dim Usensor As Word                     'напряжение на конденсаторе сенсора влажности
Dim Ufoto As Word                       'напряжение на фотодатчике
Dim A As Byte                           'сигнал для зарядки конденсатора сенсора влажности
Dim I As Byte

' Config Watchdog = 64                 '2,4,8,16,32,64,128,256,512,1024
' Enable Wdt
'On Wdt Watchdogint
'должны быть правильно выставлены фьюзы!!!

' Start Watchdog
' Enable Interrupts

'Enable Timer1
'Start Timer1

'– One 8-bit Timer/Counter with Prescaler and Two PWM Channels
'– 4-channel, 10-bit ADC with Internal Voltage Reference

'pin1-PB5-RESET
'pin2-PB3-ADC3
'pin3-PB4-ADC2
'pin4-GND
'pin5-PB0-Mosi-AIN0
'pin6-PB1-Miso-AIN1
'pin7-PB2-SCK-ADC1
'pin8-+U

'**************************главный цикл ************************************
A = 0                                   ' 9 что бы при вкл все отработало, а не ждать.
Do
A = A + 1                               '10 количество пробуждений

If A = 1 Then                           'test expression

'после просыпания настраиваем выводы
Config Portb.0 = Output
Sensor_pin5 Alias Portb.0               'pin5 импульсы на штырь

Config Portb.1 = Output
Led_on Alias Portb.1                    'pin6 импульс вкл полива, светодиод


 'var = GETADC(channel [,offset])
'для замера Uvcc МК нет необходимости городить делитель напряжения на ногу АЦП
'можно замерить внутренний опорник (+1.1v) относительно Avcc.
Config Adc = Single , Prescaler = Auto , Reference = Internal       ' Avcc конфигурация АЦП
Start Adc                               'запустили в работу АЦП

'w=Getadc(14)
 'В режиме Power-down регистры сохраняют свое значение, но генератор останавливается,
 ' блокируя все функции прибора до следующего прерывания или аппаратного сброса.

'2)Сравниваем напряжение с
      Uak = 0
       For I = 0 To 1                   '255
       Uak = Getadc(14)
       'Uak = Getadc(0)                  'Считываем Напряжение
       Next
'     Shift Xv64 , Right , 2            ' 8-делим на 64  для усреднения результатов
'      V = Xv * Dv                       'коэффициент пересчета напряжения

 '3)Выставил 1000 импульсов на датчик влажности для зарядки конденсатора
     For I = 0 To 5                     '255
'Print #1 , I
   Sensor_pin5 = 1
   Sensor_pin5 = 0
       Next

 '4)Измерил "напряжение" на датчике влажности земли
     Usensor = 0
      For I = 0 To 2                    '63
      Usensor = Getadc(2)               ' pin3(АЦР2/PB4) Считываем напряж на конденсаторе
      Next
  'включил питание на периферию
   'On_poliv = 1

 '4)Измерил напряжение с фотодатчика
 'Аналоговый компаратор (Analog Comparator) сравнивает напряжения на двух выводах!!! (пинах) микроконтроллера.
 'Компаратор можно настроить Config ACI = On|Off, Compare = On|Off, Trigger = Rising|Falling|Toggle
      Ufoto = 0
      For I = 0 To 2
      Ufoto = Getadc(3)                 ' pin2(АЦР3/PB3) Считываем напряж с делителя фотоэлемента
      Next

 '6)Отправил напряжение питания, время, напряжение с датчика влажности
'Print ""                                'нельзя, так как не аппаратного UARTa
Print #1 , "Uak=" ; Uak ; " Usens=" ; Usensor       ' ; "  Ufoto=" ; Ufoto ; "  A=" ; A
'Если ещё/уже темно и низкая влажность, подадим импульс на вкл полива
'If Ufoto<

'.посветим  светодиодом ХХХ милисек
'Stop Watchdog
' Led_on = 1
' Wait 1
' Led_on = 0
'Start Watchdog

A = 0                                   'сбрасываем счетчик пробуждений

End If
' WDTCR   =$21 есть такая строка в файле  ATtiny13.DAT
'и такие
'WDTIF  = 7  ;WDTCR
'WDTIE  = 6
'WDP3   = 5
'WDTOE  = 4
'WDE    = 3
'WDP2   = 2
'WDP1   = 1
'WDP0   = 0
'Wd = Mcusr.wdrf
'Powermodes=3
'Pm1=Idle,MCUCR.SM0-0 , MCUCSR.SM1-0
'Pm2=Powerdown,MCUCR.SM0-0 , MCUCSR.SM1-1
'Pm3=ADCnoise,MCUCR.SM0-1 , MCUCSR.SM1-0
' MCUCR   =$35
' PUD    = 6  ;MCUCR
'SE     = 5
'SM1    = 4
'SM0    = 3
'ISC01  = 1
'ISC00  = 0
'1.вкл режим сна(Sleep Mode) = Power-down
'Mcucr.sm1 = 1
'Mcucr.sm0 = 0
'2.вкл Режим Прерываний По Собаке
'Wdtcr.wdtie = 1
'Wdtcr.wde = 0


'3.Prescale 4Sec.
'Wdtcr.wdp3 = 0                          '1  8сек
'Wdtcr.wdp2 = 0
'Wdtcr.wdp1 = 0
'Wdtcr.wdp0 = 1
'WDTIF флаг,установится аппаратно после выполнения п2,3 и сбрасывается при наст прерывания
Config Watchdog = 256
Start Watchdog

Enable Interrupts
On Wdt Wdt_isr

'Idle                                    'погружаем в сон
Powerdown
'Config Powermode = Powerdown 'неизвестный параметр  Powerdown
Loop


End

  'Watchdogint:
  Wdt_isr:
  '******Only for tests***********
 Led_on = 1
 Wait 1
 Led_on = 0
'    Print #1 , "Проверка"
  '*****************
  Return

Re: WatchDog Timer Attiny13. на коде Bascom не просыпается п

Добавлено: Вс апр 20, 2014 11:21:25
123ksn
Оказывается проблема в моей невнимательности при чтении даташита на Attiny13. Что бы WatcDog , далее ПЕС, работал в режиме прерывания , необходимо, что бы во фьюзе он был отключен. Я же ОШИБОЧНО предположил, что раз используется ПЕС, то должен быть включен фьюз. Здесь kazus.ru/forums/showthread.php?p=793681&posted=1#post793681 мне помогли с этим вопросом разобраться.