AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
17.04.2014, 19:03
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 327
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
|
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"
|
|
|
|
17.04.2014, 19:24
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Фуз вачдога отключи
|
|
|
|
17.04.2014, 19:27
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 327
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Сообщение от niXto
|
Фуз вачдога отключи
|
А как же тогда WDT заработает? Или я Вас неправильно понял?
|
|
|
|
17.04.2014, 21:46
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Ты не читал даташит
Таблица 8.1
|
|
|
|
17.04.2014, 22:09
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 327
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Сообщение от niXto
|
Ты не читал даташит
Таблица 8.1
|
Читал. Но знаете как бывает, смотрю в книгу - вижу фигу. Действительно WDTON должен быть отключен (8126F–AVR–05/12 стр.43). СПАСИБО. Буду пробовать.
|
|
|
|
18.04.2014, 00:17
|
|
Вид на жительство
Регистрация: 09.10.2012
Сообщений: 327
Сказал спасибо: 124
Сказали Спасибо 71 раз(а) в 38 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Попробовал. Светодиод замигал. Правда не так как я предполагал. Скважность 2. Сколько включен, столько и погашен. Длительность состояния определяется из Config Watchdog=ХХХХ. Пока могу сделать только один вывод: поскольку свечение светодиода находится в обработчике прерывания, то прерывание наступает. А вот почему светится не пол секунды, а больше (ХХХХ=1024) -пока без версий.
|
|
|
|
20.04.2014, 05:29
|
|
Прописка
Регистрация: 11.09.2013
Сообщений: 112
Сказал спасибо: 103
Сказали Спасибо 97 раз(а) в 38 сообщении(ях)
|
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
Последний раз редактировалось sasha_1973; 20.04.2014 в 05:38.
|
|
|
Сказали "Спасибо" sasha_1973
|
|
|
18.12.2017, 23:30
|
|
Прохожий
Регистрация: 02.11.2008
Сообщений: 1
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Attiny13 на коде из Bascom не просыпается по WDT
Александр не подскажите как вы подключили контроллер к порту по одному выводу? ( TxD). У Вас на программаторе есть TX/RX?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:45.
|
|