tallarna писал(а):для начала - у atmega8 часов реального времени (хранящего часы/минуты/секунды) нету
но можно сделать rtc без хардового rtc
Технический форум по робототехнике.
tallarna писал(а):для начала - у atmega8 часов реального времени (хранящего часы/минуты/секунды) нету
// расстановка "флагов"
1. Если есть протечка 1 - то подпрограмма "Авария"
2. Если модуль №1 вЫключен - то сделать module_1_full = 1 и перейти к 6
3. Если П_модуль №1 включен - то сделать module_1_full = 0 и перейти к 6
4. Если и нижний и верхний датчик модуля 1 = 0 - то сделать module_1_full = 0
5. Если и нижний и верхний датчик модуля 1 = 1 - то сделать module_1_full = 1
6. Если есть протечка 2 - то сделать module_1_full = 1 и зажечь светодиод, иначе погасить светодиод
7. Если модуль №2 вЫключен - то сделать module_2_full = 1 и перейти к 11
8. Если П_модуль №2 включен - то сделать module_2_full = 0 и перейти к 11
9. Если и нижний и верхний датчик модуля 2 = 0 - то сделать module_1_full = 0
10. Если и нижний и верхний датчик модуля 2 = 1 - то сделать module_1_full = 1
11. Если модуль №3 вЫключен - то сделать module_3_full = 1 и перейти к 16
12. Если П_модуль №3 включен - то сделать module_3_full = 0 и перейти к 16
13. Если module_3_in_progress = 1 - то перейти к 15
14. Если время_с_последнего_полива > 24 часов - то сделать module_3_full = 0 и сбросить время_с_последнего_полива и начать считать время_полива и сделать module_3_in_progress = 1, иначе перейти к 16
15. Если время_полива > n секунд - то сделать module_3_full = 1 и прекратить считать время_полива и сбросить время_полива и сделать module_3_in_progress = 0
16. УПРАВЛЕНИЕ: Если module_1_full = 0 - то открыть клапан №1 и включить помпу, иначе закрыть клапан №1
17. Если module_2_full = 0 - то открыть клапан №2 и включить помпу, иначе закрыть клапан №2
18. Если module_3_full = 0 - то открыть клапан №3 и включить помпу, иначе закрыть клапан №3
19. Если module_1_full = 0 и module_2_full = 0 и module_3_full = 0 - то выключить помпу
20. Перейти к 1
:::::::Подпрограмма:::::::
Авария (протечка №1):
1) выключить помпу и закрыть все клапаны
2) зажечь светодиод
3) Если протечка №1 - перейти к 3)
4) погасить светодиод и выйти из подпрограммы
Инициализация:
записать число 4 в TCCR0. Почему 4 - см. стр. 70 даташита.
установить бит 0 в TIMSK (это бит TOIE0, разрешение прерываний переполнения таймера 0)
Обработчик прерывания Timer0 overflow:
записать 6 в TCNT0
прочитать глобальную переменную SubSecondCount
прибавить 1
записать полученное значение в SubSecondCount
если получили >=125:
обнулить SubSecondCount
прочитать Time
+1
записать Time
.def Temp=R16 ; разное
.def Temp_2=R17 ; разное 2
.def Time=R18 ; показания таймера в Секундах
.cseg
.org 0
;************_ НАСТРОЙКА ПРЕРЫВАНИЙ _************
rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp TIMER2_COMP
rjmp TIMER2_OVF
rjmp TIMER1_CAPT
rjmp TIMER1_COMPA
rjmp TIMER1_COMPB
rjmp TIMER1_OVF
rjmp TIMER0_OVF
rjmp SPI_STC
rjmp USART_RXC
rjmp USART_UDRE
rjmp USART_TXC
rjmp ADC
rjmp EE_RDY
rjmp ANA_COMP
rjmp TWI
rjmp SPM_RDY
;Reset:
INT_0:
INT_1:
TIMER2_COMP:
TIMER2_OVF:
TIMER1_CAPT:
TIMER1_COMPA:
TIMER1_COMPB:
TIMER1_OVF:
;TIMER0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC:
EE_RDY:
ANA_COMP:
TWI:
SPM_RDY:
reti
Reset: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp
ldi Temp,4
out TCCR0,Temp
ldi Temp,0b00000001 ;разрешение прерываний переполнения таймера 0
out TIMSK,Temp
ldi Temp, low(RAMEND) ; инициализация стека
out SPL, Temp ; инициализация стека
ldi Temp, high(RAMEND) ; инициализация стека
out SPH, Temp ; инициализация стека
sei ;разрешить прерывания
Begin: //// ЗДЕСЬ БУДЕТ САМА ПРОГРАММА ////
rjmp Begin
;************_ ОБРАБОТЧИК ПРЕРЫВАНИЯ Timer0 overflow _************
TIMER0_OVF: ldi Temp,6
out TCNT0,Temp
ldi Temp,0
mov Temp,SubSecondCount ; прочитать глобальную переменную SubSecondCount в Temp
ldi Temp_2,1
add Temp,Temp_2 ; прибавить 1 к Temp
out SubSecondCount,Temp ; записать полученное значение в SubSecondCount
CPI SubSecondCount, 125
BRSH Plus_Second ; если получили >=125
TIMER0_OVF_Exit: reti ; выход из обработчика
Plus_Second: CLR SubSecondCount
ldi Temp,0
mov Temp,Time ; прочитать Time в Temp
add Temp,Temp_2 ; прибавить 1 к Time
out Time,Temp ; записать полученное значение в Time
rjmp TIMER0_OVF_Exit ; к выходу из обработчика
lds Temp1, Time
lds Temp2, Time+1
lds Temp3, Time+2
ldi Temp4, 1
add Temp1, Temp4
clr Temp4
adc Temp2, Temp4
adc Temp3, Temp4
sts Time, Temp1
sts Time+1, Temp2
sts Time+2, Temp3
.def Temp=R16 ; разное
[b].def SubSecondCount=R17
.def Temp1=R18
.def Temp2=R19
.def Temp3=R20
.def Temp4=R21
.dseg
Time: .byte 3[/b]
.cseg
.org 0
;************_ ОБРАБОТЧИК ПРЕРЫВАНИЯ Timer0 overflow _************
TIMER0_OVF: ldi Temp,6
out TCNT0,Temp
[b]ldi Temp,1
add SubSecondCount,Temp ; прибавить 1 к SubSecondCount[/b]
CPI SubSecondCount, 125
BRSH Plus_Second ; если получили >=125
TIMER0_OVF_Exit: reti ; выход из обработчика
Plus_Second: [b]ldi SubSecondCount,0
lds Temp1, Time
lds Temp2, Time+1
lds Temp3, Time+2
ldi Temp4, 1
add Temp1, Temp4
clr Temp4
adc Temp2, Temp4
adc Temp3, Temp4
sts Time, Temp1
sts Time+1, Temp2
sts Time+2, Temp3[/b]
rjmp TIMER0_OVF_Exit ; к выходу из обработчика
Подскажите, пожалуйста, как именно писать подчёркнутое, а то я пока плохо представляю, как это работать с числом, разбитым на 3 части...9. Если (время - последнее время полива) > 24 часов - поставить флаг полива, засечь время начала полива
10. Если флаг полива и (время - время начала полива) > n секунд - снять флаг полива, обновить время последнего полива
adc Temp2, Temp4
adc Temp3, Temp4
GrayHunter писал(а):просто прибавили ноль?
LastWaterTime .byte 3
StartWaterTime .byte 3