;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 ;------------------------------------------------- ;Co to dela: ;Po spusteni plynule rozsviti a zhasle LED MAIN, behem toho houka s promennou frekvenci ;Povoli uspani zmenou stavu pinu PB7 ; Zapojeni: ; +------u------+ ; Vcc -> reset --+ /RST Vcc +-- napajeni +5V ; SW0 G --+ PD0 PB7 +---[wakeswitch]--GND ; SW1 G --+ PD1 PB6 +-- LED MAIN K ; --+ PA1 PB5 +-- LED 5 K ; Vcc-[speaker]----+ PA0 PB4 +-- LED 4 K ; SW2 G --+ PD2 PB3 +-- LED 3 K ; SW3 G --+ PD3 PB2 +-- LED 2 K ; SW4 G --+ PD4 PB1 +-- LED 1 K ; SW5 G --+ PD5 PB0 +-- LED 0 K ; GND --+ GND PD6 +-- ; +-------------+ ;"K" = katoda (ledka zapojena mezi Vcc a timhle pinem, aktivni je 0) ;"G" = ground (spinac mezi tomhle pionem a zemi, aktivni je 0) .device attiny2313 ;běží na 4MHz, ckdiv8=1 (vypnuto) ;LFUSE: 0xE2 ;HFUSE: 0xDF ;N A S T A V E N I V Y S I L A N E M O R S E O V K Y ;tecka mmorspart carka mznak mmezera mznak carka mmorspart .equ DelkaTecky = 3 ;delka tecky v desetinach .equ DelkaCarky = 14 ;3x delka tecky = delka carky .equ DelkaMezery = 6 ;mznak+tohle+mznak .equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene .equ MezeraZnak = 21 ;mezera za znakem .equ FrekvenceMorse = 50 ;62500/tohle Hz tón 42 ;.equ DelkaTecky = 4 ;delka tecky v desetinach ;.equ DelkaCarky = 14 ;3x delka tecky = delka carky ;.equ MezeraMorspart = 3 ;mezera mezi teckami/carkami v pismene ;.equ MezeraZnak = 14 ;mezera za znakem (pripojena za vnitrni mezeru) ;.equ FrekvenceMorse = 43 ;62500/tohle Hz ;K O N S T A N T Y + P R E Z D I V K Y P O U R T U A P I N U ;PORTA .equ SYSPORT = PORTA .equ SYSPIN = PINA .equ SYSDDR = DDRA .equ speak = 0 ;PORTB .equ LEDPORT = PORTB .equ LEDDDR = DDRB ;.equ LEDPIN = PINB ;.equ led0 = 0 ;.equ led1 = 1 ;.equ led2 = 2 ;.equ led3 = 3 ;.equ led4 = 4 ;.equ led5 = 5 .equ ledm = 6 ;.equ wakepin = 7 .equ AFTER_SLEEP = 0b10101010 ;informace ze byl predtim sleep ;PORTD .equ SWPORT = PORTD .equ SWPIN = PIND .equ SWDDR = DDRD ;.equ sw0 = 0 ;.equ sw1 = 1 ;.equ sw2 = 2 ;.equ sw3 = 3 ;.equ sw4 = 4 ;.equ sw5 = 5 ;A L I A S Y R E G I S T R U .def cmatch = r19 .def louter = r18 .def linner = r17 .def curchar = r25 .def morspart = r24 ;aliasy pointerů .def ZH = r31 .def ZL = r30 ;.def YH = r29 ;.def YL = r28 ;.def XH = r27 ;.def XL = r26 ; M A K R A ;Reprak (zapnuti a vypnuti pipani 1kHz) .MACRO BuzzOn sbi SYSPORT,speak ldi r16,(1< zhasni ledmain L1Ib: rjmp L1INNER L1DONE: cbi LEDPORT, ledm ;rozsvit ledku (pro jistotu) ;plynule zhasnuti ledm + klesajici ton ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) L2NEXTSTEP: inc cmatch ;sniz jas cpi cmatch,255 ;je jas=0? pak L2DONE breq L2DONE mov r16,cmatch SetTone ldi louter,20 ;vnejsi smycka (pocet cyklu se stejnym jasem) L2OUTER: dec louter ;je konec louter? pak novy jas breq L2NEXTSTEP ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu cbi LEDPORT,ledm ;rozsvit ledmain L2INNER: dec linner breq L2OUTER cp linner,cmatch ;je cmatch? brne L2Ib sbi LEDPORT,ledm ;jo -> zhasni ledmain L2Ib: rjmp L2INNER L2DONE: sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) ldi r16,1 ;prodleva, aby ton neznel tak uriznute rcall delay BuzzOff ;vypnout zvuk ;ted uz je dost douho po resetu, zepneme moznost uspani wakepinem ;vymaz zasobnik ext. preruseni in r16,EIFR andi r16,(1< aktivni budou 1 clr r24 ;priprav citac aktivnich jumperu clr r16 ;nulovej registr pro ADC (aby procetl jen carry) COUNTL: lsr r25 ;(r25>>1) bit 0 do carry adc r24,r16 ;pricti k citaci r24 carry (r16 je 0) cpi r25,0 ;je r25 prazdny? ne -> opakuj COUNTL brne COUNTL ;r24 obsahuje pocet zaplych bitu COUNTDONE: cpi r24,6 ;je 6 jumperu? brne TEST5 ldi ZH,high(TEXT6*2) ldi ZL,low(TEXT6*2) rjmp TESTDONE TEST5: cpi r24,5 ;je 5 jumperu? brne TEST4 ldi ZH,high(TEXT5*2) ldi ZL,low(TEXT5*2) rjmp TESTDONE TEST4: cpi r24,4 ;jsou 4 jumpery? brne TEST3 ldi ZH,high(TEXT4*2) ldi ZL,low(TEXT4*2) rjmp TESTDONE TEST3: cpi r24,3 ;jsou 3 jumpery? brne TEST2 ldi ZH,high(TEXT3*2) ldi ZL,low(TEXT3*2) rjmp TESTDONE TEST2: cpi r24,2 ;jsou 2 jumpery? brne TEST1 ldi ZH,high(TEXT2*2) ldi ZL,low(TEXT2*2) rjmp TESTDONE TEST1: cpi r24,1 ;je 1 jumper? brne TEST0 ldi ZH,high(TEXT1*2) ldi ZL,low(TEXT1*2) rjmp TESTDONE TEST0: ldi ZH,high(TEXT0*2) ;je 0 jumperu. ldi ZL,low(TEXT0*2) TESTDONE: ;Z obsahuje pointer na zacatek vysilaneho textu. ;Dalsi znak textu (nebo prvni) NextCharTxt: lpm curchar,Z+ ;do curchar nacti soucasny znak. Z je pointer na dalsi cpi curchar,0 breq EndCom ;curchar = 0? (konec komunikace) - jdi na konec push ZH ;uschovej Z pointer (bude pouzivan jako pointer tabulky) push ZL ;hledani znaku v tabulce ldi ZH,high(MORSE*2) ;zacatek MORSE tabulky do Z ldi ZL,low(MORSE*2) NextCharTbl: lpm morspart,Z+ ;precti znak z tabulky cpi morspart,0 ;je to 0? (= konec tabulky) breq CharDone ;pak jdi na CharDone cp morspart,curchar ;je to hledany znak? breq CharFound ;pak jdi na CharFound adiw ZL,7 ;jinak jdi na nasledujici znak v tabulce (1 z postincrementu + 7 dalsich bytu) rjmp NextCharTbl ;znak nalezen v tabulce CharFound: lpm morspart,Z+ ;nacti MorsPart cpi morspart,0 ;je to 0? (= konec znaku) breq CharDone ;pak jdi na CharDone cpi morspart,1 ;je to tecka? (=1) - zustan tady brne CARKA ;je to carka nebo mezera? (=3/4) - jdi na CARKA ;TECKA cbi LEDPORT, ledm ;rozsvit ledm BuzzOn ;zacni pipnuti ldi r16,DelkaTecky ;cekej podle DelkaTecky rcall delay BuzzOff ;konec pipnuti sbi LEDPORT, ledm ;zhasni ledm rjmp MorsPartDone ;konec morspartu -> MorsPartDone ;CARKA CARKA: cpi morspart,3 ;je to carka? (=3) - zustan tady brne MEZERA ;je to mezera? (=4) - jdi na MEZERA cbi LEDPORT, ledm ;rozsvit ledm BuzzOn ;zacni pipnuti ldi r16,DelkaCarky ;cekej podle DelkaCarky rcall delay BuzzOff ;konec pipnuti sbi LEDPORT, ledm ;zhasni ledm rjmp MorsPartDone ;konec morspartu -> MorsPartDone MEZERA: ldi r16,DelkaMezery ;cekej podle DelkaMezery rcall delay rjmp CharFound ;tecka/carka/mezera dokoncena MorsPartDone: ;konec morspartu (=tecka/carka) ldi r16,MezeraMorspart ;udelej mezeru rcall delay rjmp CharFound ;jdi na dalsi cast morspartu ;znak dokoncen CharDone: ldi r16,MezeraZnak ;mezera za znakem rcall delay pop ZL ;obnov pointer pro text pop ZH rjmp NextCharTxt ;jdi na dalsi znak textu EndCom: ldi r16,10 rcall delay BuzzOn ;plynule zhasnuti ledm + klesajici ton ldi cmatch,0 ;comparematch (cita se od 255 do 0, tady se ledka vypne) in r24,LEDPORT ;uloz stav ledportu cbr r24,0b01000000 ;zapni ledm sbr r24,0b10000000 ;zapni pullup ldi r23,0b11111111 ;priprav stav pro vypnute ledky L3NEXTSTEP: inc cmatch ;sniz jas cpi cmatch,255 ;je jas=255? pak L3DONE breq L3DONE mov r16,cmatch lsr r16 SetTone ldi louter,25 ;vnejsi smycka (pocet cyklu se stejnym jasem) L3OUTER: dec louter ;je konec louter? pak novy jas breq L3NEXTSTEP ldi linner,255 ;vnitrni smycka, stara se o regulaci jasu ;cbi LEDPORT,ledm ;rozsvit ledmain out LEDPORT,r24 ;zapni ledky L3INNER: dec linner breq L3OUTER cp linner,cmatch ;je cmatch? brne L3Ib ;sbi LEDPORT,ledm ;jo -> zhasni ledmain out LEDPORT,r23 ;zhasni ledky L3Ib: rjmp L3INNER L3DONE: sbi LEDPORT, ledm ;zhasni ledm (pro jistotu) ldi r16,2 ;prodleva, aby ton neznel tak uriznute rcall delay BuzzOff ;vypnout zvuk USNI: ;SLEEP (a po probuzeni skok na RESET) ldi r16,(1< reset ldi r16,2 ;cekej 0.2s rcall delay clr r5 ;vymazat navesti ze byl SLEEP clr r16 out GIMSK,r16 ;zakaz pinchange interrupt (general) sei rjmp RESET ;pri resetu se vynuluje SP a sei uz bylo, takze se reti delat nemusi. bude reset ;preruseni normalniho behu programu tlacitkem -> usnout NENIPOSLEEPU: ser r16 ;zhasne ledky out LEDPORT,r16 BuzzOff ;pro jistotu vypne speaker ldi r16,15 ;ceka 1.5 sekundy (aby se tlacitko urcite stihlo uvolnit -> jinak se udela dalsi "pinchange" a hned se to probudi) rcall delay in r16,EIFR ;vymaz zasobnik ext. preruseni (behem cekani bylo tlacitko pusteno -> vygenerovan dalsi interrupt) andi r16,(1<