Програма для мікроконтролера

В УКОВ застосовується мікроконтроллер 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 Логинов Вадим




Автобіографія | Автореферат | Індивідуальний розділ
ДонНТУ | Портал магістрів