; 4-Numitronove hodiny ATtiny24A / 24 / 24V ; 24bit SIPO reg. ... 3x TPIC6B595N ; krystal 4 MHz ; DANYK ; danyk.cz/avr_num.html .NOLIST .INCLUDE "tn24def.inc" .LIST .DEF PRECH=R0 ;2 bajty pro pomale PWM prechazeni .DEF PRECH2=R1 ; .DEF MIN1_P=R2 ;predchozi stav cifer (pro pomaly PWM prechod) .DEF MIN2_P=R3 ; .DEF HOD1_P=R4 ; .DEF HOD2_P=R5 ; .DEF PROVOZ1=R6 ;3 bajty pocitadla provoznich hodin .DEF PROVOZ2=R7 ; .DEF PROVOZ3=R8 ; .DEF JAS=R9 ;jas displeje .DEF BAT=R10 ;napajeni z baterie (bit7 = 0) / ze site (bit7 = 1) .DEF NULA=R11 ;0 .DEF CIF1=R12 ;cifry sekund - nejsou zobrazeny, jen pro pocitani .DEF CIF2=R13 ; .DEF ZVONI=R14 ;0=nezvoni, 1=zvoni budik .DEF DELREG=R15 ;deleni ze 100Hz na 1Hz .DEF REG=R16 ;docasny registr 1 .DEF REG2=R17 ;docasny registr 2 .DEF CIF3=R18 ;cifry .DEF CIF4=R19 ; .DEF CIF5=R20 ; .DEF CIF6=R21 ; .DEF SEK1=R22 ;sekundy .DEF SEK2=R23 ;10ky sekund .DEF MIN1=R24 ;minuty .DEF MIN2=R25 ;10ky minut .DEF HOD1=R26 ;hodiny .DEF HOD2=R27 ;10ky hodin ;.DEF TECKY=R28 ;stav tecek .DEF MODREG=R29 ;registr modu .EQU STAV_TLAC=0x0060 ;předchozí stav tlačítek .EQU PRODL_TLAC=0x0061 ;odpočítává prodlevu tlač. do další reakce .EQU DOBA_TLAC=0x0062 ;doba stisku tlacitka mod .EQU BUDIK1=0x0063 .EQU BUDIK2=0x0064 .EQU BUDIK3=0x0065 .EQU BUDIK4=0x0066 .EQU BUDIK_MOD=0x0067 .EQU EE_BYTE1=95 .EQU EE_BYTE2=96 .EQU EE_BYTE3=97 .EQU SMER=DDRA ;PORT .EQU PORT=PORTA .EQU PINY=PINA .EQU SMER2=DDRB ;PORT2 .EQU PORT2=PORTB .EQU PINY2=PINB .CSEG .ORG 0 RJMP START ; vnitrni preruseni citacem 1 .ORG ICP1addr RJMP CITAC ; vnitrni preruseni citacem 1 .ORG OC1Aaddr RJMP PREPNUTI ; vnitrni preruseni citacem 1 .ORG OC1Baddr RJMP VYPNUTI START: CLI LDI REG,LOW(RAMEND) OUT SPL,REG ;nastaví port A LDI REG,0b00111100 OUT SMER,REG LDI REG,0b01100011 OUT PORT,REG ;nastaví port B LDI REG,0b000 OUT SMER2,REG LDI REG,0b100 OUT PORT2,REG ;NASTAVI WATCHDOG (WDTON je programmed) WDR ;spusti casovanou sekvenci LDI REG,0b00011000 OUT WDTCSR,REG ;ulozi hodnotu preddeleni (WDP3:0 = 0b0001 ... 4K ... 32ms) LDI REG,0b00001001 OUT WDTCSR,REG ; vynuluje/presnastavi registry ;CLR TECKY LDI REG,99 MOV DELREG,REG LDI REG,6 MOV JAS,REG LDI MODREG,1 CLR BAT CLR ZVONI CLR PRECH CLR PRECH2 CLR NULA CLR REG CLR REG2 MOVW SEK1,REG MOVW MIN1,REG MOVW HOD1,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG MOVW MIN1_P,REG MOVW HOD1_P,REG STS STAV_TLAC,REG STS PRODL_TLAC,REG STS DOBA_TLAC,REG STS BUDIK_MOD,REG STS BUDIK1,REG STS BUDIK2,REG STS BUDIK3,REG STS BUDIK4,REG ; jen pro test - zobrazi 1234 ;LDI CIF3,4 ;LDI CIF4,3 ;LDI CIF5,2 ;LDI CIF6,1 ;--------------- ; 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 A PRERUSENI ; ---------------------------------------------------------------------- LDI REG,0b00000000 ; tohle se nastavi dal az pri zvonicim budiku OUT TCCR0A,REG ; LDI REG,0b00000010 ; deleni 8 OUT TCCR0B,REG ; LDI REG,159 ; porovnavana hodnota OUT OCR0A,REG ; LDI REG,0b00110000 ; Compare match nastavi OC1B na 1 (vypne displej) OUT TCCR1A,REG ; CTC LDI REG,0b00011010 ; preddeleni 8, max = ICR1 OUT TCCR1B,REG LDI REG,HIGH(4999) ; nastavi porovnavanou hodnotu OUT ICR1H,REG ; -horni byte z 16-bit cisla LDI REG,LOW(4999) ; nastavi porovnavanou hodnotu OUT ICR1L,REG ; -dolni byte z 16-bit cisla LDI REG,HIGH(128) ; nastavi porovnavanou hodnotu OUT OCR1BH,REG ; -horni byte z 16-bit cisla LDI REG,LOW(128) ; nastavi porovnavanou hodnotu OUT OCR1BL,REG ; -dolni byte z 16-bit cisla LDI REG,HIGH(64) ; nastavi porovnavanou hodnotu OUT OCR1AH,REG ; -horni byte z 16-bit cisla LDI REG,LOW(64) ; nastavi porovnavanou hodnotu OUT OCR1AL,REG ; -dolni byte z 16-bit cisla LDI REG,0b00100100 ; povoli preruseni ICP1 pri top (= 4999) a OCIE1B OUT TIMSK1,REG ; ;zjisti, zda je EEPROM pocitadla provoz. hodin pripravena (bajt EE_BYTE3 neni 0xFF). ;pokud bajt EE_BYTE3 = 0xFF, nastavi vsechny bajty na 0x00. CEKEJ_EE_INIC: SBIC EECR,EEPE RJMP CEKEJ_EE_INIC LDI REG,EE_BYTE3 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR CPI REG,0xFF BRNE NEMAZAT_EE RCALL MAZAT_CELOU_EE NEMAZAT_EE: /* ;TEST !!!! ;pouze pro nahrani zkusebnich dat do EEPROM, jinak nechat zakoment. LDI REG2,EE_BYTE3 SMYCKA_A: SBIC EECR,EEPE RJMP SMYCKA_A OUT EEARL,REG2 OUT EEARH,NULA LDI REG,120 ;data do byte3 OUT EEDR,REG SBI EECR,EEMPE SBI EECR,EEPE LDI REG2,EE_BYTE2 SMYCKA_B: SBIC EECR,EEPE RJMP SMYCKA_B OUT EEARL,REG2 OUT EEARH,NULA LDI REG,250 ;data do byte2 OUT EEDR,REG SBI EECR,EEMPE SBI EECR,EEPE LDI REG2,EE_BYTE1 SMYCKA_C: SBIC EECR,EEPE RJMP SMYCKA_C OUT EEARL,REG2 OUT EEARH,NULA LDI REG,253 ;data do vsech byte1 OUT EEDR,REG SBI EECR,EEMPE SBI EECR,EEPE WDR DEC REG2 BRBC 2,SMYCKA_C */ ;hlavní smyčka SMYCKA: SEI ;povoli globalni preruseni SLEEP RJMP SMYCKA ;tohle smaze (vynuluje) celou vyuzivanou EEPROM na 0x00 !!!!!!!! ;pokud uz nejsou bajty 0x00 MAZAT_CELOU_EE: ;pri mazani zhasne displej LDI REG,0b01000000 ; Force output compare OC1B OUT TCCR1C,REG ; LDI REG2,EE_BYTE3 SMYCKA_MAZ_EE: SBIC EECR,EEPE RJMP SMYCKA_MAZ_EE OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR CPI REG,0 BREQ NEMUSI_MAZAT SMYCKA_MAZ_EE2: SBIC EECR,EEPE RJMP SMYCKA_MAZ_EE2 OUT EEARL,REG2 OUT EEARH,NULA OUT EEDR,NULA SBI EECR,EEMPE SBI EECR,EEPE NEMUSI_MAZAT: WDR DEC REG2 BRBC 2,SMYCKA_MAZ_EE RET ;zavola se kazdou minutu POMALY_PRECHOD: CLR PRECH INC PRECH CLR PRECH2 OUT OCR1AH,PRECH2 ; -horni byte z 16-bit cisla OUT OCR1AL,PRECH ; -dolni byte z 16-bit cisla SBI TIMSK1,OCIE1A ;povoli OCIE1A SBI TIFR1,OCF1A ;a vymaze flag MOVW HOD1_P,HOD1 ;ulozi predchozi stav cifer MOVW MIN1_P,MIN1 RET VYPNUTI: ;pojistka, ze je displej opravdu vypnuty ;v tuhle chvili ale uz ma bejt vypnutej pomoci output compare match LDI REG,0b01000000 ; Force output compare OC1B OUT TCCR1C,REG ; SBI PORT,5 ; pojistka, kdyby se nahodou PA5 prepnul na normalni pin WDR DEC DELREG ;deleni f/100 (100 Hz na 1 Hz) BRBC 2,HOP LDI REG,99 MOV DELREG,REG RCALL PRIDEJS ;1x za sekundu inkrementuje cas o 1s CLR NULA HOP: RCALL TLACITKA RCALL PIPANI IN BAT,PINY SBRS BAT,7 RJMP BATERIE2 RCALL MOD RCALL OBNOVA ;posle do posuvnych regu novy stav ;pulz RCK ;protlaci ho na vystupni registry SBI PORT,4 NOP NOP NOP CBI PORT,4 CPI MODREG,1 ;pomaly prechod jen v modu 1 BRNE POMALY_NE SBIS TIMSK1,OCIE1A ;skok pokud je zapnute OCIE1A RJMP POMALY_NE ;nahraje stary stav jen pokud probiha prechod MOVW CIF5,HOD1_P ;nahraje do cifer stary stav MOVW CIF3,MIN1_P RCALL OBNOVA ;posle do posuvnych regu stary stav POMALY_NE: BATERIE2: RETI ;prepne z noveho udaje na stary udaj ;PWM stareho se postupne snizuje ve prospech noveho PREPNUTI: CPI MODREG,1 ;pomaly prechod jen v modu 1 BRNE KONEC_PREP SBRS BAT,7 RJMP KONEC_PREP ;pulz RCK SBI PORT,4 NOP NOP NOP CBI PORT,4 KONEC_PREP: RETI ;preruseni (100Hz) CITAC: ;pricte jas k prechodu (postupne prechazi na nove zobrazeni) ADD PRECH,JAS ADC PRECH2,NULA ;nahraje novou hodnotu do OCR1A OUT OCR1AH,PRECH2 ; -horni byte z 16-bit cisla OUT OCR1AL,PRECH ; -dolni byte z 16-bit cisla ;nacte nastaveni jasu a vynasobi 128x MOV REG2,JAS CLR REG LSR REG2 ROR REG ;nastavi prah vypnuti PWM OUT OCR1BH,REG2 ; -horni byte z 16-bit cisla OUT OCR1BL,REG ; -dolni byte z 16-bit cisla ;zjisti, zda uz prah prechodu neni nad prahem vypnuti PWM CP PRECH,REG CPC PRECH2,REG2 BRLO PRECH_NEKONCI CBI TIMSK1,OCIE1A ;pokud je nad, zakaze OCIE1A SUB PRECH,JAS SBC PRECH2,NULA PRECH_NEKONCI: SBRS BAT,7 RJMP BATERIE ;zapne displej (OC1B nastavi na 0) LDI REG,0b00100000 ; Compare match nastavi OC1B na 0 (zapne displej) OUT TCCR1A,REG ; LDI REG,0b01000000 ; Force output compare OC1B OUT TCCR1C,REG ; LDI REG,0b00110000 ; Compare match nastavi OC1B na 1 (vypne displej) OUT TCCR1A,REG ; BATERIE: RETI ; zdroj prerusovaneho tonu pro budik, ovlada vystup OC0A PIPANI: LDI REG2,0b00000000 ; zrusi funkci OC0A LDI REG,1 CP ZVONI,REG ; pokud neni budik BRNE NEPIPAT ; nepipa SBRC SEK1,0 RJMP NEPIPAT SBRC DELREG,1 RJMP NEPIPAT LDI REG2,0b01000010 ; nastavi citac0 na CTC, toggle vystupu OC0A SBI SMER2,2 ; nastavi PB2 jako vystup (behem pipnuti) RJMP PIPATO NEPIPAT: CBI SMER2,2 ; nastavi PB2 jako vstup (aby bylo uplny ticho) SBI PORT2,2 ; a zapne pullup PIPATO: OUT TCCR0A,REG2 RET ;Pocitadlo provoznich hodin (pocita po 7-8 minutach) POC_PROVOZNI: ;pri provozu z baterie nepocita, protoze displej nesviti SBRS BAT,7 RET ;prevede minuty z BCD na cislo, ulozi do REG MOV REG,MIN2 LSL REG LSL REG ADD REG,MIN2 LSL REG ADD REG,MIN1 ;zjisti, zda nastala zapocitavana osmina hodiny ;pokud ano, do REG2 ulozi hodnotu 0-7, jinak 255 LDI ZH,HIGH(2*TABULKA_PROV) LDI ZL,LOW(2*TABULKA_PROV) ADD ZL,REG ADC ZH,NULA LPM REG2,Z ;pokud 255, konci CPI REG2,255 BRNE ZAPOCITAVANA RET ZAPOCITAVANA: ;prevede hodiny z BCD na cislo, ulozi do REG MOV REG,HOD2 LSL REG LSL REG ADD REG,HOD2 LSL REG ADD REG,HOD1 ;prevede hodiny na 12hodinovy tvar (hodnota je v rozmezi 0 - 11) CPI REG,12 BRLO DO_12 SUBI REG,12 DO_12: ;do REG se dostane adresa 0 az EE_BYTE1 podle toho, kolikata ;hodina v 12-hodinovem modu a osmina hodiny nastala LSL REG LSL REG LSL REG ADD REG,REG2 WDR ;nacte spodni bajt z EEPROM - ulozeny v kruhu CEKEJ_EE_CTE: SBIC EECR,EEPE RJMP CEKEJ_EE_CTE OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;ulozi spodni bajt do EEPROM - ulozeny v kruhu CEKEJ_EE_PISE: SBIC EECR,EEPE RJMP CEKEJ_EE_PISE OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMPE SBI EECR,EEPE CPI REG2,0 ;test preteceni spodniho bajtu BRNE EE_CARRY_NE WDR LDI REG,EE_BYTE2 ;adresa prostredniho bajtu ;nacte prostredni bajt z EEPROM CEKEJ_EE_CTE2: SBIC EECR,EEPE RJMP CEKEJ_EE_CTE2 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;ulozi prostredni bajt do EEPROM CEKEJ_EE_PISE2: SBIC EECR,EEPE RJMP CEKEJ_EE_PISE2 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMPE SBI EECR,EEPE CPI REG2,0 ;test preteceni prostredniho bajtu BRNE EE_CARRY_NE WDR LDI REG,EE_BYTE3 ;adresa horniho bajtu ;nacte horni bajt z EEPROM CEKEJ_EE_CTE3: SBIC EECR,EEPE RJMP CEKEJ_EE_CTE3 OUT EEARL,REG OUT EEARH,NULA SBI EECR,EERE IN REG2,EEDR ;inkrementuje ho INC REG2 ;test preteceni horniho bajtu CPI REG2,255 BRNE HORNI_NEPRETEK LDI REG2,254 HORNI_NEPRETEK: ;ulozi horni bajt do EEPROM CEKEJ_EE_PISE3: SBIC EECR,EEPE RJMP CEKEJ_EE_PISE3 OUT EEARL,REG OUT EEARH,NULA OUT EEDR,REG2 SBI EECR,EEMPE SBI EECR,EEPE EE_CARRY_NE: RET ;tenhle zázrak dělá počítání do 23:59:59 PRIDEJS: INC SEK1 ;zvýší SEK1 CPI SEK1,10 ;ověří, jestli tam neni 10 BRLO KONEC ;pokud ne, celé to končí CLR SEK1 ;pokud ano, vynuluje jí to INC SEK2 ;a zvýší SEK2 CPI SEK2,6 ;ověří, jestli tam neni 6 BRLO KONEC ;pokud ne, celé to končí CLR SEK2 ;pokud ano, vynuluje jí to PRIDEJM: RCALL POC_PROVOZNI ;pocitadlo provoznich hodin RCALL POMALY_PRECHOD INC MIN1 ;zvýší MIN1 CPI MIN1,10 ;ověří, jestli tam neni 10 BRLO KONECATEST ;pokud ne, celé to končí CLR MIN1 ;pokud ano, vynuluje jí to INC MIN2 ;a zvýší MIN2 CPI MIN2,6 ;ověří, jestli tam neni 6 BRLO KONECATEST ;pokud ne, celé to končí CLR MIN2 ;pokud ano, vynuluje jí to ;PRIDEJH: INC HOD1 ; zvýší cifru HOD1 CPI HOD1,10 ;ověří, jestli tam neni 10 BRLO KONTR24 ;pokud ne, skočí na kontrolu 24 LDI HOD1,0 ;pokud ano, vynuluje jí to INC HOD2 ;a zvýší cifru 6 KONTR24: CPI HOD1,4 ;kontrola, zda cifra HOD1 není 4 BRLO KONECATEST CPI HOD2,2 ;a zda současně cifra HOD2 není 2 BRLO KONECATEST CLR HOD1 ;pokud ano, je 24 hodin, dojde k... CLR HOD2 ;...nulování obou cifer KONECATEST: RCALL BUDIKTEST KONEC: RET BUDIKTEST: ;zjištuje, zda má nastat alarm - porovná s akt. časem LDS REG,BUDIK_MOD CPI REG,0 BREQ NEBUDIT TESTUJBUDIK: LDS REG,BUDIK1 CP REG,MIN1 LDS REG,BUDIK2 CPC REG,MIN2 LDS REG,BUDIK3 CPC REG,HOD1 LDS REG,BUDIK4 CPC REG,HOD2 BRNE NEBUDIT LDI REG,1 MOV ZVONI,REG ;zapne budik LDS REG,BUDIK_MOD CPI REG,1 ;pokud je budik jednorazovy, po spusteni signalu ho to deaktivuje. BRNE NEBUDIT STS BUDIK_MOD,NULA NEBUDIT: RET TLACITKA: ;Zjištění stavu tlačítek. LDS REG,PRODL_TLAC ;počítadlo prodlevy do další reakce CPI REG,0 BREQ UZJE0 DEC REG STS PRODL_TLAC,REG UZJE0: LDS REG2,STAV_TLAC ;Do REG2 načte předchozí stav tlačítek IN REG,PINY ;Zjistí stav tlačítek ANDI REG,0b11 STS STAV_TLAC,REG ;Uloží ho pro příští test CP REG2,REG ;pokud předchozí stav = současný, tlac. už nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimální prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT SBRS REG,0 RJMP NA_TLAC1 SBRS REG,1 RJMP NA_TLAC2 RJMP NEREAGOVAT NA_TLAC1: RCALL TLAC1 RJMP NEREAGOVAT NA_TLAC2: RCALL TLAC2 NEREAGOVAT: LDI REG2,5 ;určuje prodlevu do další reakce (x cca 10ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,0 STS PRODL_TLAC,REG2 SBRS REG,1 STS PRODL_TLAC,REG2 ;tady zacina vyhodnoceni dlouheho stisku CPI REG,0b00000011 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,100 BRNE NE100 LDI REG2,92 STS DOBA_TLAC,REG2 CPI REG,0 BREQ NA_TLAC_OBE_D SBRS REG,0 RJMP NA_TLAC1_D SBRS REG,1 RJMP NA_TLAC2_D NE100: RET NA_TLAC_OBE_D: RCALL TLAC_OBE_D RET NA_TLAC1_D: RCALL TLAC1_D RET NA_TLAC2_D: RCALL TLAC2_D RET MOD: ;CLR TECKY LDI ZL,LOW(MOD_SKOK) LDI ZH,HIGH(MOD_SKOK) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_SKOK: RJMP MOD0 RJMP MOD1 RJMP MOD2 RJMP MOD3 RJMP MOD4 RJMP MOD5 RJMP MOD6 RJMP MOD7 MOD0: MOD1: MOVW CIF3,MIN1 MOVW CIF5,HOD1 ;LDI TECKY,0b11 RET MOD2: ;nastavi mod budiku LDS CIF3,BUDIK_MOD CPI CIF3,2 BRNE BUD_M_HOTOVO LDI CIF3,7 BUD_M_HOTOVO: LDI CIF6,10 LDI CIF5,14 LDI CIF4,11 ;LDI TECKY,0b01 RET MOD3: ;nastavi minuty budiku LDS CIF3,BUDIK1 LDS CIF4,BUDIK2 LDI CIF5,14 LDI CIF6,10 ;LDI TECKY,0b10 RET MOD4: ;nastavi hodiny budiku LDI CIF3,14 LDI CIF4,10 LDS CIF5,BUDIK3 LDS CIF6,BUDIK4 ;LDI TECKY,0b01 RET MOD5: ;nastaveni minut MOVW CIF3,MIN1 LDI CIF5,10 LDI CIF6,10 ;LDI TECKY,0b11 RET MOD6: ;nastaveni hodin LDI CIF3,10 LDI CIF4,10 MOVW CIF5,HOD1 ;LDI TECKY,0b11 RET MOD7: ;pocitadlo provoznich hodin CLR CIF1 CLR CIF2 CLR CIF3 CLR CIF4 CLR CIF5 CLR CIF6 CLR PROVOZ1 CLR PROVOZ2 CLR PROVOZ3 CEKEJ_ZOBRAZ_EE3: SBIC EECR,EEPE RJMP CEKEJ_ZOBRAZ_EE3 LDI REG2,EE_BYTE3 OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN PROVOZ3,EEDR CEKEJ_ZOBRAZ_EE2: SBIC EECR,EEPE RJMP CEKEJ_ZOBRAZ_EE2 LDI REG2,EE_BYTE2 OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN PROVOZ2,EEDR LDI REG2,EE_BYTE1 SMYCKA_ZOBRAZ_EE: SBIC EECR,EEPE RJMP SMYCKA_ZOBRAZ_EE OUT EEARL,REG2 OUT EEARH,NULA SBI EECR,EERE IN REG,EEDR ADD PROVOZ1,REG ADC PROVOZ2,NULA ADC PROVOZ3,NULA LDI REG,255 CP PROVOZ3,REG BRNE PROVOZ_MAX_NE DEC PROVOZ3 PROVOZ_MAX_NE: DEC REG2 BRBC 2,SMYCKA_ZOBRAZ_EE ;deleni 8 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 LSR PROVOZ3 ROR PROVOZ2 ROR PROVOZ1 ;kontrola, zda neni nad 999 999 LDI REG,BYTE1(1000000) ;24-bitova podminka mensi nez 1 000 000 CP PROVOZ1,REG LDI REG,BYTE2(1000000) CPC PROVOZ2,REG LDI REG,BYTE3(1000000) CPC PROVOZ3,REG BRLO POD_1000000 LDI REG,9 MOV CIF1,REG MOV CIF2,REG MOV CIF3,REG MOV CIF4,REG MOV CIF5,REG MOV CIF6,REG RJMP KONEC_ZOBR_EE POD_1000000: ;prevod 24-bit na 6 BCD ZNOVU_6: LDI REG,BYTE1(100000) ;24-bitova podminka mensi nez 100 000 CP PROVOZ1,REG LDI REG,BYTE2(100000) CPC PROVOZ2,REG LDI REG,BYTE3(100000) CPC PROVOZ3,REG BRLO MENSI_6 LDI REG,BYTE1(100000) SUB PROVOZ1,REG ;24-bitove odcitani cisla 100 000 od vysledku LDI REG,BYTE2(100000) SBC PROVOZ2,REG LDI REG,BYTE3(100000) SBC PROVOZ3,REG INC CIF6 RJMP ZNOVU_6 MENSI_6: ZNOVU_5: LDI REG,BYTE1(10000) ;24-bitova podminka mensi nez 10 000 CP PROVOZ1,REG LDI REG,BYTE2(10000) CPC PROVOZ2,REG LDI REG,BYTE3(10000) CPC PROVOZ3,REG BRLO MENSI_5 LDI REG,BYTE1(10000) SUB PROVOZ1,REG ;24-bitove odcitani cisla 10 000 od vysledku LDI REG,BYTE2(10000) SBC PROVOZ2,REG LDI REG,BYTE3(10000) SBC PROVOZ3,REG INC CIF5 RJMP ZNOVU_5 MENSI_5: ZNOVU1000: LDI REG,LOW(1000) CP PROVOZ1,REG LDI REG,HIGH(1000) CPC PROVOZ2,REG ;16-bitova podminka mensi nez 1000 BRLO POD1000 LDI REG,LOW(1000) SUB PROVOZ1,REG ;16-bitove odcitani čísla 1000 od vysledku LDI REG,HIGH(1000) SBC PROVOZ2,REG INC CIF4 RJMP ZNOVU1000 POD1000: ZNOVU100: LDI REG,LOW(100) CP PROVOZ1,REG LDI REG,HIGH(100) CPC PROVOZ2,REG ;16-bitova podminka mensi nez 100 BRLO POD100 LDI REG,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SUB PROVOZ1,REG LDI REG,HIGH(100) SBC PROVOZ2,REG INC CIF3 RJMP ZNOVU100 POD100: ZNOVU10: LDI REG,10 ;8-bitova podminka mensi nez 10 CP PROVOZ1,REG BRLO POD10 LDI REG,10 SUB PROVOZ1,REG ;8-bitove odcitani čísla 10 od vysledku INC CIF2 RJMP ZNOVU10 POD10: MOV CIF1,PROVOZ1 KONEC_ZOBR_EE: IN REG,PINY SBRC REG,0 RJMP DOLNI_TROJ MOV CIF3,CIF4 MOV CIF4,CIF5 MOV CIF5,CIF6 LDI CIF6,12 RJMP KONEC_HORNI_TROJ DOLNI_TROJ: LDI CIF6,13 MOV CIF5,CIF3 MOV CIF4,CIF2 MOV CIF3,CIF1 KONEC_HORNI_TROJ: RET ; tlačítko narizovani (+) dlouze TLAC1_D: ; tlačítko narizovani (+) TLAC1: CP ZVONI,NULA BREQ TL1_REAG CLR ZVONI RET TL1_REAG: LDI ZL,LOW(MOD_NAR_SKOK) LDI ZH,HIGH(MOD_NAR_SKOK) ADD ZL,MODREG ADC ZH,NULA IJMP MOD_NAR_SKOK: RJMP MOD0_NAR RJMP MOD1_NAR RJMP MOD2_NAR RJMP MOD3_NAR RJMP MOD4_NAR RJMP MOD5_NAR RJMP MOD6_NAR RJMP MOD7_NAR MOD0_NAR: ;sem se to nikdy nedostane MOD1_NAR: ;JAS INC JAS LDI REG,18 ;max (n-1) CP JAS,REG BRLO KONEC_JAS LDI REG,1 ;min (n) MOV JAS,REG KONEC_JAS: RET MOD2_NAR: LDS REG,BUDIK_MOD INC REG CPI REG,3 BRLO KONEC_BM CLR REG KONEC_BM: STS BUDIK_MOD,REG RET MOD3_NAR: LDS REG2,BUDIK2 LDS REG,BUDIK1 INC REG ; zvýší cifru BUDIK1 CPI REG,10 ; ověří, jestli tam neni 10 BRLO MINB_DO CLR REG ; pokud ano, vynuluje jí to INC REG2 ; zvýší cifru BUDIK2 CPI REG2,6 ; ověří, jestli tam neni 6 BRLO MINB_DO CLR REG2 ; pokud ano, vynuluje jí to MINB_DO: STS BUDIK2,REG2 STS BUDIK1,REG RCALL BUDIKTEST RET MOD4_NAR: LDS REG,BUDIK3 LDS REG2,BUDIK4 INC REG CPI REG,10 BRLO KONTRB24 CLR REG INC REG2 KONTRB24: CPI REG2,2 BRLO KONECHB CPI REG,4 BRLO KONECHB CLR REG CLR REG2 KONECHB: STS BUDIK3,REG STS BUDIK4,REG2 RCALL BUDIKTEST RET MOD5_NAR: CLR SEK1 CLR SEK2 INC MIN1 ;zvýší MIN1 CPI MIN1,10 ;ověří, jestli tam neni 10 BRLO KONEC_NM ;pokud ne, celé to končí CLR MIN1 ;pokud ano, vynuluje jí to INC MIN2 ;a zvýší MIN2 CPI MIN2,6 ;ověří, jestli tam neni 6 BRLO KONEC_NM ;pokud ne, celé to končí CLR MIN2 ;pokud ano, vynuluje jí to KONEC_NM: RCALL BUDIKTEST RET MOD6_NAR: INC HOD1 ; zvýší cifru HOD1 CPI HOD1,10 ;ověří, jestli tam neni 10 BRLO KONTR24A ;pokud ne, skočí na kontrolu 24 LDI HOD1,0 ;pokud ano, vynuluje jí to INC HOD2 ;a zvýší cifru 6 KONTR24A: CPI HOD1,4 ;kontrola, zda cifra HOD1 není 4 BRLO KONECATESTA CPI HOD2,2 ;a zda současně cifra HOD2 není 2 BRLO KONECATESTA LDI HOD1,0 ;pokud ano, je 24 hodin, dojde k... LDI HOD2,0 ;...nulování obou cifer KONECATESTA: RCALL BUDIKTEST RET MOD7_NAR: ;prepinani hodnich a dolnich tri cifer se deje jinde RET ; tlačítko "mod" TLAC2: MOV REG,ZVONI CLR ZVONI CPI REG,0 BRNE MODKONEC DEC MODREG BRNE MODKONEC LDI MODREG,4 MODKONEC: RET ; tlacitko "mod" dlouze TLAC2_D: LDI MODREG,7 RET ; obe tlacitka dlouze TLAC_OBE_D: LDI MODREG,7 IN REG,PINY SBRS REG,6 ;pokud je propojka na PA6, smaze EEPROM RCALL MAZAT_CELOU_EE RET OBNOVA: MOV REG,CIF3 LDI REG2,7 ;pocet bitu na cifru RCALL DATLUJ MOV REG,CIF4 LDI REG2,7 ;pocet bitu na cifru RCALL DATLUJ MOV REG,CIF5 LDI REG2,7 ;pocet bitu na cifru RCALL DATLUJ MOV REG,CIF6 CPI REG,0 ;potlaci nulu na nejvyssi cifre BRNE NENI_0 LDI REG,10 NENI_0: LDI REG2,3 ;pocet bitu na cifru RCALL DATLUJ ;nastaveni data / SRCK ma 0 CBI PORT,3 CBI PORT,2 RET DATLUJ: ;CPI REG,16 ;BRLO ZOBRAZ_OK ;LDI REG,16 ;ZOBRAZ_OK: LDI ZH,HIGH(2*TABULKA_CIF) LDI ZL,LOW(2*TABULKA_CIF) ADD ZL,REG ADC ZH,NULA LPM REG,Z DATLUJ_SMYCKA: CBI PORT,2 SBRC REG,0 CBI PORT,3 SBRS REG,0 SBI PORT,3 LSR REG NOP NOP SBI PORT,2 DEC REG2 BRNE DATLUJ_SMYCKA RET TABULKA_PROV: .DB 255,255 .DB 255,0 .DB 255,255 .DB 255,255 .DB 255,255 .DB 1,255 .DB 255,255 .DB 255,255 .DB 255,255 .DB 2,255 .DB 255,255 .DB 255,255 .DB 255,3 .DB 255,255 .DB 255,255 .DB 255,255 .DB 255,4 .DB 255,255 .DB 255,255 .DB 255,255 .DB 5,255 .DB 255,255 .DB 255,255 .DB 255,255 .DB 6,255 .DB 255,255 .DB 255,255 .DB 255,7 .DB 255,255 .DB 255,255 TABULKA_CIF: .DB 0b11000000,0b11111001 ;0, 1 .DB 0b10100100,0b10110000 ;2, 3 .DB 0b10011001,0b10010010 ;4, 5 .DB 0b10000011,0b11111000 ;6, 7 .DB 0b10000000,0b10011000 ;8, 9 .DB 0b11111111,0b10111111 ;Nic, - .DB 0b11111101,0b10111011 ;horni, dolni .DB 0b10001000,0b10000110 ;A, E