; hodiny ATtiny2313 s 4 ciframi, krystal 4MHz ; http://danyk.cz .NOLIST .INCLUDE "tn2313def.inc" .LIST .DEF REG=R16 .DEF MULTREG=R17 .DEF VTEREG=R18 .DEF CIF3=R19 ;minuty .DEF CIF4=R20 ;10ky minut .DEF CIF5=R21 ;hodiny .DEF CIF6=R22 ;10ky hodin .DEF PR_ST_TL=R23 ;předchozí stav tlačítek .DEF PRODL_TL=R24 ;odpočítává prodlevu tlač. do další reakce .EQU SMER=DDRB ;PORT displeje - anod segmentů .EQU PORT=PORTB .EQU SMER2=DDRD ;PORT multiplexu - katod segmentů, tlačítek .EQU PORT2=PORTD .EQU PINY2=PIND .CSEG .ORG 0 RJMP START .ORG OC1Aaddr RJMP CITAC1 .ORG OC0Aaddr RJMP CITAC0 START: ;nastaví port jako výstup LDI REG,0xFF OUT SMER,REG LDI REG,0xFF OUT PORT,REG ;nastaví bity 0,1,4,5 jako výstup ;nastaví bity 2,3 jako vstup a aktivuje vnitřní pullup odpory LDI REG,0b00110011 OUT SMER2,REG LDI REG,0b00001100 OUT PORT2,REG LDI REG,LOW(RAMEND) OUT SPL,REG ; NASTAVENI CASOVACU LDI REG,0b00000010 ; nastavi čítač na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC), OC0 nevyuzit, preddeleni 256 LDI REG,0b00000100 ; OUT TCCR0B,REG LDI REG,37 ; nastavi porovnavanou hodnotu (multiplex cca 100Hz) OUT OCR0A,REG ; LDI REG,0b00000000 ; nastavi c/c na nulovani pri dosazeni porovnavane... OUT TCCR1A,REG ; ...hodnoty (tzv. CTC), OC nevyuzit, preddeleni 256 LDI REG,0b00001100 ; 4MHz :256:15625= 1Hz OUT TCCR1B,REG LDI REG,0b00111101 ; nastavi porovnavanou hodnotu OUT OCR1AH,REG ; -horní byte z 16-bit čísla LDI REG,0b00001000 ; nastavi porovnavanou hodnotu OUT OCR1AL,REG ; -dolní byte z 16-bit čísla ; Bacha! dělí se n+1, nikoliv n LDI REG,0b01000001 ; povoli preruseni obou citacu OUT TIMSK,REG ; (bit 0 povoli citac0A, bit 6 povoli citac1A) LDI REG,0b00100000 ;povoli uspani (sleep) a nastavi mód idle OUT MCUCR,REG ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ; vynuluje/presnastavi registry LDI REG,0 ;pracovni registr LDI MULTREG,0 ;registr stavu multiplexu LDI VTEREG,60 ;vteriny LDI CIF3,0 LDI CIF4,0 LDI CIF5,0 LDI CIF6,0 LDI PR_ST_TL,0 LDI PRODL_TL,0 SEI ;povoli globalni preruseni ;hlavní smyčka SMYCKA: SLEEP RJMP SMYCKA MULT: LDI REG,0b00001100 OUT PORT2,REG CPI MULTREG,1 BREQ MULT1 CPI MULTREG,2 BREQ MULT2 CPI MULTREG,3 BREQ MULT3 CPI MULTREG,4 BREQ MULT4 ;Bity 2 a 3 jsou stále 1 kvůli pullup odporům vstupů tlačítek. MULT1: MOV REG,CIF3 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00001101 ;dá log1 na bit0 portu. OUT PORT2,REG RET MULT2: MOV REG,CIF4 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00001110 OUT PORT2,REG RET MULT3: MOV REG,CIF5 RCALL ZOBRAZ SUBI REG,128 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG LDI REG,0b00011100 OUT PORT2,REG RET MULT4: MOV REG,CIF6 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00101100 OUT PORT2,REG RET ZOBRAZ: CPI REG,0 BREQ ZOBRAZ0 CPI REG,1 BREQ ZOBRAZ1 CPI REG,2 BREQ ZOBRAZ2 CPI REG,3 BREQ ZOBRAZ3 CPI REG,4 BREQ ZOBRAZ4 CPI REG,5 BREQ ZOBRAZ5 CPI REG,6 BREQ ZOBRAZ6 CPI REG,7 BREQ ZOBRAZ7 CPI REG,8 BREQ ZOBRAZ8 CPI REG,9 BREQ ZOBRAZ9 ZOBRAZ0: LDI REG,0b11000000 RET ZOBRAZ1: LDI REG,0b11111001 RET ZOBRAZ2: LDI REG,0b10100100 RET ZOBRAZ3: LDI REG,0b10110000 RET ZOBRAZ4: LDI REG,0b10011001 RET ZOBRAZ5: LDI REG,0b10010010 RET ZOBRAZ6: LDI REG,0b10000010 RET ZOBRAZ7: LDI REG,0b11111000 RET ZOBRAZ8: LDI REG,0b10000000 RET ZOBRAZ9: LDI REG,0b10010000 RET ;tenhle zázrak dělá počítání do 23:59 PRIDEJM: INC CIF3 ;zvýší cifru 3 CPI CIF3,10 ;ověří, jestli tam neni 10 BRNE KONEC ;pokud ne, celé to končí LDI CIF3,0 ;pokud ano, vynuluje jí to INC CIF4 ;a zvýší cifru 4 CPI CIF4,6 ;ověří, jestli tam neni 6 BRNE KONEC ;pokud ne, celé to končí LDI CIF4,0 ;pokud ano, vynuluje jí to PRIDEJH: INC CIF5 ; zvýší cifru 5 CPI CIF5,10 ;ověří, jestli tam neni 10 BRNE KONTR24 ;pokud ne, skočí na kontrolu 24 LDI CIF5,0 ;pokud ano, vynuluje jí to INC CIF6 ;a zvýší cifru 6 KONTR24: CPI CIF5,4 ;kontrola, zda cifra 5 není 4 BRNE KONEC CPI CIF6,2 ;a zda současně cifra 6 není 2 BRNE KONEC LDI CIF5,0 ;pokud ano, je 24 hodin, dojde k... LDI CIF6,0 ;...nulování obou cifer KONEC: RET ; tlačítko nařizování hodin TLAC1: RCALL PRIDEJH RET ; tlačítko nařizování minut (při něm se nulují vteřiny) TLAC2: INC CIF3 ;zvýší cifru 3 CPI CIF3,10 ;ověří, jestli tam neni 10 BRNE KONECM ;pokud ne, celé to končí LDI CIF3,0 ;pokud ano, vynuluje jí to INC CIF4 ;a zvýší cifru 4 CPI CIF4,6 ;ověří, jestli tam neni 6 BRNE KONECM ;pokud ne, celé to končí LDI CIF4,0 KONECM: LDI VTEREG,60 RET ; přerušení řídící čas CITAC1: DEC VTEREG BRNE NIC RCALL PRIDEJM LDI VTEREG,60 ;60 znamena deleni 60!!! NIC: RETI ; přerušení řídící multiplex a tlačítka (volano 600x / s) CITAC0: RCALL MULT DEC MULTREG BRNE MULTHOP LDI MULTREG,4 RCALL TLACITKA MULTHOP: RETI TLACITKA: ;Zjištění stavu tlačítek. f je 100Hz CPI PRODL_TL,0 ;počítadlo prodlevy do další reakce BREQ UZJE0 DEC PRODL_TL UZJE0: IN REG,PINY2 ;Zjistí stav tlačítek ANDI REG,0b00001100 CP PR_ST_TL,REG ;pokud předchozí stav = současný, TL už nereaguje znovu BREQ NEREAGOVAT CPI PRODL_TL,0 ;pokud neuplynula minimální prodleva, nereaguje znovu BRNE NEREAGOVAT SBRS REG,2 RJMP NA_TLAC1 SBRS REG,3 RJMP NA_TLAC2 RJMP NEREAGOVAT NA_TLAC1: RCALL TLAC1 RJMP NEREAGOVAT NA_TLAC2: RCALL TLAC2 NEREAGOVAT: MOV PR_ST_TL,REG ;Uloží stav tlacitek pro příští test ;určuje prodlevu do další reakce (x 10ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,2 LDI PRODL_TL,5 SBRS REG,3 LDI PRODL_TL,5 RET