Реальная тема без использования внешних портов.
Здоровски помог наш дорогой Админ. Но код под даташит ATtiny84.
'===============================================================================
' Н А С Т Р О Й К А АЦП
'===============================================================================
Const Channel_temperature = &B_0010_0010
Const Channel_v_bg = &B_0010_0001
Const Channel_gnd_0v = &B_0010_0000
'&B_0000_0000
' || |
' || |
' || +------- Bit 3 – SM0: Sleep Mode Select Bit 3
' |+--------- Bit 4 – SM1: Sleep Mode Select Bit 4
' +---------- Bit 5 – SE: Sleep Enable
Const Значение_idle = &B_0010_0000
Const Значение_adcnoise = &B_0010_1000
Const Значение_powerdown = &B_0011_0000
Const Значение_powerstandby = &B_0011_1000
Config Adc = Single , Prescaler = 128 , Reference = Avcc
Start Adc
On Adc Обработка_прерывания_ацп Nosave
'Формула расчёта: 1024 * 0,99...1,21 = 1013,76...1239,04
Dim Флаг_критический_разряд As Byte
Dim Temp_ацп_avcc_word As Word : Temp_ацп_avcc_word = 0
Dim Данные_ацп_avcc_word As Word : Данные_ацп_avcc_word = 0
Dim Vcc_sin As Single
Adcsra.aden = 0
'===============================================================================
Измерение_avcc:
'-------------------------------------------------------------------------------
Enable Adc
Adcsra.aden = 1 'Включаем АЦП
Waitms 250 'Ждём, пока запустится источник внутреннего опорного напряжения 1.1V, от частоты МК не зависит
Admux = Channel_gnd_0v 'Готовимся разряжать внутреннюю ёмкость МК
Waitus 70 'Ждём, пока разрядится ёмкость, рекомендовано Atmel стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)
!ldi R16 , Значение_adcnoise 'Выставляем, как будем спать
!sts MCUCR , R16 'Пишем в региср
!sleep 'Отправляемся спать
!nop
Admux = Channel_v_bg 'Готовимся измерять Avcc (VBG) стр.145 http://ww1.microchip.com/downloads/en/D … oc8183.pdf
Waitus 70 'Время ожидания заряда ёмкости, рекомендовано Atmel стр.9., п.п.3.4 Band gap measurement (http://www.atmel.com/images/doc8444.pdf)
!ldi R16 , Значение_adcnoise 'Выставляем, как будем спать
!sts MCUCR , R16 'Пишем в региср
!sleep 'Отправляемся спать
!nop
Disable Adc
'Выключаем АЦП, слишком много потребляет 'Bit 7 – ADEN: ADC Enable / Disable
Adcsra.aden = 0
'Выключаем компаратор Bit 7 – ACD: Analog Comparator Disable
Acsr.acd = 0
Vcc_sin = Const_коэффициент_перещета_1_1v / Данные_ацп_avcc_word
Vcc_word = Vcc_sin * 100
' Vcc_word = Vcc_word
'-------------------------------------------------------------------------------
Return
'===============================================================================
Обработка_прерывания_ацп:
'-------------------------------------------------------------------------------
!push R16
!lds R16 , adcl
!sts {Данные_ацп_avcc_word} , R16
!lds R16 , adch
!sts {Данные_ацп_avcc_word + 1} , R16
!pop R16
!reti
'-------------------------------------------------------------------------------
Return
'=====================================================================
Как переписать под ATmega8?
В АСМе полный ноль.
В предустановках меги чуть по другому. Пробовал менять MUX под мегу. Не получается.
Не работает прерывание по АЦП. Его просто не произходит.



