Îñâàèâàåì AVR!

ONLINECHANGE

íîâîñòè  | ñ ÷åãî íà÷àòü? | ññûëêè | ó÷åáíèê | ïðèìåðû | ïðîãðàììàòîð | îòëàä÷èêè | îñöèëëîãðàô | äàâíî ýòî áûëî | download | ñîòðóäíè÷åñòâî | ïèøèòå ìíå

ïðèìåð îòëàäêè  | áåãóùèå îãíè | ÌèãàëêàÝêîíîìèì ðåñóðñ ÏÇÓ | Ðàáîòàåì ñ USART | 555

Íà ýòîé ñòðàíè÷êå âàì ïðåäëàãàåòñÿ äîñòàòî÷íî ïðîñòîé ïðèìåð, èäåþ êîòîðîãî ìíå ïðåäëîæèë kuznecov_s@bru3.uralkaly.ru. Íàäåþñü, ïðèìåð óäà÷íûé - âî ïåðâûõ, ïðîãðàììà (è ñàìî óñòðîéñòâî) äîñòàòî÷íî ïðîñòû, âî âòîðûõ - ðåçóëüòàò âåñüìà íàãëÿäåí. Ýòî ïðîñòåéøàÿ ïðîãðàììà äëÿ ðåàëèçàöèè ýôôåêòà "áåãóùèå îãíè", êîòîðóþ ïðè æåëàíèè ëåãêî ìîäèôèöèðîâàòü è ðàçâèâàòü äàëüøå.

Ñõåìà ïðîñòåéøèõ áåãóùèõ îãíåé äëÿ AT90s8535. Êâàðö 8 ÌÃö, ñâåòîäèîäû ëþáûå (íàïðèìåð ÀË307Á) 

Èòàê, çàäà÷à - äîñòàòî÷íî ïðîñòàÿ. Åñòü AVR, ê íåìó ïîäêëþ÷åíû 8 ñâåòîäèîäîâ è 2 êíîïêè. Ïðè íàæàòèè íà îäíó èç êíîïîê ãîðÿùèé ñâåòîäèîä áåæèò â îäíó ñòîðîíó, è íàîáîðîò. Ïóñòü ìû èñïîëüçóåì ãîðÿ÷î ìíîþ ëþáèìûé AT90s8535, ñâåòîäèîäû ïîäêëþ÷åíû ê ïîðòó PORTC, à êíîïêè - íà ïåðâûå äâà ïèíà ïîðòà PORTA. Íó, åñòåñòâåííî, íå çàáûòî ïðî ïèòàíèå è êâàðö...

À ïðîãðàììà áóäåò òàêàÿ:

 

;            +--------------------+
;------------|(c)nml, 22-oct-2002 |-----------------------------
;            +--------------------+
; íó, â îáùåì, ïðèêèíåì ïðîñòåéøèå ñâåòîâûå ýôôåêòû äëß AVR
; ïóñòü áóäåò òàê (äëß íà÷àëà): íà PORTC ïîäêëþ÷åíû 8 ñâåòîäèîäîâ,
; íà PORTA.0 è PORTA.1 ïîäêëþ÷åíû êíîïêè, çàìûêàíèå íà çåìëþ.
; Ïðè íàæàòèè íà êíîïêè - ïóñòü "âåðòèòñß" îäèí ãîðßøèé, â ðàçíûõ
; íàïðàâëåíèßõ. Ñêîðîñòü (ïîêà) ôèêñèðîâàíà.
; Ñâåòîäèîäû ïîäêë. òàê, ÷òîáû ãîðåëè ïðè ïîäà÷å "0"
;---------------------------------------------------------------
; Íó ÷å, ïðèñòóïèì? :-) áåç óìíè÷àíüß (ïðåðûâàíèé è ïðî÷åãî)
;---------------------------------------------------------------
	.include "8535def.inc"	; òóò îïðåäåëßþòñß èìåíà ðåãèñòðîâ
				; ñïåö ôóíêöèé è ïðî÷åå ñèìâîëüíîå
	; äëß óäîáñòâà îïðåäåëèì ñèìâîëüíûå èìåíà ðåãñòðîâ
	; âåäü COUNTER ïðè ÷òåíèè ïðîãðàììû ãîðàçäî ïîíßòíåå,
	; ÷åì R22 :-)
.def	TMP	= R16	; èñïîëüçóåì ðåã íà÷èíàß ñ 16, òàê êàê íàì
.def	VERT	= R17	; ìíîãî íå íàäî, à ìëàäøèå íå ìîãóò èñï â
.def	COUNT1	= R18	; îïåðàöèßõ ñ íåïîñðåäñòâåííûì îïåðàíäîì
.def	COUNT2	= R19	; ÷òî èíîãäà íåóäîáíî
.def	COUNT3	= R20	;
;.def		= R21	;
;.def		= R22	;
;.def		= R23	;
;.def		= R24	;
;.def		= R25	; âñå, äàëüøå ïîøëè ïàðû óêàçàòåëåé X,Y,Z
			; âïðî÷åì, ïðè íåîáõîäèìîñòè ìîæíî è èõ
			; èñïîëüçîâàòü, ýòî îáû÷íûå ðåãèñòðû
	.org	0	; ïî âêë ïèò-ß èëè ñáðîñó ïðîãðàììà ñòàðòóåò ñ 0
	rjmp	START	;\
	.org	0x50	; ñóòü ïîäîáíîãî "ñòàðòà" îïèñàíà ó ìåíß íà ñàéòå,
START:			;/ñîõðàíåíèå ðåñóðñà
	; èíèöèàëèçèðóåìñß. Íó, âî ïåðâûõ, íàäî óñòàíîâèòü óêàçàòåëü
	; ñòåêà, ïðåðûâàíèß è ïîäïðîãðàììû áåç ýòîãî ðàáîòàòü íå áóäóò
	; Îí óñòàíàâëèâàåòñß íà êîíåö ÎÇÓ (ñòåê ðàñòåò âíèç)
	ldi	TMP,low(RAMEND)	; ramend îïðåäåëåíî â .inc òàê êàê
	out	SPL,TMP		; äëß ðàçíûõ ïðîöåññîðîâ ðàçíûå
	ldi	TMP,high(RAMEND)
	out	SPH,TMP
	; ãîòîâî. TMP èñïîëüçîâàëè êàê ïåðåâàëî÷íóþ áàçó, âûâîä
	; âîçìîæåí òîëüêî èç ðåãèñòðà.
	; òåïåðü íàäî îïðåäåëèòü êàê áóäåò ðàáîòàòü ïîðò. Äëß ýòîãî
	; åñòü ðåãèñòð DDRx - çàïèñûâàß â ñîîòâåòñòâóþùèé ðàçðßä "1",
	; îïðåäåëßåì òîò æå ðàçðßä PORTx êàê âûõîäíîé. Åñëè "0" - òî
	; âõîäíîé, ïðè ýòîì çàïèñü "1" â PORTx ïîäêëþ÷èò ïîäòßãèâàþùèé
	; ðåçèñòîð íà +
	ser	TMP		; =FF
	out	DDRC,TMP	; PORTC-âñå âûõîäíûå
	out	PORTA,TMP	; PORTA ïî óìîë÷àíèþ íà ââîä, çàïèñü "1"
				; íóæíà äëß ïîäòßãèâàþùèõ ðåçèñòîðîâ
	ldi	VERT,0xFE	; ýòî òî, ÷òî âåðòåòüñß áóäåò
				; âïðî÷åì, ìîæíî è äðóãîå ÷èñëî....
				; íàïðèìåð,0x0F - áóäóò 4 ãîðßùèõ.
	; íó âîò è âñß, íàâåðíîå, èíèöèàëèçàöèß.
	; ïðåðûâàíèß âñå ïîñëå ñòàðòà çàïðåùåíû, íè÷åãî ïåðåîïðåäåëßòü
	; íå íàäî.
	; òåïåðü íàì äëß ïîëó÷åíèß ýôôåêòà "áåãóùåãî îãíß" íàäî, â îáùåì-òî,
	; ñäåëàòü ïàóçó (åñëè âåðòåòü ñ ÷àñòîòîé â 1 êãö - íå óâèäèøü íè÷åãî),
	; ïîòîì â çàâèñèìîñòè îò íàæàòîé êíîïêè ñäâèíóòü âïðàâî èëè âëåâî,
	; íå çàáûòü âûâåñòè â ïîðò è îïßòü íà ïàóçó. Èòàê:
LOOP:
	out	PORTC,VERT	; ñîáñòâåííî âûâîä â ïîðò. ñþäà ïðèäåì ïîñëå
				; êàæäîãî ñäâèãà!
	ldi	COUNT3,16	; ñì. íà ôîðìèðîâàíèå çàäåðæêè
WAIT:
	dec	COUNT1
	brne	WAIT		; ýòî äàñò 256*3 òàêòà = 96 ìêñ ïàóçó. ìàëîâàòî!
	dec	COUNT2
	brne	WAIT		; ãðóáî ýòî óìíîæèò íà 256, 25 ìñ - òîæå ìàëî...
				; íàì áû 0,4ñåê=100 ìñ - åùå íà 16 óìíîæèòü.
	dec	COUNT3
	brne	WAIT
	; âñå, ïàóçà êîí÷èëàñü. òåïåðü ñìîòðèì íà êíîïêè
	; ê÷òàòè, âðåìß ñ÷èòàëîñü èñõîäß èç 8ìÃö òàêòîâîé
	in	TMP,PINA	; ââîä íå èç PORTx, à PINx!
	; òóò åñëè êí íàæàòà, òî ñîîòâ áèò áóäåò =0
	sbrs	TMP,0	; ýòà êîìàíäà ïðîïóñòèò ñëåäóþùóþ, åñëè áèò TMP.0=1
	rjmp	vlevo	; òî åñòü åñëè ïåðâàß êíîïêà íå íàæàòà
	sbrs	TMP,1
	rjmp	vpravo	; -//- âòîðàß
	rjmp	LOOP		; åñëè íè÷åãî íå íàæàòî, òî è íå äåëàòü íè÷åãî
;-----------------------------------------------------------------------------
; à âîò òóò ñîáñòâåííî îñóùåñòâëßåì ñäâèãè. Òóò íàäî èìåòü â âèäó, ÷òî ó AVR
; åñòü òîëüêî ñäâèã ÷åðåç "C" ðàçðßä, à íàì áû íàäî ñðàçó èç 7 â 0 è íàîáîðîò!
;-----------------------------------------------------------------------------
vlevo:
	mov	TMP,VERT	; âî âðåìåííûé
	rol	TMP		; ðåçóëüòàò ïî áàðàáàíó, ãëàâíîå C áèò
	rol	VERT		; òóò â 0 âäâèíåòñß ñòàðøèé!
	rjmp	LOOP		; âûâåäåòñß òàì!
;--------------
vpravo:
	mov	TMP,VERT	;
	ror	TMP		;
	ror	VERT		;
	rjmp	LOOP		; òóò, â îáùåì-òî, âñå àíàëîãè÷íî
;------------
	.exit		
; âñå, ïîñëå ýòîãî óæå íå òðàíñëèðóåòñß!
----------------------------------------------------------
 âîò è âñå... ïî èäåå, äîëæíî ðàáîòàòü.
 ïàßòü ýòî äëß ïðîâåðêè êàê-òî ëåíèâî.
----------------------------------------------------------
Äà, ïðè íàæàòèè íà îáå êíîïêè ðàáîòàòü áóäåò êàê ïðè íàæàòîé ïåðâîé,
òóò ïîëó÷àåòñß ïðèîðèòåò. À ìîæíî áûëî áû ïîñëå ââîäà ñ PINA ñäåëàòü
	andi	TMP,3		; îñòàâèòü 2 ìë áèòà
	breq	oba_nazaty	; åñëè ÎÁÀ íóëè, òî íà îòäåëüíóþ âåòâü
				; íàïðèìåð, çàæå÷ü âñå ñâåòîäèîäû...
Âîîáùå òóò ãðîìàäíåéøèé ïðîñòîð äëß ôàíòàçèè.
- ñäåëàòü íå íà 8, à 16 è áîëåå (31 ìàõ) ñâåòîäèîäîâ
- ïîäêëþ÷èòü ïîòåíöèîìåòð íà âõîä ÀÖÏ è ïëàâíî èçìåíßòü ñêîðîñòü âðàùåíèß
- êðóòèòü íå "1", à õðåíîâó òó÷ó ðàçíûõ êîìáèíàöèé, ýôôåêòîâ ïðèäóìàòü
  ìîæíî ìíîãî... (íàïðèìåð 2 ïîñëåäíèõ ïî èñêë ÈËÈ íà ïåðâûé)
- ñäåëàòü ïëàâíîå çàæèãàíèå/ãàøåíèå (òèïà çâåçäíîãî íåáà â Íîðòîíå)
- óïðàâëßòü âñåé ýòîé õðåíüþ ñ êîìïà ïî RS232 (íóæíà ñõåìà ñîãëàñîâàíèß
  óðîâíåé, íà êîìïå +-12V) âïðî÷åì, ñõåìà íåñëîæíàß.

 

Âîò, ñîáñòâåííî, è âñÿ ïðîãðàììà. Äàæå ïðîâåðåíî (íå ïîëåíèëñÿ òàêè) - ðàáîòàåò :-) Æåëàþ óñïåõà!

 
Íàéäè íà Áåãóíå:
Èíòåðíåò-óñëóãè è ñåðâèñû Èíòåðíåò-óñëóãè è ñåðâèñû
Êîìïüþòåðû è îðãòåõíèêà Êîìïüþòåðû è îðãòåõíèêà
Áûòîâàÿ òåõíèêà Áûòîâàÿ òåõíèêà
Ñâÿçü Ñâÿçü
Àâòî-ìîòî Àâòî-ìîòî
Âñå äëÿ äîìà è îôèñà Âñå äëÿ äîìà è îôèñà
Ïðîäàåì öåëåâûõ
ïîñåòèòåëåé!

(ñ)nml 08-Dec-2006