Aref через 0,1мкф на землю
$regfile = "m328pdef.dat"
$crystal = 1000000
$framesize = 128
$hwstack = 128
$swstack = 128'===============================================================================
' Включение / выключение питания аппаратных модулей МК
'===============================================================================
Prr = &B_1011_1000
' |||| ||||
' |||| |||+--- 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 = 128 ' Делитель 32768 / 128 / 256 = 1 сек (прерывание TIMER2 = 1 раз в секунду)'Ссылка на подпрограмму обработчика прерывания TIMER2, для работы часов
On Timer2 Обработка_прерывания_timer2 Nosave ' Ссылка на подпрограмму обработчика прерывания TIMER2Stop Timer2
Timer2 = 0Waitms 3000
'===============================================================================
' Н А С Т Р О Й К А АЦП
'===============================================================================Const Опорное_aref = &B_0000_0000
Const Опорное_avcc = &B_0100_0000
Const Опорное_internal_1_1v = &B_1100_0000Const Channel_temperature = &B_0000_1000
Const Channel_internal_1_1v = &B_0000_1110
Const Channel_gnd_0v = &B_0000_1111'SM2 SM1 SM0 Sleep Mode
' 0 0 0 Idle
' 0 0 1 ADC Noise Reduction
' 0 1 0 Power-down
' 0 1 1 Power-save
' 1 0 0 Reserved
' 1 0 1 Reserved
' 1 1 0 Standby(1)'&B_0000_0000
' ||||
' ||||
' |||+-------- Bit 0 – SE: Sleep Enable
' ||+--------- Bit 1 – SM0: Sleep Mode Select Bit 0
' |+---------- Bit 2 – SM1: Sleep Mode Select Bit 1
' +----------- Bit 3 – SM2: Sleep Mode Select Bit 2
'Const Значение_idle = &B_0000_0001
Const Значение_adcnoise = &B_0000_0011
Const Значение_powersave = &B_0000_0111
Const Значение_powerdown = &B_0000_0101Config Adc = Single , Prescaler = 128 , Reference = Avcc
Start AdcOn Adc Обработка_прерывания_ацп Nosave
'Формула расчёта: 1024 * 0,99...1,21 = 1013,76...1239,04
'Реальный МК Atmega328P
'Const Const_коэффициент_перещета_1_1v = 1097.5 'Зависит от конкретного экземпляра МК, т.к., согласно документации 1.1V ± 10%, т.е., 1...1.2V'Реальный МК Atmega328P
Const Const_коэффициент_перещета_1_1v = 1090 'Зависит от конкретного экземпляра МК, т.к., согласно документации 1.1V ± 10%, т.е., 1...1.2VDim Флаг_критический_разряд As Byte
Dim Temp_ацп_avcc_word As Word : Temp_ацп_avcc_word = 0
Dim Данные_ацп_avcc_word As Word : Данные_ацп_avcc_word = 0Dim Vcc_txd_nrf24l01_word As Word
Dim Vcc_txd_nrf24l01_low_byte As Byte At Vcc_txd_nrf24l01_word Overlay
Dim Vcc_txd_nrf24l01_high_byte As Byte At Vcc_txd_nrf24l01_word + 1 OverlayDim Vcc_txd_nrf24l01_sin As Single
Dim Flag_передать_данные As Byte
Dim Timer_sec As Byte : Timer_sec = 30
Dim Val_timer_sec As Byte : Val_timer_sec = 30
Dim Flag_update_time As Byte
'-------------- Разрешаем работу необходимых прерываний ----------------------
Enable AdcEnable Timer2
Start Timer2
'------------ Разрешаем работу всех включенных прерываний --------------------
Enable Interrupts
'===============================================================================
' Запуск и предварительная настройка
'===============================================================================Gosub Измерение_avcc
'===============================================================================
' Г Л А В Н Ы Й Ц И К Л
Главный_цикл:
'===============================================================================If Timer_sec = 0 Then
Счетчик_измерений_long = Счетчик_измерений_long + 1
Prr = &B_1011_1010
' |||| ||||
' |||| |||+--- 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) выключен, после включени обязательна повторная инициализация
' Примечание:Ddrb = &B_1111_1111 : Portb = &B_0000_0001
Ddrc = &B_1111_1111 : Portc = &B_0000_0000
Ddrd = &B_1111_1011 : Portd = &B_0000_0000'Ucsr0b.rxen0 = 1 'Включаем приёмник USART
'Ucsr0b.txen0 = 1 'Включаем передатчик USARTGosub Измерение_avcc
' Print ""
' Print Счетчик_измерений_long
' Print Vcc_txd_nrf24l01_word
' Print Готов_темпер_ds18b20_sin
' Print Готов_темпер_ds18b20_int
' Print ""Timer_sec = Val_timer_sec
'Gosub Передать_данные_nrf24l01
'Gosub Выключаем_все_ненужное
Flag_передать_данные = 0
End If!ldi R16 , Значение_powersave 'Выставляем, как будем спать
!sts SMCR , R16 'Пишем в региср
!sleep 'Отправляемся спать'===============================================================================
Goto Главный_цикл
End
'==============================================================================='===============================================================================
Измерение_avcc:
'-------------------------------------------------------------------------------
Adcsra.aden = 1 'Включаем АЦП
Waitms 250 'Ждём, пока запустится источник внутреннего опорного напряжения 1.1V, от частоты работы МК не зависитAdmux = &B_0101_1111 'Готовимся разряжать ёмкость
Waitus 70 'Ждём, пока разрядится ёмкость, рекомендовано Atmel стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)!ldi R16 , Значение_adcnoise 'Выставляем, как будем спать
!sts SMCR , R16 'Пишем в региср
!sleep 'Отправляемся спать!nop
!nop
!nopAdmux = &B_0101_1110 'Готовимся измерять Avcc (1.3V(VBG) стр.259 http://www.atmel.com/images/atmel-8159- … asheet.pdf)
Waitus 70 'Время ожидания заряда ёмкости, рекомендовано Atmel стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)
!ldi R16 , Значение_adcnoise 'Выставляем, как будем спать
!sts SMCR , R16 'Пишем в региср
!sleep 'Отправляемся спать!nop
!nop
!nopVcc_txd_nrf24l01_sin = Const_коэффициент_перещета_1_1v / Данные_ацп_avcc_word
Vcc_txd_nrf24l01_word = Vcc_txd_nrf24l01_sin * 100'-------------------------------------------------------------------------------
Return
'==============================================================================='===============================================================================
Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
!push R16!lds R16 , adcl
!sts {Данные_ацп_avcc_word} , R16!lds R16 , adch
!sts {Данные_ацп_avcc_word + 1} , R16!pop R16
!reti
'-------------------------------------------------------------------------------
Return
'===============================================================================