.include "tn13def.inc" ; Attiny13
//Определение переменных (директива .def)
.def temp =R16 //временная переменная
.def ADC_Res =R20 //результат АЦ преобразования
.CSEG
;--------ТАБЛИЦА ВЕКТОРОВ ПРЕРЫВАНИЯ -----------------------|
.org $00;
rjmp RESET ;Reset
.ORG $01 ; External Interrupt 0
RETI
.ORG $02 ; External Interrupt Request 0
RETI
.ORG $03 ; Timer/Counter0 Overflow
RETI
.ORG $04 ; EEPROM Ready
RETI
.ORG $05 ; Analog Comparator
RETI
.ORG $06 ; Timer/Counter Compare Match A
RETI
.ORG $07 ; Timer/Counter Compare Match B
RETI
.ORG $08 ; Watchdog Time-out
RETI
.ORG $09 ; ADC Conversion Complete
rjmp ADC_END ;
;-----------------------------------------------------------|
;-------------------ПРЕРЫВАНИЯ------------------------------|
ADC_END: ;
IN ADC_Res,ADCH //Перенесем полученое значение АЦП в РОН
RETI;-------------------------------------------------------|
// Работа с портом PB4. здесь описан вся последовательность управляющего сигнала от МК
; ниже нужно указать последовательность задержек
;------ИНИЦИАЛИЗАЦИЯ ПОРТОВ, СТЕКА, и т.п---------------|
RESET: ; |
//Настройка портов ввода/вывода
//DDRx - направление работы линии порта x (1-выход, 0-вход)
//PORTx - Значение уровня на линии порта x (1-высокий, 0-низкий)
// если порт x настроен как вход (1-PullUp)
//PINx - Уровень сигнала на линии порта x (Только для чтения)
sbi PortB, 3 ; сигнал Start
sbi DDRB, 4 ; выходной сигнал
sbi PortB, 4;
clr ADC_Res
;-------------------------------------------------------|
rcall Loop_5sec; задержка при старте.
//Настройка АЦП
//ADLAR-Выравнивание по левому краю
//REFS- Выбор источника опорного напряжения
//MUX- Выбор канала АЦП
ldi temp, 0b00100011
OUT ADMUX, temp
//Инициализируем АЦП
//ADEN-Включить АЦП
//ADSC-Начать преобразование
//ADIE-Разрешение прерывания
//ADPS-Предделитель тактовой частоты АЦП
LDI Temp, (1<<ADEN|1<<ADSC|1<<ADIE|1<<ADPS0|1<<ADATE|1<<ADPS2)
OUT ADCSRA, Temp
//Разрешаем прерывания
sei
MAIN:
cpi ADC_Res, 0x55 ;отслеживаем нужный нам интервал напряжения
; в нашем случае при опорном напряении 3В, весь дипозон от 0 до 255 поделен на 3 части.
; если больше чем 1В напряжение тогда работаем с портом PB4
brsh Port_B4
//Ожидаем прерывание
RJMP MAIN
Port_B4:
cli
rcall Loop_2sec
cbi PortB, 4;0
rcall Loop_0_2sec
sbi PortB, 4;1
rcall Loop_1sec
cbi PortB, 4;0
rcall Loop_0_2sec
sbi PortB, 4;1
ezhik:
rjmp ezhik
//------------Зедержки-----------------
;Расчитаны программой AVRloop более чем достаточно,
; ибо МК больше нихрена все равно не делает в эти моменты
Loop_2sec:
; =============================
; delay loop generator
; 9600000 cycles:
; -----------------------------
; delaying 9599985 cycles:
ldi R17, $33
WGLOOP0: ldi R18, $F8
WGLOOP1: ldi R19, $FC
WGLOOP2: dec R19
brne WGLOOP2
dec R18
brne WGLOOP1
dec R17
brne WGLOOP0
; -----------------------------
; delaying 15 cycles:
ldi R17, $05
WGLOOP3: dec R17
brne WGLOOP3
; =============================
reti
Loop_1sec:
; =============================
; delay loop generator
; 4800000 cycles:
; -----------------------------
; delaying 4799751 cycles:
ldi R17, $25
WGLOOP01: ldi R18, $B8
WGLOOP11: ldi R19, $EA
WGLOOP21: dec R19
brne WGLOOP21
dec R18
brne WGLOOP11
dec R17
brne WGLOOP01
; -----------------------------
; delaying 249 cycles:
ldi R17, $53
WGLOOP31: dec R17
brne WGLOOP31
; =============================
reti
Loop_0_2sec:
; =============================
; delay loop generator
; 960000 cycles:
; -----------------------------
; delaying 959928 cycles:
ldi R17, $08
WGLOOP02: ldi R18, $C6
WGLOOP12: ldi R19, $C9
WGLOOP22: dec R19
brne WGLOOP22
dec R18
brne WGLOOP12
dec R17
brne WGLOOP02
; -----------------------------
; delaying 72 cycles:
ldi R17, $18
WGLOOP32: dec R17
brne WGLOOP32
; =============================
reti
Loop_5sec:
; =============================
; delay loop generator
; 24000000 cycles:
; -----------------------------
; delaying 23999952 cycles:
ldi R17, $7C
WGLOOP03: ldi R18, $FD
WGLOOP13: ldi R19, $FE
WGLOOP23: dec R19
brne WGLOOP23
dec R18
brne WGLOOP13
dec R17
brne WGLOOP03
; -----------------------------
; delaying 48 cycles:
ldi R17, $10
WGLOOP33: dec R17
brne WGLOOP33
; =============================
reti
//Сегмент энергонезависимой памяти (EEPROM)
.ESEG
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1