;SETI navigation module of extraterrestrial spaceship BY Ondrej Hruska (c) 2011 ;------------------------------------------------- ; Zapojeni: ; +------u------+ ; Vcc -> reset --+ /RST Vcc +-- napajeni +5V ; SW0 G --+ PD0 PB7 +-- wakepin ; SW1 G --+ PD1 PB6 +-- LED MAIN K ; --+ PA1 PB5 +-- LED 5 K ; 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 +-- ; +-------------+ .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 .equ DelkaTecky = 5 ;delka tecky v desetinach .equ DelkaCarky = 15 ;3x delka tecky = delka carky .equ MezeraMorspart = 5 ;mezera mezi teckami/carkami v pismene .equ MezeraZnak = 16 ;mezera za znakem (pripojena za vnitrni mezeru) .equ FrekvenceMorse = 40 ;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 ;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 ;krouzeni cervenych ledek + pipani ldi r18,24 ;celkem 24 preklopeni ldi r17,0b11111110 ;posuvny registr - inicializace KRUH1: sbr r17,0b11000000 ;1 na nepouzite bity (ledky zhasnuty) out LEDPORT, r17 ;vystup lsr r17 ;rotuj doprava pres carry brcs KRUH1b ;neni carry? preskoc cbr r17,0b00100000 ;dopln mezeru na zacatek (emulace 6bitoveho posuvneho registru) KRUH1b: mov r16,r17 ;vypocet tonu pipnuti com r16 lsl r16 eor r16,r18 SetTone BuzzOn ;pipni ldi r16,2 rcall delay BuzzOff dec r18 brne KRUH1 ;neni-li to posledni preklopeni, opakuj K1DONE: DefaultTone ;nastav normalni ton = 1kHz (pro morseovku) ;zhasni vse ldi r16,0b11111111 out LEDPORT,r16 ;vypni ledky ldi r16,4 rcall delay ;cekej 0.4s ;ukaz co je zapojeno (cervenymi ledkami) in r25, SWPIN ;prijmout stav SWPORTu andi r25,0b00111111 ;ignoruj nepouzite piny mov r16,r25 sbr r16,0b01000000 out LEDPORT,r16 ;ukazat na LEDPORTu ;cekej 2 sekundy ldi r16,20 ;pauza 2s rcall delay ;spocitani zapnutych jumperu ;r25 obsahuje stav SWPINu (bity 0-5) sbr r25,0b11000000 ;zapni i nepouzite bity com r25 ;neguj (jumpery jsou na zem) -> 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? (=3) - 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: cbi LEDPORT, ledm ;rozsvit ledm BuzzOn ;zacni pipnuti ldi r16,DelkaCarky ;cekej podle DelkaTecky rcall delay BuzzOff ;konec pipnuti sbi LEDPORT, ledm ;zhasni ledm ;tecka/carka 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) L3NEXTSTEP: inc cmatch ;sniz jas cpi cmatch,255 ;je jas=0? 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 L3INNER: dec linner breq L3OUTER cp linner,cmatch ;je cmatch? brne L3Ib sbi LEDPORT,ledm ;jo -> zhasni ledmain 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 ;SLEEP (a po probuzeni skok na RESET) clr r16 out SWPORT,r16 ;vypni pullupy jumperu sbi SYSPORT, speak ;vypni speaker (pro jistotu) ser r16 out LEDPORT,r16 ;zhasni ledky, PB7 (ext. interrupt) pullup enabled ldi r16,(1<