; Frekventometr 0,45 Hz - 10 MHz, rozliseni od 0,000 001 Hz, 7 cifer ; frekvence (f) v Hz, perioda (T) v us ; ATmega88 / 88A / 88P / 88PA ; 20MHz krystal, full swing oscilator, 4,5 - 5,5 V ; DANYK ; http://danyk.cz/avr_fmetr3.html ; -------------------------------------------------- .NOLIST .INCLUDE "m88def.inc" .LIST ;POZOR - R0 a R1 nechat pro nasobeni !!! .DEF CIF1=R2 ;nejnizsi cifra .DEF CIF2=R3 ; ... .DEF CIF3=R4 ; ... .DEF CIF4=R5 ; ... .DEF CIF5=R6 ; ... .DEF CIF6=R7 ; ... .DEF CIF7=R8 ; ... .DEF CIF8=R9 ; ... .DEF CIF9=R10 ; ... .DEF CIF10=R11 ; ... .DEF CIF11=R12 ; ... .DEF CIF12=R13 ; ... .DEF CIF13=R14 ;nejvyssi cifra .DEF NULA=R15 ;NULA .DEF REG=R16 ;docasny registr .DEF REG2=R17 ;docasny registr 2 .DEF ROZREG=R18 ; rozsah .DEF UDAJ1=R19 ; spodnich 8bitu 32-bitoveho vysledku .DEF UDAJ2=R20 ; .DEF UDAJ3=R21 ; .DEF UDAJ4=R22 ; hornich 8bitu 32-bitoveho vysledku .DEF MULTREG=R23 ; registr si pamatuje stav multiplexu .DEF DELREG=R24 ; registr deleni frekvence z cca 100Hz na cca 1 Hz .DEF STAV=R25 ; registr stavu (0-ceka na konec mereni, 1-ceka na zacatek). .DEF T0_2=R26 ; registry do kterych preteka 8-bitovy citac0 .DEF T0_3=R27 .DEF ICR_3=R28 ; registry do kterych preteka 16-bitovy citac1 .DEF ICR_4=R29 .EQU SMER=DDRD .EQU PORT=PORTD .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU SMER3=DDRB .EQU PORT3=PORTB .EQU VSTUPY3=PINB ; docasny prostor v RAM pro zbytek po deleni (ZB9:1) a pro BCD cifry (ZB13:1) .EQU ZB1=0x0100 .EQU ZB2=0x0101 .EQU ZB3=0x0102 .EQU ZB4=0x0103 .EQU ZB5=0x0104 .EQU ZB6=0x0105 .EQU ZB7=0x0106 .EQU ZB8=0x0107 .EQU ZB9=0x0108 .EQU ZB10=0x0109 .EQU ZB11=0x010A .EQU ZB12=0x010B .EQU ZB13=0x010C ; a pro ICR (mereni f) pripadne pocet pulzu (mereni T) .EQU IC1=0x010D .EQU IC2=0x010E .EQU IC3=0x010F .EQU IC4=0x0110 ; konstanta pro vynasobeni f (2 e 13) .EQU KONST=2632269824 .EQU KONST5=48 .EQU KONST6=18 ; konstanta pro vynasobeni T (50 000) .EQU KONST_T=50000 .CSEG .ORG 0 RJMP START ; vektory preruseni .ORG OC2Aaddr RJMP CASOVANI .ORG ICP1addr LDS REG,ICR1L ;zkopiruje ICR1L do REG a ICR1H do spec. docas. registru pro 16-bit operace RJMP ICP .ORG OVF1addr ADIW ICR_4:ICR_3,1 ;preteceni citace 1 do dvojice registru RETI .ORG OVF0addr ADIW T0_3:T0_2,1 ;preteceni citace 0 do dvojice registru RETI START: ;nastaví port D LDI REG,0b11101111 OUT SMER,REG LDI REG,0b11101111 OUT PORT,REG ;nastaví port C LDI REG,0b111111 OUT SMER2,REG LDI REG,0b000000 OUT PORT2,REG ;nastaví port B LDI REG,0b00110000 OUT SMER3,REG LDI REG,0b00011110 OUT PORT3,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG ; vynuluje/prednastavi registry CLR NULA LDI DELREG,0 LDI STAV,1 CLR ICR_3 CLR ICR_4 CLR T0_2 CLR T0_3 SER ROZREG ;vypne tecku LDI REG,0b01101111 ;zobrazi "- - - - - - -" dokud neco nezmeri MOV REG2,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG MOVW CIF7,REG MOVW CIF9,REG MOVW CIF11,REG MOV CIF13,REG LDI MULTREG,1 ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00000000 ; normalni mod OUT TCCR0A,REG ; LDI REG,0b00000000 ; citac 0 zastaven OUT TCCR0B,REG ; LDI REG,0 OUT TCNT0,REG LDI REG,0b00000001 ; povoli preruseni TOIE0 (preteceni) STS TIMSK0,REG ; LDI REG,0b00000000 ; normalni mod STS TCCR1A,REG ; LDI REG,0b01000001 ; IC nabeznou hranou, citani krystalem bez preddeleni (/1) STS TCCR1B,REG ; LDI REG,0b00100001 ; povoli preruseni ICIE1 a TOIE1 STS TIMSK1,REG ; LDI REG,0b00000010 ; mod CTC STS TCCR2A,REG ; LDI REG,0b00000110 ; preddeli 256 STS TCCR2B,REG ; LDI REG,111 ; nastavi porovnavanou hodnotu (deli se n+1) STS OCR2A,REG ; LDI REG,0b00000010 ; povoli preruseni CTC OCIE2A STS TIMSK2,REG ; ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;vypne TWI, SPI, USART, ADC - neni nikdy vyuzito (setri energii) LDI REG,0b10000111 STS PRR,REG ;nastavi mod spanku IDLE LDI REG,0b00000001 OUT SMCR,REG LDI REG,0b00000001 OUT TIFR0,REG ; vymaze flag TOV0 LDI REG,0b00100001 ; vymaze flag ICF1 a TOV1 OUT TIFR1,REG ; SEI ;povoli globalni preruseni ;hlavni smycka SMYCKA: SLEEP RJMP SMYCKA ; preruseni ridici multiplex a zdroj 1Hz CASOVANI: ;vypne anody OUT PORT2,NULA LDI REG,0b00010010 OUT PORT3,REG LDI ZL,LOW(MULT_SKOK) ;vetveni multiplexu, ktera cifra se rozsviti LDI ZH,HIGH(MULT_SKOK) ADD ZL,MULTREG ADC ZH,NULA IJMP MULT_ZPET: DEC MULTREG BRNE MULTHOP LDI MULTREG,7 ;cifer je 7 ; opakovaci f je 99,649235 Hz DEC DELREG ;dekrementuje BREQ CEKEJ_POSLEDNI ;je-li 0, zacne cekat na posledni nabeznou hranu BRVC MULTHOP ;je-li 127 (V=1), vyprsel cas a vynuluje displej a citac0, vypne mereni. LDI DELREG,0 ; pokud vyprsel cas, zobrazi "- - - - - - -" ... SER ROZREG LDI REG,0b01101111 MOV REG2,REG MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG MOVW CIF7,REG MOVW CIF9,REG MOVW CIF11,REG MOV CIF13,REG ; ... a zastavi a vynuluje citani OUT TCCR0B,NULA LDI STAV,1 CLR T0_2 CLR T0_3 OUT TCNT0,NULA LDI REG,0b00000001 OUT TIFR0,REG ; vymaze flag TOV0 LDI REG,0b00100000 ; vymaze flag ICF1 OUT TIFR1,REG ; MULTHOP: RETI CEKEJ_POSLEDNI: LDI REG,0b00100001 ; povoli preruseni ICIE1 a TOIE1 STS TIMSK1,REG ; LDI REG,0b00100000 ; vymaze flag ICF1 OUT TIFR1,REG ; RETI ;Zacne mereni pri pocatecni nabezne hrane - vynuluje a vypne ICP STAV_1: LDI REG,0b00000111 ; zapne taktovani citace0 - citani nabeznou hranou T0 OUT TCCR0B,REG ; ; vynuluje 32-bit casomiru CLR ICR_3 CLR ICR_4 STS TCNT1H,NULA STS TCNT1L,NULA LDI DELREG,100 ;merici perioda, x cca 10ms CLR STAV ;nastavi stav na 0 (probiha mereni) LDI REG,0b00000001 ;zakaze ICIE1 a povoli TOIE1 STS TIMSK1,REG ; LDI REG,0b00000001 ;vymaze flag TOV1 OUT TIFR1,REG ; RETI ICP: LDS REG2,ICR1H ; nacte kopii ICR1H ze spec. docas. registru pro 16-bit operace CPI STAV,0 ; zda je to pocatecni nebo konecna nabezna hrana BRNE STAV_1 ; pokud je konecna hrana, pokracuje dolu NOP ; kompenzace pocatecniho zpozdeni OUT TCCR0B,NULA ; zastavi citac 0 ; nacte 32-bitove mereni casu MOVW CIF3,ICR_3 MOVW CIF1,REG ; nacte 24-bitovy citac pulzu IN UDAJ1,TCNT0 MOVW UDAJ2,T0_2 ; nacte flag TOV0, pokud je 1, tak pricte k udaji zapomenute preteceni IN REG,TIFR0 ANDI REG,1 ADD UDAJ2,REG ADC UDAJ3,NULA ; kompenzace pocatecniho zpozdeni pri mereni casu - pocet cyklu (1cykl = 50ns) LDI REG,17 ADD CIF1,REG ADC CIF2,NULA ADC CIF3,NULA ADC CIF4,NULA ; ulozeni casu z docasneho umisteni do RAM STS IC1,CIF1 STS IC2,CIF2 STS IC3,CIF3 STS IC4,CIF4 RCALL VYPOCET ;provede vypocet frekv. nebo periody z namerenych udaju LDI STAV,1 ;stav nastavi na 1 (cekani na dalsi mereni, to zacne nejblizsi nabez. hranou) LDI DELREG,100 ;vynuluje citac pulzu CLR T0_2 CLR T0_3 OUT TCNT0,NULA LDI REG,0b00100001 ; povoli preruseni ICIE1 a TOIE1 STS TIMSK1,REG ; LDI REG,0b00000001 ; vymaze flag TOV0 OUT TIFR0,REG ; LDI REG,0b00100001 ; vymaze flag ICF1 a TOV1 OUT TIFR1,REG ; RETI VYPOCET: ; vynuluje CIF1 ... 13 CLR REG CLR REG2 MOVW CIF1,REG MOVW CIF3,REG MOVW CIF5,REG MOVW CIF7,REG MOVW CIF9,REG MOVW CIF11,REG MOV CIF13,REG CLR NULA ;vynuluje nulu :) ; prepinani mezi vypoctem f a T SBIC VSTUPY3,1 RJMP VYPO_F RCALL VYPOCET_T RJMP T_KONEC VYPO_F: RCALL VYPOCET_F T_KONEC: ; ---- Prevod 72-bit cisla (CIF9:1) na 13 BCD (CIF13:1) ---- ; docasne pouzije ZB13:ZB1 pro ulozeni BCD LDI REG,0x00 CP CIF1,REG ;72-bitova podminka mensi nez 10 000 000 000 000 LDI REG,0xA0 CPC CIF2,REG LDI REG,0x72 CPC CIF3,REG LDI REG,0x4E CPC CIF4,REG LDI REG,0x18 CPC CIF5,REG LDI REG,0x09 CPC CIF6,REG CPC CIF7,NULA CPC CIF8,NULA CPC CIF9,NULA CPC CIF10,NULA CPC CIF11,NULA CPC CIF12,NULA CPC CIF13,NULA BRLO DO_13_C LDI REG,10 ; mimo rozsah - zobrazi "- - - - - - -" MOV CIF13,REG MOV CIF12,REG MOV CIF11,REG MOV CIF10,REG MOV CIF9,REG MOV CIF8,REG MOV CIF7,REG MOV CIF6,REG MOV CIF5,REG MOV CIF4,REG MOV CIF3,REG MOV CIF2,REG MOV CIF1,REG SER ROZREG RJMP KONEC_OBNOVY DO_13_C: CLR REG STS ZB1,REG STS ZB2,REG STS ZB3,REG STS ZB4,REG STS ZB5,REG STS ZB6,REG STS ZB7,REG STS ZB8,REG STS ZB9,REG STS ZB10,REG STS ZB11,REG STS ZB12,REG STS ZB13,REG ZNOVU_13: LDI REG,BYTE1(3567587328) CP CIF1,REG ;48-bitova podminka mensi nez 1 000 000 000 000 LDI REG,BYTE2(3567587328) CPC CIF2,REG LDI REG,BYTE3(3567587328) CPC CIF3,REG LDI REG,BYTE4(3567587328) CPC CIF4,REG LDI REG,232 CPC CIF5,REG CPC CIF6,NULA BRLO MENSI_13 LDI REG,BYTE1(3567587328) SUB CIF1,REG ;48-bitove odcitani cisla 1 000 000 000 000 od vysledku LDI REG,BYTE2(3567587328) SBC CIF2,REG LDI REG,BYTE3(3567587328) SBC CIF3,REG LDI REG,BYTE4(3567587328) SBC CIF4,REG LDI REG,232 SBC CIF5,REG SBC CIF6,NULA LDS REG,ZB13 INC REG STS ZB13,REG RJMP ZNOVU_13 MENSI_13: ZNOVU_12: LDI REG,BYTE1(1215752192) CP CIF1,REG ;40-bitova podminka mensi nez 100 000 000 000 LDI REG,BYTE2(1215752192) CPC CIF2,REG LDI REG,BYTE3(1215752192) CPC CIF3,REG LDI REG,BYTE4(1215752192) CPC CIF4,REG LDI REG,23 CPC CIF5,REG BRLO MENSI_12 LDI REG,BYTE1(1215752192) SUB CIF1,REG ;40-bitove odcitani cisla 100 000 000 000 od vysledku LDI REG,BYTE2(1215752192) SBC CIF2,REG LDI REG,BYTE3(1215752192) SBC CIF3,REG LDI REG,BYTE4(1215752192) SBC CIF4,REG LDI REG,23 SBC CIF5,REG LDS REG,ZB12 INC REG STS ZB12,REG RJMP ZNOVU_12 MENSI_12: ZNOVU_11: LDI REG,BYTE1(1410065408) ;40-bitova podminka mensi nez 10 000 000 000 CP CIF1,REG LDI REG,BYTE2(1410065408) CPC CIF2,REG LDI REG,BYTE3(1410065408) CPC CIF3,REG LDI REG,BYTE4(1410065408) CPC CIF4,REG LDI REG,2 CPC CIF5,REG BRLO MENSI_11 LDI REG,BYTE1(1410065408) SUB CIF1,REG ;40-bitove odcitani cisla 10 000 000 000 od vysledku LDI REG,BYTE2(1410065408) SBC CIF2,REG LDI REG,BYTE3(1410065408) SBC CIF3,REG LDI REG,BYTE4(1410065408) SBC CIF4,REG LDI REG,2 SBC CIF5,REG LDS REG,ZB11 INC REG STS ZB11,REG RJMP ZNOVU_11 MENSI_11: ZNOVU_10: LDI REG,BYTE1(1000000000) ;40-bitova podminka mensi nez 1 000 000 000 CP CIF1,REG LDI REG,BYTE2(1000000000) CPC CIF2,REG LDI REG,BYTE3(1000000000) CPC CIF3,REG LDI REG,BYTE4(1000000000) CPC CIF4,REG CPC CIF5,NULA BRLO MENSI_10 LDI REG,BYTE1(1000000000) SUB CIF1,REG ;40-bitove odcitani cisla 1 000 000 000 od vysledku LDI REG,BYTE2(1000000000) SBC CIF2,REG LDI REG,BYTE3(1000000000) SBC CIF3,REG LDI REG,BYTE4(1000000000) SBC CIF4,REG SBC CIF5,NULA LDS REG,ZB10 INC REG STS ZB10,REG RJMP ZNOVU_10 MENSI_10: ZNOVU_9: LDI REG,BYTE1(100000000) ;32-bitova podminka mensi nez 100 000 000 CP CIF1,REG LDI REG,BYTE2(100000000) CPC CIF2,REG LDI REG,BYTE3(100000000) CPC CIF3,REG LDI REG,BYTE4(100000000) CPC CIF4,REG BRLO MENSI_9 LDI REG,BYTE1(100000000) SUB CIF1,REG ;32-bitove odcitani cisla 100 000 000 od vysledku LDI REG,BYTE2(100000000) SBC CIF2,REG LDI REG,BYTE3(100000000) SBC CIF3,REG LDI REG,BYTE4(100000000) SBC CIF4,REG LDS REG,ZB9 INC REG STS ZB9,REG RJMP ZNOVU_9 MENSI_9: ZNOVU_8: LDI REG,BYTE1(10000000) ;32-bitova podminka mensi nez 10 000 000 CP CIF1,REG LDI REG,BYTE2(10000000) CPC CIF2,REG LDI REG,BYTE3(10000000) CPC CIF3,REG LDI REG,BYTE4(10000000) CPC CIF4,REG BRLO MENSI_8 LDI REG,BYTE1(10000000) SUB CIF1,REG ;32-bitove odcitani cisla 10 000 000 od vysledku LDI REG,BYTE2(10000000) SBC CIF2,REG LDI REG,BYTE3(10000000) SBC CIF3,REG LDI REG,BYTE4(10000000) SBC CIF4,REG LDS REG,ZB8 INC REG STS ZB8,REG RJMP ZNOVU_8 MENSI_8: ZNOVU_7: LDI REG,BYTE1(1000000) ;24-bitova podminka mensi nez 1 000 000 CP CIF1,REG LDI REG,BYTE2(1000000) CPC CIF2,REG LDI REG,BYTE3(1000000) CPC CIF3,REG BRLO MENSI_7 LDI REG,BYTE1(1000000) SUB CIF1,REG ;24-bitove odcitani cisla 1 000 000 od vysledku LDI REG,BYTE2(1000000) SBC CIF2,REG LDI REG,BYTE3(1000000) SBC CIF3,REG LDS REG,ZB7 INC REG STS ZB7,REG RJMP ZNOVU_7 MENSI_7: ZNOVU_6: LDI REG,BYTE1(100000) ;24-bitova podminka mensi nez 100 000 CP CIF1,REG LDI REG,BYTE2(100000) CPC CIF2,REG LDI REG,BYTE3(100000) CPC CIF3,REG BRLO MENSI_6 LDI REG,BYTE1(100000) SUB CIF1,REG ;24-bitove odcitani cisla 100 000 od vysledku LDI REG,BYTE2(100000) SBC CIF2,REG LDI REG,BYTE3(100000) SBC CIF3,REG LDS REG,ZB6 INC REG STS ZB6,REG RJMP ZNOVU_6 MENSI_6: ZNOVU_5: LDI REG,BYTE1(10000) ;24-bitova podminka mensi nez 10 000 CP CIF1,REG LDI REG,BYTE2(10000) CPC CIF2,REG LDI REG,BYTE3(10000) CPC CIF3,REG BRLO MENSI_5 LDI REG,BYTE1(10000) SUB CIF1,REG ;24-bitove odcitani cisla 10 000 od vysledku LDI REG,BYTE2(10000) SBC CIF2,REG LDI REG,BYTE3(10000) SBC CIF3,REG LDS REG,ZB5 INC REG STS ZB5,REG RJMP ZNOVU_5 MENSI_5: ZNOVU1000: LDI REG,LOW(1000) CP CIF1,REG LDI REG,HIGH(1000) CPC CIF2,REG ;16-bitova podminka mensi nez 1000 BRLO POD1000 LDI REG,LOW(1000) SUB CIF1,REG ;16-bitove odcitani čísla 1000 od vysledku LDI REG,HIGH(1000) SBC CIF2,REG LDS REG,ZB4 INC REG STS ZB4,REG RJMP ZNOVU1000 POD1000: ZNOVU100: LDI REG,LOW(100) CP CIF1,REG LDI REG,HIGH(100) CPC CIF2,REG ;16-bitova podminka mensi nez 100 BRLO POD100 LDI REG,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SUB CIF1,REG LDI REG,HIGH(100) SBC CIF2,REG LDS REG,ZB3 INC REG STS ZB3,REG RJMP ZNOVU100 POD100: ZNOVU10: LDI REG,10 ;8-bitova podminka mensi nez 10 CP CIF1,REG BRLO POD10 LDI REG,10 SUB CIF1,REG ;8-bitove odcitani čísla 10 od vysledku LDS REG,ZB2 INC REG STS ZB2,REG RJMP ZNOVU10 POD10: ;CIF1 uz muze zustat jak je ; nacte ZB do CIF LDS CIF2,ZB2 LDS CIF3,ZB3 LDS CIF4,ZB4 LDS CIF5,ZB5 LDS CIF6,ZB6 LDS CIF7,ZB7 LDS CIF8,ZB8 LDS CIF9,ZB9 LDS CIF10,ZB10 LDS CIF11,ZB11 LDS CIF12,ZB12 LDS CIF13,ZB13 ;Volba rozsahu CLR ROZREG POSUN_ZNOVU: CLR REG CP CIF8,REG CPC CIF9,REG CPC CIF10,REG CPC CIF11,REG CPC CIF12,REG CPC CIF13,REG BREQ POSUN_KONEC ;posouva cifry, dokud se vsechny nenulove nevlezou na displej MOV CIF1,CIF2 MOV CIF2,CIF3 MOV CIF3,CIF4 MOV CIF4,CIF5 MOV CIF5,CIF6 MOV CIF6,CIF7 MOV CIF7,CIF8 MOV CIF8,CIF9 MOV CIF9,CIF10 MOV CIF10,CIF11 MOV CIF11,CIF12 MOV CIF12,CIF13 CLR CIF13 INC ROZREG RJMP POSUN_ZNOVU POSUN_KONEC: KONEC_OBNOVY: ;Prevede BCD na 7seg MOV REG,CIF1 RCALL ZOBRAZ MOV CIF1,REG MOV REG,CIF2 RCALL ZOBRAZ MOV CIF2,REG MOV REG,CIF3 RCALL ZOBRAZ MOV CIF3,REG MOV REG,CIF4 RCALL ZOBRAZ MOV CIF4,REG MOV REG,CIF5 RCALL ZOBRAZ MOV CIF5,REG MOV REG,CIF6 RCALL ZOBRAZ MOV CIF6,REG MOV REG,CIF7 RCALL ZOBRAZ MOV CIF7,REG RET VYPOCET_F: ; ---- Nasobeni 24-bit Cislo x 48-bit Konst. - Vyjde 72-bit vysledek (CIF9:CIF1) ---- LDI REG,BYTE1(KONST) MUL UDAJ1,REG ;Nasobi UDAJ1 x K1 MOVW CIF1,R0 ;Presune do vysledku LDI REG,KONST5 MUL UDAJ3,REG ;Nasobi UDAJ3 x K5 MOVW CIF7,R0 ;Presune do vysledku LDI REG,BYTE3(KONST) MUL UDAJ3,REG ;Nasobi UDAJ3 x K3 MOVW CIF5,R0 ;Presune do vysledku LDI REG,BYTE1(KONST) MUL UDAJ3,REG ;Nasobi UDAJ3 x K1 MOVW CIF3,R0 ;Presune do vysledku LDI REG,KONST6 MUL UDAJ3,REG ;Nasobi UDAJ3 x K6 ADD CIF8,R0 ;Pricte k vysledku ADC CIF9,R1 ; LDI REG,BYTE4(KONST) MUL UDAJ3,REG ;Nasobi UDAJ3 x K4 ADD CIF6,R0 ;Pricte k vysledku ADC CIF7,R1 ; ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE2(KONST) MUL UDAJ3,REG ;Nasobi UDAJ3 x K2 ADD CIF4,R0 ;Pricte k vysledku ADC CIF5,R1 ; ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,KONST6 MUL UDAJ2,REG ;Nasobi UDAJ2 x K6 ADD CIF7,R0 ;Pricte k vysledku ADC CIF8,R1 ; ADC CIF9,NULA ;Prida C LDI REG,KONST5 MUL UDAJ2,REG ;Nasobi UDAJ2 x K5 ADD CIF6,R0 ;Pricte k vysledku ADC CIF7,R1 ; ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE4(KONST) MUL UDAJ2,REG ;Nasobi UDAJ2 x K4 ADD CIF5,R0 ;Pricte k vysledku ADC CIF6,R1 ; ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE3(KONST) MUL UDAJ2,REG ;Nasobi UDAJ2 x K3 ADD CIF4,R0 ;Pricte k vysledku ADC CIF5,R1 ; ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE2(KONST) MUL UDAJ2,REG ;Nasobi UDAJ2 x K2 ADD CIF3,R0 ;Pricte k vysledku ADC CIF4,R1 ; ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE1(KONST) MUL UDAJ2,REG ;Nasobi UDAJ2 x K1 ADD CIF2,R0 ;Pricte k vysledku ADC CIF3,R1 ; ADC CIF4,NULA ;Prida C ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,KONST6 MUL UDAJ1,REG ;Nasobi UDAJ1 x K6 ADD CIF6,R0 ;Pricte k vysledku ADC CIF7,R1 ; ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,KONST5 MUL UDAJ1,REG ;Nasobi UDAJ1 x K5 ADD CIF5,R0 ;Pricte k vysledku ADC CIF6,R1 ; ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE4(KONST) MUL UDAJ1,REG ;Nasobi UDAJ1 x K4 ADD CIF4,R0 ;Pricte k vysledku ADC CIF5,R1 ; ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE3(KONST) MUL UDAJ1,REG ;Nasobi UDAJ1 x K3 ADD CIF3,R0 ;Pricte k vysledku ADC CIF4,R1 ; ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C LDI REG,BYTE2(KONST) MUL UDAJ1,REG ;Nasobi UDAJ1 x K2 ADD CIF2,R0 ;Pricte k vysledku ADC CIF3,R1 ; ADC CIF4,NULA ;Prida C ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C ADC CIF7,NULA ;Prida C ADC CIF8,NULA ;Prida C ADC CIF9,NULA ;Prida C ; nacte z RAM cas T LDS UDAJ1,IC1 LDS UDAJ2,IC2 LDS UDAJ3,IC3 LDS UDAJ4,IC4 ; ---- deleni 72-bit (CIF9:CIF1) / 32-bit (UDAJ4:UDAJ1) ---- LDI REG2,73 ;Nastavi pocet bitu delence (n+1) do REG2 CLC CLR REG ;REG je docasny registr STS ZB1,REG ;Vynuluje zbytek STS ZB2,REG STS ZB3,REG STS ZB4,REG STS ZB5,REG STS ZB6,REG STS ZB7,REG STS ZB8,REG STS ZB9,REG SMYCKA_DELENI: ROL CIF1 ;Posune vysledek doleva ROL CIF2 ; ROL CIF3 ; ROL CIF4 ; ROL CIF5 ; ROL CIF6 ; ROL CIF7 ; ROL CIF8 ; ROL CIF9 ; DEC REG2 ;Dekrementuje pocitadlo bitu BRNE JESTE_NE ;Pokud jsou vsechny bity hotove, konci RJMP DELENI_HOTOVO JESTE_NE: LDS REG,ZB1 ROL REG ;Posune zbytek doleva STS ZB1,REG LDS REG,ZB2 ROL REG STS ZB2,REG LDS REG,ZB3 ROL REG STS ZB3,REG LDS REG,ZB4 ROL REG STS ZB4,REG LDS REG,ZB5 ROL REG STS ZB5,REG LDS REG,ZB6 ROL REG STS ZB6,REG LDS REG,ZB7 ROL REG STS ZB7,REG LDS REG,ZB8 ROL REG STS ZB8,REG LDS REG,ZB9 ROL REG STS ZB9,REG LDS REG,ZB1 ;Odecte delitel od zbytku SUB REG,UDAJ1 STS ZB1,REG LDS REG,ZB2 SBC REG,UDAJ2 STS ZB2,REG LDS REG,ZB3 SBC REG,UDAJ3 STS ZB3,REG LDS REG,ZB4 SBC REG,UDAJ4 STS ZB4,REG LDS REG,ZB5 SBC REG,NULA STS ZB5,REG LDS REG,ZB6 SBC REG,NULA STS ZB6,REG LDS REG,ZB7 SBC REG,NULA STS ZB7,REG LDS REG,ZB8 SBC REG,NULA STS ZB8,REG LDS REG,ZB9 SBC REG,NULA STS ZB9,REG BRCC SKOK_DELENI ;Pokud je vysledek zaporny LDS REG,ZB1 ;Vrati odecitani ADD REG,UDAJ1 STS ZB1,REG LDS REG,ZB2 ADC REG,UDAJ2 STS ZB2,REG LDS REG,ZB3 ADC REG,UDAJ3 STS ZB3,REG LDS REG,ZB4 ADC REG,UDAJ4 STS ZB4,REG LDS REG,ZB5 ADC REG,NULA STS ZB5,REG LDS REG,ZB6 ADC REG,NULA STS ZB6,REG LDS REG,ZB7 ADC REG,NULA STS ZB7,REG LDS REG,ZB8 ADC REG,NULA STS ZB8,REG LDS REG,ZB9 ADC REG,NULA STS ZB9,REG CLC ;Vynuluje C RJMP SMYCKA_DELENI ;Znovu smycka SKOK_DELENI: SEC ;Nastavi C RJMP SMYCKA_DELENI ;Znovu smycka DELENI_HOTOVO: RET VYPOCET_T: ; Prohodi UDAJ4:1 a IC4:1 (v IC4 nic neni) MOVW REG,UDAJ2 LDS UDAJ2,IC2 LDS UDAJ3,IC3 STS IC2,REG STS IC3,REG2 MOV REG,UDAJ1 LDS UDAJ1,IC1 LDS UDAJ4,IC4 STS IC1,REG ; ---- Nasobeni 32-bit Cislo (UDAJ4:1) x 16-bit Konst. - Vyjde 48-bit vysledek (CIF6:CIF1) ---- LDI REG,BYTE1(KONST_T) MUL UDAJ1,REG ;Nasobi UDAJ1 x K1 MOVW CIF1,R0 ;Presune do vysledku LDI REG,BYTE1(KONST_T) MUL UDAJ3,REG ;Nasobi UDAJ3 x K1 MOVW CIF3,R0 ;Presune do vysledku LDI REG,BYTE2(KONST_T) MUL UDAJ4,REG ;Nasobi UDAJ4 x K2 MOVW CIF5,R0 ;Presune do vysledku LDI REG,BYTE1(KONST_T) MUL UDAJ2,REG ;Nasobi UDAJ2 x K1 ADD CIF2,R0 ;Pricte k vysledku ADC CIF3,R1 ; ADC CIF4,NULA ;Prida C ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C LDI REG,BYTE1(KONST_T) MUL UDAJ4,REG ;Nasobi UDAJ4 x K1 ADD CIF4,R0 ;Pricte k vysledku ADC CIF5,R1 ; ADC CIF6,NULA ;Prida C LDI REG,BYTE2(KONST_T) MUL UDAJ1,REG ;Nasobi UDAJ1 x K2 ADD CIF2,R0 ;Pricte k vysledku ADC CIF3,R1 ; ADC CIF4,NULA ;Prida C ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C LDI REG,BYTE2(KONST_T) MUL UDAJ2,REG ;Nasobi UDAJ2 x K2 ADD CIF3,R0 ;Pricte k vysledku ADC CIF4,R1 ; ADC CIF5,NULA ;Prida C ADC CIF6,NULA ;Prida C LDI REG,BYTE2(KONST_T) MUL UDAJ3,REG ;Nasobi UDAJ3 x K2 ADD CIF4,R0 ;Pricte k vysledku ADC CIF5,R1 ; ADC CIF6,NULA ;Prida C ; nacte z RAM pocet impulzu (24bit cislo) LDS UDAJ1,IC1 LDS UDAJ2,IC2 LDS UDAJ3,IC3 ; ---- deleni 48-bit (CIF6:CIF1) / 24-bit (UDAJ3:UDAJ1) = 48-bit (CIF6:CIF1) ---- LDI REG2,49 ;Nastavi pocet bitu delence (n+1) do REG2 CLC CLR REG ;REG je docasny registr STS ZB1,REG ;Vynuluje zbytek STS ZB2,REG STS ZB3,REG STS ZB4,REG STS ZB5,REG STS ZB6,REG SMYCKA_DELENI2: ROL CIF1 ;Posune vysledek doleva ROL CIF2 ; ROL CIF3 ; ROL CIF4 ; ROL CIF5 ; ROL CIF6 ; ; DEC REG2 ;Dekrementuje pocitadlo bitu BRNE JESTE_NE2 ;Pokud jsou vsechny bity hotove, konci RJMP DELENI2_HOTOVO JESTE_NE2: LDS REG,ZB1 ROL REG ;Posune zbytek doleva STS ZB1,REG LDS REG,ZB2 ROL REG STS ZB2,REG LDS REG,ZB3 ROL REG STS ZB3,REG LDS REG,ZB4 ROL REG STS ZB4,REG LDS REG,ZB5 ROL REG STS ZB5,REG LDS REG,ZB6 ROL REG STS ZB6,REG LDS REG,ZB1 ;Odecte delitel od zbytku SUB REG,UDAJ1 STS ZB1,REG LDS REG,ZB2 SBC REG,UDAJ2 STS ZB2,REG LDS REG,ZB3 SBC REG,UDAJ3 STS ZB3,REG LDS REG,ZB4 SBC REG,NULA STS ZB4,REG LDS REG,ZB5 SBC REG,NULA STS ZB5,REG LDS REG,ZB6 SBC REG,NULA STS ZB6,REG BRCC SKOK_DELENI2 ;Pokud je vysledek zaporny LDS REG,ZB1 ;Vrati odecitani ADD REG,UDAJ1 STS ZB1,REG LDS REG,ZB2 ADC REG,UDAJ2 STS ZB2,REG LDS REG,ZB3 ADC REG,UDAJ3 STS ZB3,REG LDS REG,ZB4 ADC REG,NULA STS ZB4,REG LDS REG,ZB5 ADC REG,NULA STS ZB5,REG LDS REG,ZB6 ADC REG,NULA STS ZB6,REG CLC ;Vynuluje C RJMP SMYCKA_DELENI2 ;Znovu smycka SKOK_DELENI2: SEC ;Nastavi C RJMP SMYCKA_DELENI2 ;Znovu smycka DELENI2_HOTOVO: RET MULT_SKOK: RJMP MULT1 ;to je tu 2x - jen pro posunuti tabulky v pameti. RJMP MULT1 RJMP MULT2 RJMP MULT3 RJMP MULT4 RJMP MULT5 RJMP MULT6 RJMP MULT7 MULT1: CPI ROZREG,6 BRNE TECKA1NE CBI PORT3,4 ;tohle rozsveci tecku TECKA1NE: OUT PORT,CIF1 SBI PORT3,5 RJMP MULT_ZPET MULT2: CPI ROZREG,5 BRNE TECKA2NE CBI PORT3,4 ;tohle rozsveci tecku TECKA2NE: OUT PORT,CIF2 SBI PORT2,0 RJMP MULT_ZPET MULT3: CPI ROZREG,4 BRNE TECKA3NE CBI PORT3,4 ;tohle rozsveci tecku TECKA3NE: OUT PORT,CIF3 SBI PORT2,1 RJMP MULT_ZPET MULT4: CPI ROZREG,3 BRNE TECKA4NE CBI PORT3,4 ;tohle rozsveci tecku TECKA4NE: OUT PORT,CIF4 SBI PORT2,2 RJMP MULT_ZPET MULT5: CPI ROZREG,2 BRNE TECKA5NE CBI PORT3,4 ;tohle rozsveci tecku TECKA5NE: OUT PORT,CIF5 SBI PORT2,3 RJMP MULT_ZPET MULT6: CPI ROZREG,1 BRNE TECKA6NE CBI PORT3,4 ;tohle rozsveci tecku TECKA6NE: OUT PORT,CIF6 SBI PORT2,4 RJMP MULT_ZPET MULT7: CPI ROZREG,0 BRNE TECKA7NE CBI PORT3,4 ;tohle rozsveci tecku TECKA7NE: OUT PORT,CIF7 SBI PORT2,5 RJMP MULT_ZPET ; Prevod BCD na 7segmentu ZOBRAZ: CPI REG,12 BRLO ZOBRAZ_JE_OK LDI REG,11 ZOBRAZ_JE_OK: LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG ADC ZH,NULA LPM REG,Z RET ; tabulka znakove sady (gfe0dcba) TABULKA: .DB 0b10000000,0b11101001 ;0, 1 .DB 0b01000100,0b01100000 ;2, 3 .DB 0b00101001,0b00100010 ;4, 5 .DB 0b00000010,0b11101000 ;6, 7 .DB 0b00000000,0b00100000 ;8, 9 .DB 0b11100111,0b00000110 ;_, E