Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR...

 
Опции темы
Непрочитано 17.04.2014, 19:03  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Attiny13 на коде из Bascom не просыпается по WDT

Написал проектик на 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
Реклама:

Последний раз редактировалось 123ksn; 17.04.2014 в 20:58. Причина: изменил тэг на "cod"
123ksn вне форума  
Непрочитано 17.04.2014, 19:24  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Фуз вачдога отключи
niXto вне форума  
Непрочитано 17.04.2014, 19:27  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Сообщение от niXto Посмотреть сообщение
Фуз вачдога отключи
А как же тогда WDT заработает? Или я Вас неправильно понял?
123ksn вне форума  
Непрочитано 17.04.2014, 21:46  
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Ты не читал даташит
Таблица 8.1
niXto вне форума  
Сказали "Спасибо" niXto
123ksn (17.04.2014)
Непрочитано 17.04.2014, 22:09  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Сообщение от niXto Посмотреть сообщение
Ты не читал даташит
Таблица 8.1
Читал. Но знаете как бывает, смотрю в книгу - вижу фигу. Действительно WDTON должен быть отключен (8126F–AVR–05/12 стр.43). СПАСИБО. Буду пробовать.
123ksn вне форума  
Непрочитано 18.04.2014, 00:17  
123ksn
Вид на жительство
 
Аватар для 123ksn
 
Регистрация: 09.10.2012
Сообщений: 312
Сказал спасибо: 119
Сказали Спасибо 69 раз(а) в 36 сообщении(ях)
123ksn на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Попробовал. Светодиод замигал. Правда не так как я предполагал. Скважность 2. Сколько включен, столько и погашен. Длительность состояния определяется из Config Watchdog=ХХХХ. Пока могу сделать только один вывод: поскольку свечение светодиода находится в обработчике прерывания, то прерывание наступает. А вот почему светится не пол секунды, а больше (ХХХХ=1024) -пока без версий.
123ksn вне форума  
Непрочитано 20.04.2014, 05:29  
sasha_1973
Прописка
 
Регистрация: 11.09.2013
Сообщений: 112
Сказал спасибо: 103
Сказали Спасибо 97 раз(а) в 38 сообщении(ях)
sasha_1973 на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Рабочий вариант, проверено в железе.

Код:
Для корректного отображения в компиляторе Bascom, используйте шрифт Consolas!

  $regfile = "attiny13a.dat"       ' Используемый контроллер
  $crystal = 9600000       ' 9,6 МГц при CKDIV8 = 0 (смотреть скрин фьюзов)
'  $crystal = 1200000       ' 1,2 МГц при CKDIV8 = 1 (смотреть скрин фьюзов)
  $framesize = 16   'размер области используемой и необходимой для преобразований
  $hwstack = 10     ' Размер аппаратного стека
  $swstack = 10     ' Размер программного стека

' Настройка USART с выходом TxD на выводе Portb.4 (3 ножка МК) и программной реализацией,
' скорость трансляции 9600 бод, при частоте МК 9,6 МГц, фьюз CKDIV8 = 0

  Open "comb.4:9600,8,n,1" For Output As #1
  Print #1 , "Reset МК"

'-------------------------  Настройка Watchdog  --------------------------------
  On Wdt Обработка_прерывания_watchdog       ' Nosave       ' Переход на подпрограмму обработки прерывания после переполнения таймера-счётчика Watchdog
  Config Watchdog = 1024       'время срабатывания ~1сек., при соответствии $crystal и фьюзов МК      ' 16   32   64   128   256   512   1024   2048   4096   8192
'---------------------  Используемые переменные  -------------------------------
  Dim Переменная As Byte
  Dim Флаг_сработал_watchdog As Byte
'--------------  Разрешаем работу необходимых прерываний  ----------------------
  Enable Wdt        ' Разрешаем прерывание от переполнения таймера Watchdog
'------------  Разрешаем работу всех включенных прерываний  --------------------
  Enable Interrupts ' Глобально разрешаем все взадействованные прерывания
'=================================================  ==============================
'                   Г Л А В Н Ы Й         Ц И К Л
'=================================================  ==============================
  Главный_цикл:



    If Флаг_сработал_watchdog ‹› 0 Then
        Print #1 , Переменная
        Флаг_сработал_watchdog = 0
        Goto Главный_цикл
    End If



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




'=================================================  ==============================
  Обработка_прерывания_watchdog:
'-------------------------------------------------------------------------------
      Incr Переменная
      Флаг_сработал_watchdog = 1

      Print #1 , "Прерывание от Watchdog " ;
'-------------------------------------------------------------------------------
  Return
'=================================================  ==============================
Исходник + картинки --- Работает в железе.rar

Нажмите на изображение для увеличения
Название: Фьюзы.jpg
Просмотров: 149
Размер:	82.5 Кб
ID:	63122 Нажмите на изображение для увеличения
Название: Приём по USART.jpg
Просмотров: 122
Размер:	193.4 Кб
ID:	63123

Последний раз редактировалось sasha_1973; 20.04.2014 в 05:38.
sasha_1973 вне форума  
Сказали "Спасибо" sasha_1973
123ksn (20.04.2014)
Непрочитано 18.12.2017, 23:30  
LionSitroen
Прохожий
 
Регистрация: 02.11.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
LionSitroen на пути к лучшему
По умолчанию Re: Attiny13 на коде из Bascom не просыпается по WDT

Александр не подскажите как вы подключили контроллер к порту по одному выводу? ( TxD). У Вас на программаторе есть TX/RX?
LionSitroen вне форума  
 

Закладки

Метки
attiny13, bascom, interrupts, wdt, проснуться
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 12:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot