; Nejjednodussi kodovy zamek s ATtiny24A / 24 / 24V ; int. RC 1MHz ; II. 2014 ; vytvoril: DANYK ; http://danyk.cz/avr_kod.html .NOLIST .INCLUDE "tn24def.inc" .LIST .DEF VOLIC=R15 ; vyhodnoceni propojky volici mody .DEF REG=R16 ; docasny registr .DEF REG2=R17 ; docasny registr 2 .DEF REG3=R18 ; docasny registr 3 .DEF STAV=R19 ; registr stavu zadavani noveho kodu (0...3) .DEF MULTREG=R20 ; registr si pamatuje stav multiplexu (3, 2, 1) .DEF SPRAVNY=R21 ; kod byl zadan spravne (0=ne, 255=ano) .DEF ZACHRANA=R22 ; ulozi stav zachranne propojky (0=ne, 255=ano) .DEF MOD=R23 ; mod provozu ; 0 = kodem odemkni, tlacitkem zamkni ; 1 = kodem odemkni, kodem zamkni ; 2 = pulzni ; 3 = pulzni ; 4 = pulzni .DEF DELIC=R24 ; delic frekvence pri casovani pulzu .DEF DELIC2=R25 ; delic frekvence 2 pri casovani pulzu .EQU SMER=DDRA ;PORT .EQU PORT=PORTA .EQU PINY=PINA .EQU SMER2=DDRB ;PORT .EQU PORT2=PORTB .EQU PINY2=PINB .EQU PRODL_TLAC=0x0060 ;prodleva tlacitek od dalsi reakce .EQU DOBA_TLAC=0x0061 ;meri dobu stisku tlacitka .EQU STAV_TLAC1=0x0062 ;predchozi stav tlacitek .EQU STAV_TLAC2=0x0063 ; .EQU STAV_TLAC3=0x0064 ; .EQU NEREAG=0x0065 ;aby nereagovalo vickrat za sebou .EQU KOD=0x0066 ;Zacatek prostoru pro zadany kod ve SRAM .EQU KOD2=0x0086 ;Zacatek prostoru pro 2. (kontrolni) kod ve SRAM .CSEG .ORG 0 RJMP START ; sem skoci program pri preruseni .ORG OC1Aaddr RJMP CITAC1 START: ;nastavi port LDI REG,0b00010000 OUT SMER,REG LDI REG,0b11101111 OUT PORT,REG LDI REG,LOW(RAMEND) OUT SPL,REG SER ZACHRANA IN REG,PINY2 SBRC REG,1 CLR ZACHRANA ;nastavi port LDI REG,0b00000000 OUT SMER,REG LDI REG,0b11111111 OUT PORT,REG ;nastavi port LDI REG,0b101 OUT SMER2,REG LDI REG,0b010 OUT PORT2,REG ; vypne analogovy komparator (setri energii). LDI REG,0b10000000 OUT ACSR,REG ; sleep mod IDLE LDI REG,0b00100000 OUT MCUCR,REG ; vypne ADC a USI (setri energii). LDI REG,0b00000011 OUT PRR,REG ; NASTAVENI CITACU/CASOVACU LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC), OC0 nevyuzit, deleni 256 LDI REG,0b00000000 ; OUT TCCR0B,REG LDI REG,255 ; porovnavana hodnota, vznikne 625Hz (multiplex 156,25Hz) OUT OCR0A,REG ; LDI REG,0b00000000 ; nastavi citac1 na CTC OUT TCCR1A,REG ; LDI REG,0b00001010 ; preddeleni 8 OUT TCCR1B,REG LDI REG,HIGH(415) ; nastavi porovnavanou hodnotu OUT OCR1AH,REG ; -horni byte z 16-bit cisla LDI REG,LOW(415) ; nastavi porovnavanou hodnotu OUT OCR1AL,REG ; -dolni byte z 16-bit cisla LDI REG,0b00000010 ; povoli preruseni OCIE1A OUT TIMSK1,REG ; ; vynuluje/prednastavi registry CLR STAV CLR SPRAVNY CLR VOLIC CLR DELIC CLR DELIC2 LDI MOD,1 LDI MULTREG,1 IN REG,PINY2 SBRS REG,1 CLR ZACHRANA ;nastavi port LDI REG,0b00010000 OUT SMER,REG LDI REG,0b11101111 OUT PORT,REG RCALL SMAZ_CIFRY IN REG,PINY2 SBRC REG,1 CLR ZACHRANA ;nastavi port LDI REG,0b00000000 OUT SMER,REG LDI REG,0b11111111 OUT PORT,REG SEI ;povoli globalni preruseni ;hlavni smycka SMYCKA: SLEEP RJMP SMYCKA TLACITKA: ;Zjištění stavu tlačítek. f je 100Hz LDS REG,PRODL_TLAC ;počítadlo prodlevy do další reakce CPI REG,0 BREQ UZJE0 DEC REG STS PRODL_TLAC,REG UZJE0: IN REG,PINY ;Nacte aktualni stav tlacitek (do REG) BST REG,7 ANDI REG,0b00001111 CPI MULTREG,2 BREQ MULT2 CPI MULTREG,3 BREQ MULT3 ;MULT1: LDS REG2,STAV_TLAC1 ;Do REG2 načte předchozí stav tlačítek STS STAV_TLAC1,REG ;Ulozi aktualni stav tlacitek pro pristi test BLD VOLIC,0 LDI REG3,0b00000000 OUT SMER,REG3 LDI REG3,0b10111111 OUT PORT,REG3 LDI REG3,0b01000000 OUT SMER,REG3 RJMP KONEC_M MULT2: LDS REG2,STAV_TLAC2 ;Do REG2 načte předchozí stav tlačítek STS STAV_TLAC2,REG ;Ulozi aktualni stav tlacitek pro pristi test BLD VOLIC,1 LDI REG3,0b00000000 OUT SMER,REG3 LDI REG3,0b11101111 OUT PORT,REG3 LDI REG3,0b00010000 OUT SMER,REG3 RJMP KONEC_M MULT3: LDS REG2,STAV_TLAC3 ;Do REG2 načte předchozí stav tlačítek STS STAV_TLAC3,REG ;Ulozi aktualni stav tlacitek pro pristi test BLD VOLIC,2 LDI REG3,0b00000000 OUT SMER,REG3 LDI REG3,0b11011111 OUT PORT,REG3 LDI REG3,0b00100000 OUT SMER,REG3 ;RJMP KONEC_M KONEC_M: LDI REG3,1 CP REG2,REG ;pokud predchozi stav = soucasny, TL uz nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimalni prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT LDI REG3,0 NEREAGOVAT: STS NEREAG,REG3 LDI REG2,30 ;urcuje prodlevu do dalsi reakce (x 10ms) ;stisknuti/drzeni tlacitka nastavi prodlevu do dalsi reakce LDI REG3,0b00001111 CPSE REG,REG3 STS PRODL_TLAC,REG2 ;tady zacina vyhodnoceni dlouheho stisku CPI REG,0b00001111 BREQ NIC_NEDRZI LDS REG2,DOBA_TLAC INC REG2 STS DOBA_TLAC,REG2 NIC_NEDRZI: LDS REG2,PRODL_TLAC CPI REG2,0 BRNE PRODL_NE0 LDI REG2,0 STS DOBA_TLAC,REG2 PRODL_NE0: LDS REG2,DOBA_TLAC CPI REG2,170 ;doba dlouheho stisku (x 10ms) BRNE NE_DLST LDI REG2,0 ;frekvence opakovani (neco minus tohle) STS DOBA_TLAC,REG2 CPI REG,0b0111 BRNE NE_TLK_D CPI MULTREG,3 BRNE NE_TLK_D RJMP TLACK_D NE_TLK_D: NE_DLST: LDS REG3,NEREAG CPI REG3,0 BREQ KR_OK RJMP KR_NER KR_OK: CPI MULTREG,2 BREQ VETEV2 CPI MULTREG,3 BREQ VETEV3 ;VETEV1: CPI REG,0b1110 BRNE NE_TL1 RJMP TLAC1 NE_TL1: CPI REG,0b1101 BRNE NE_TL4 RJMP TLAC4 NE_TL4: CPI REG,0b1011 BRNE NE_TL7 RJMP TLAC7 NE_TL7: CPI REG,0b0111 BRNE NE_TLH RJMP TLACH NE_TLH: RJMP KONEC_V VETEV2: CPI REG,0b1110 BRNE NE_TL2 RJMP TLAC2 NE_TL2: CPI REG,0b1101 BRNE NE_TL5 RJMP TLAC5 NE_TL5: CPI REG,0b1011 BRNE NE_TL8 RJMP TLAC8 NE_TL8: CPI REG,0b0111 BRNE NE_TL0 RJMP TLAC0 NE_TL0: RJMP KONEC_V VETEV3: CPI REG,0b1110 BRNE NE_TL3 RJMP TLAC3 NE_TL3: CPI REG,0b1101 BRNE NE_TL6 RJMP TLAC6 NE_TL6: CPI REG,0b1011 BRNE NE_TL9 RJMP TLAC9 NE_TL9: CPI REG,0b0111 BRNE NE_TLK RJMP TLACK NE_TLK: ;RJMP KONEC_V KONEC_V: KR_NER: RET CIFRA: ;konec prostoru pro kod v RAM: CPI STAV,3 BREQ STAV3 LDI REG3,HIGH(KOD+31) LDI REG2,LOW(KOD+31) RJMP JINY_STAV_KONEC STAV3: LDI REG3,HIGH(KOD2+31) LDI REG2,LOW(KOD2+31) JINY_STAV_KONEC: CP ZL,REG2 CPC ZH,REG3 BRSH MAX_CIFER ST Z+,REG SER REG2 ST Z,REG2 RJMP NE_MAX_CIFER MAX_CIFER: RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA NE_MAX_CIFER: RET SMAZ_CIFRY: LDI ZH,HIGH(KOD) LDI ZL,LOW(KOD) SER REG ST Z,REG RET POROVNEJ: CLR SPRAVNY POROVNEJ_CEKA: SBIC EECR,EEPE RJMP POROVNEJ_CEKA LDI ZH,HIGH(KOD) LDI ZL,LOW(KOD) CLR REG3 POROVNEJ_DALSI: OUT EEARL,REG3 SBI EECR,EERE IN REG2,EEDR LD REG,Z+ INC REG3 CP REG,REG2 BRNE SPATNY CPI REG,10 BRLO POROVNEJ_DALSI SER SPRAVNY RJMP POROV_KONEC SPATNY: RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA POROV_KONEC: RET ZADANI_NOV: LDI ZH,HIGH(KOD) LDI ZL,LOW(KOD) DVOJICE_DALSI: LDD REG2,Z+32 LD REG,Z+ CP REG,REG2 BRNE DVOJICE_SPATNY CPI REG,10 BRLO DVOJICE_DALSI LDI ZH,HIGH(KOD) LDI ZL,LOW(KOD) CLR REG3 ULOZ_DALSI: ULOZ_CEKA: SBIC EECR,EEPE RJMP ULOZ_CEKA OUT EEARL,REG3 SBI EECR,EERE IN REG,EEDR LD REG2,Z+ CP REG,REG2 BREQ SHODA_EE OUT EEARL,REG3 OUT EEDR,REG2 SBI EECR,EEMPE SBI EECR,EEPE SHODA_EE: INC REG3 CPI REG2,10 BRLO ULOZ_DALSI CLR ZACHRANA RCALL FAMFARA RJMP ZADANI_KONEC DVOJICE_SPATNY: RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA RCALL PIP RCALL MEZERA RCALL PIP ZADANI_KONEC: CLR STAV CBI PORT2,2 RET TLAC1: LDI REG,1 RCALL CIFRA RCALL PIP RET TLAC2: LDI REG,2 RCALL CIFRA RCALL PIP RET TLAC3: LDI REG,3 RCALL CIFRA RCALL PIP RET TLAC4: LDI REG,4 RCALL CIFRA RCALL PIP RET TLAC5: LDI REG,5 RCALL CIFRA RCALL PIP RET TLAC6: LDI REG,6 RCALL CIFRA RCALL PIP RET TLAC7: LDI REG,7 RCALL CIFRA RCALL PIP RET TLAC8: LDI REG,8 RCALL CIFRA RCALL PIP RET TLAC9: LDI REG,9 RCALL CIFRA RCALL PIP RET TLAC0: LDI REG,0 RCALL CIFRA RCALL PIP RET TLACH: CLR DELIC CLR DELIC2 CBI PORT2,2 CPI STAV,0 BREQ NOV_NE CLR STAV RCALL SMAZ_CIFRY RJMP NEZAMKL NOV_NE: IN REG3,PORT2 CPI MOD,1 BRNE ZAMYKA_ROVNOU RCALL POROVNEJ IN REG3,PORT2 SBRC SPRAVNY,0 ZAMYKA_ROVNOU: CBI PORT2,0 RCALL SMAZ_CIFRY SBRS REG3,0 RJMP NEZAMKL SBIC PORT2,0 RJMP NEZAMKL RCALL ZAMK RJMP ZAMKL_KONEC NEZAMKL: RCALL PIP ZAMKL_KONEC: RET TLACK: CPI STAV,1 BREQ STAV_1 CPI STAV,2 BREQ STAV_2 CPI STAV,3 BREQ STAV_3 ;STAV_0: RCALL POROVNEJ IN REG3,PORT2 SBRC SPRAVNY,0 SBI PORT2,0 RCALL SMAZ_CIFRY SBRC SPRAVNY,0 RCALL NACASUJ CPI SPRAVNY,255 BRNE NEODEMKL SBRC REG3,0 RJMP NEODEMKL RCALL ODEMK RJMP ODEMKL_KONEC NEODEMKL: RCALL PIP ODEMKL_KONEC: RJMP KONEC_TLACK STAV_1: RCALL POROVNEJ RCALL SMAZ_CIFRY CLR STAV CBI PORT2,2 CPI SPRAVNY,255 BRNE SPRAVNY1_NE LDI STAV,2 SBI PORT2,2 RCALL PIIP RCALL MEZERA RCALL MEZERA RCALL PIIP RJMP KONEC_TLACK SPRAVNY1_NE: RCALL PIP RJMP KONEC_TLACK STAV_2: LDI ZH,HIGH(KOD2) LDI ZL,LOW(KOD2) SER REG ST Z,REG LDI STAV,3 RCALL PIIP RCALL MEZERA RCALL MEZERA RCALL PIIP RCALL MEZERA RCALL MEZERA RCALL PIIP RJMP KONEC_TLACK STAV_3: RCALL ZADANI_NOV RCALL SMAZ_CIFRY ;RJMP KONEC_TLACK KONEC_TLACK: RET TLACK_D: RCALL SMAZ_CIFRY SBI PORT2,2 LDI STAV,1 CPI ZACHRANA,255 BRNE ZACHRANA_NE LDI STAV,2 RCALL PIIP RCALL MEZERA RCALL MEZERA ZACHRANA_NE: RCALL PIIP RET MEZERA: LDI REG2,80 LDI REG,0 CEKEJ3: DEC REG BRNE CEKEJ3 DEC REG2 BRNE CEKEJ3 RET MEZERA2: LDI REG3,1 LDI REG2,0 LDI REG,0 CEKEJ4: DEC REG BRNE CEKEJ4 DEC REG2 BRNE CEKEJ4 DEC REG3 BRNE CEKEJ4 RET PIP: LDI REG,0b01000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC), LDI REG,0b00000010 ; OUT TCCR0B,REG LDI REG,50 ; porovnavana hodnota OUT OCR0A,REG ; LDI REG2,16 LDI REG,0 CEKEJ: DEC REG BRNE CEKEJ DEC REG2 BRNE CEKEJ LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000000 ; OUT TCCR0B,REG RET PIIP: LDI REG,0b01000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000010 ; OUT TCCR0B,REG LDI REG,50 ; porovnavana hodnota OUT OCR0A,REG ; LDI REG3,2 LDI REG2,128 LDI REG,0 CEKEJ2: DEC REG BRNE CEKEJ2 DEC REG2 BRNE CEKEJ2 DEC REG3 BRNE CEKEJ2 LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000000 ; OUT TCCR0B,REG RET FAMFARA: LDI REG,0b01000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000010 ; OUT TCCR0B,REG LDI REG,80 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA2 LDI REG,65 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA2 LDI REG,50 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA2 LDI REG,35 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA2 LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000000 ; OUT TCCR0B,REG RET ZAMK: LDI REG,0b01000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000010 ; OUT TCCR0B,REG LDI REG,45 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA LDI REG,70 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000000 ; OUT TCCR0B,REG RET ODEMK: LDI REG,0b01000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000010 ; OUT TCCR0B,REG LDI REG,70 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA LDI REG,45 ; porovnavana hodnota OUT OCR0A,REG ; RCALL MEZERA LDI REG,0b00000000 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC) LDI REG,0b00000000 ; OUT TCCR0B,REG RET NACASUJ: CPI MOD,2 BREQ CAS_2 CPI MOD,3 BREQ CAS_3 CPI MOD,4 BREQ CAS_4 RET CAS_2: LDI DELIC2,1 LDI DELIC,200 RET CAS_3: LDI DELIC2,3 LDI DELIC,88 RET CAS_4: LDI DELIC2,8 LDI DELIC,8 RET ;vyhodnoceni propojky modu PROPOJKA: MOV REG,VOLIC SWAP VOLIC CP REG,VOLIC BREQ JSOU2STEJNE RET JSOU2STEJNE: ANDI REG,0b111 CPI REG,0b111 BREQ VOLIC_0 CPI REG,0b110 BREQ VOLIC_2 CPI REG,0b101 BREQ VOLIC_3 CPI REG,0b011 BREQ VOLIC_4 RJMP VOLIC_1 VOLIC_0: LDI MOD,0 RET VOLIC_1: LDI MOD,1 RET VOLIC_2: LDI MOD,2 RET VOLIC_3: LDI MOD,3 RET VOLIC_4: LDI MOD,4 RET ; preruseni ridici multiplex a zdroj casovani CITAC1: RCALL TLACITKA DEC MULTREG BRNE HOP LDI MULTREG,3 RCALL PROPOJKA CLR REG CPI DELIC,0 CPC DELIC2,REG BREQ NULA DEC DELIC BRNE HOP DEC DELIC2 BRNE HOP RCALL ZAMK NULA: CPI MOD,2 BRLO HOP CBI PORT2,0 HOP: RETI