Програма для мікроконтролераВ УКОВ застосовується мікроконтроллер ATtiny26 фірмы ATMEL. Розробка програми здійснювалась в AVR Studio. Код програми наведено нижче .include "tn26def.inc" ;файл опиcань імен регістрів .def tmp=r16 ;робоча змінна .def hrs=r20 ;кількість годин .def num=r18 ;робоча змінна .def m=r21 ;m=0, якщо таймер працює. ;m використовується для ;запобігання режима BLINK ;в режимі "ТАЙМЕР" rjmp RESET ;перехід після сбросу rjmp EXT_INT0 ;перехід поіля зовнішнього ;переривання RESET: ;головна програма ldi tmp,RAMEND ;ініціалізація стека out sp,tmp ldi tmp,0b01000000 out GIMSK,tmp ;дозволяємо зовнішнє переривання ldi tmp,0b00000010 out MCUCR,tmp ;переривання по задньому ;фронту імпульса ldi tmp,0b01111111 ;настройка портів out ddra,tmp ;РА0..РА6 - на вивід, РА7 - на ввід ldi tmp,0b00000110 ;РB4,PB6,PB5,PB3 - на ввід, out ddrb,tmp ;PB2,PB1 - на вивід clr tmp ;tmp = 0 clr hrs ;hrs = 0 rcall INDICATE START: clr tmp clr hrs rcall INDICATE sei ;дозволяємо переривання STRT: sbis pina,7 ;чекаємо натиску кнопки "ПУСК" rjmp STRT rcall del_s ;затримка 1 сек rcall del_s sbis pina,7 ;якщо "ПУСК" ще замкнений - працюємо rjmp STRT ;інакше - знову чекаємо sbi portb,1 ;сповіщаємо rcall del_s ;користувача cbi portb,1 ;про початок rcall del_s ;виконання sbi portb,1 ;алгоритма rcall del_s ;блиманням cbi portb,1 ;світлодіода sbis pinb,3 ;якщо РВ3 = 1, то йдемо rjmp REPEAT ;на режим "ТАЙМЕР", інакше - "ПОВТОР" rcall INDICATE TIMER: cli ;режим "ТАЙМЕР" rcall INDICATE tst hrs ;якщо hrs = 0, то відкачуємо воду breq IMMEDIATE ;якщо необхідно почекати, то dec hrs ;інкрементуємо hrs та rcall del_h ;чекаємо (якщо hrs <> 0) rjmp TIMER IMMEDIATE: rcall IND_LS sbis pinb,5 rjmp START rcall PUMPING clr hrs rjmp START INDICATE: ;показуємо hrs на 7-сегментнику cpi hrs,1 ;порівнюємо hrs із одиницею, і якщо ;hrs <> 1, то перевіряємо чи не дорівнює brne TWO ;hrs двійці. Якщо hrs = 1, то ldi num,0b00000110 ;пишемо в num число, для "1" out porta,num ;і виводимо на індикацію ret ;виходимо із підпрограми TWO: cpi hrs,2 brne THREE ldi num,0b01011011 out porta,num ret THREE: cpi hrs,3 brne FOUR ldi num,0b01001111 out porta,num ret FOUR: brne FIVE ldi num,0b01100110 out porta,num ret FIVE: cpi hrs,5 brne SIX ldi num,0b01101101 out porta,num ret SIX: cpi hrs,6 brne SEVEN ldi num,0b01111101 out porta,num ret SEVEN: cpi hrs,7 brne EIGHT ldi num,0b00000111 out porta,num ret EIGHT: cpi hrs,8 brne NINE ldi num,0b01111111 out porta,num ret NINE: cpi hrs,9 brne ZERO ldi num,0b01101111 out porta,num ret ZERO: ldi num,0b00111111 out porta,num ret REPEAT: cli ;режим "ПОВТОР" rcall INDICATE tst hrs breq PUMP rcall del_h dec hrs rcall INDICATE rcall REPEAT PUMP: mov hrs,tmp ;відновлюємо дані rcall IND_LS sbis pinb,5 ;перевіряємо, якщо ДР=0, то rjmp REPEAT rcall PUMPING rjmp REPEAT PUMPING: ;підпрограма відкачки ldi m,1 sbi portb,1 ;оповіщаємо користувача sbi portb,2 ;та вмикаємо насос CONT: com m ;затримка 1 хв з анімацією mov num,m inc num andi num,1 breq INV ldi num,0b00000001 ;горить сегмент A out porta,num rcall del_s rcall del_s ldi num,0b00000011 ;B out porta,num rcall del_s rcall del_s ldi num,0b00000111 ;C out porta,num rcall del_s rcall del_s ldi num,0b00001111 ;D out porta,num rcall del_s rcall del_s ldi num,0b00011111 ;E out porta,num rcall del_s rcall del_s ldi num,0b00111111 ;F out porta,num rcall del_s rjmp CHK INV: ldi num,0b00111110 ;горить сегмент A out porta,num rcall del_s rcall del_s ldi num,0b00111100 ;B out porta,num rcall del_s rcall del_s ldi num,0b00111000 ;C out porta,num rcall del_s rcall del_s ldi num,0b00110000 ;D out porta,num rcall del_s rcall del_s ldi num,0b00100000 ;E out porta,num rcall del_s rcall del_s ldi num,0b00000000 ;F out porta,num rcall del_s CHK: rcall del_s sbic pinb,5 ;якщо рівень високий, то rjmp CONT ;відкачуємо й надалі ;якщо рівень став низьким, то cbi portb,1 ;відключаємо насос cbi portb,2 ;та сигналізацію відкачки clr hrs rcall INDICATE ret IND_LS: ;сповіщаємо щодо перевірки ДР: ;два рази блимає "d" clr num out porta,num rcall del_s ldi num,0b01011110 out porta,num rcall del_s clr num out porta,num rcall del_s ldi num,0b01011110 out porta,num rcall del_s clr num out porta,num ret EXT_INT0: ;зовнішнє переривання cpi hrs,9 ;якщо hrs <> 9, то brne SKIP ;не змінюємо його clr hrs ;інакше - hrs=0 rjmp S SKIP: inc hrs ;hrs = hrs - 1 S: mov tmp,hrs ;tmp = hrs rcall INDICATE reti del_s: ;затримка 0.5 сек push r16 push r17 push r18 ldi r18,65 del11: ldi r17,49 del12: ldi r16,52 del13: dec r16 brne del13 dec r17 brne del12 dec r18 brne del11 pop r18 pop r17 pop r16 ret del_h: ;затрима 1 година push r16 push r17 push r18 push r19 ldi r19,246 ;246 (109 для 5 сек) del34: ldi r18,140 ;140 (150 для 5 сек) del33: ldi r17,180 ;180 (10 для 5 сек) del32: ldi r16,195 ;195 (10 для 5 сек) del31: dec r16 brne del31 dec r17 brne del32 dec r18 brne del33 dec r19 brne del34 pop r19 pop r18 pop r17 pop r16 ret © 2010 Логинов Вадим |