BaudLoad equ 0CBH ; 1200Bd fosc=24MHz ;BaudLoad equ 0F3H ; 4800Bd fosc=24MHz xth equ 00Bh ; kmitocet 32 Hz xtl equ 0E9h ; pro casovac CCLKEN equ p3.2 RCLK equ p3.7 CCLR equ p3.4 RELE equ p3.5 DSEG AT 20H flags DATA 20H STOP BIT flags.1 NULY BIT flags.2 ORG 040H FR1: DS 1H FR2: DS 1H FR3: DS 1H FR4: DS 1H FR5: DS 1H ; MIN0: DS 1H MIN1: DS 1H MIN2: DS 1H MIN3: DS 1H ; MAX0: DS 1H MAX1: DS 1H MAX2: DS 1H MAX3: DS 1H ORG 060H stack: DS 020H CSEG ;;;;;;;;;;;;;;;;;;;;;;;;; ORG 00H ; start jmp ON_RESET ;;;;;;;;;;;;;;;;;;;;;;;;; ORG 003H ; externi interrupt 0 reti ;;;;;;;;;;;;;;;;;;;;;;;;; ORG 00BH ; casovac 0 jmp timer_int ; 2 ;;;;;;;;;;;;;;;;;;;;;;;;; ORG 013H ; externi interrupt 1 djnz R1, cix ; 2 2 ; kvuli setreni casem djnz R2, cix ; 2 2 dec R3 ; 1 1 cix: reti ; 2 1 = 9 cyklu, 8 bajtu ;;;;;;;;;;;;;;;;;;;;;;;;; ; ORG 01BH ; casovac 1 ; reti ORG 023H ; seriovy interrupt reti ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 080H ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ON_RESET: mov SP, #(stack-1) ; inicializace zasobniku mov IE, #0 ; Zakazat vsechna preruseni mov a, #0ffh ; mov p3, a ; mov p1, a ; setb RELE clr STOP call serial_init ; Nastartovat seriovy prenos. call napoveda anl TMOD,#11110000B orl TMOD,#00000001B call hodiny_init ; nastartuje casovac hodin a citac call clr_mmax ; vynuluje zaznamy min/max hodnot loop: orl 087h, #1 ; sleep rezim az do preruseni jnb F0, loop lp1: call xon ; povolit seriovy vstup jb STOP, lp2 call citace ; Hodnoty do R0-3, R0 se meni nejrychleji call vyber_max ; Vybere maximalni hodnoty call vyber_min ; Vybere minimalni hodnoty call vypis_kmitocet ; Vypise kmitocet dekadicky call cr_out ; Vypise znak CR lp2: call xoff ; zakazat seriovy vstup call prikaz ; zpracuj eventuelni prikazy jb STOP, lp1 call hodiny_init ; nastartovat hodiny sjmp loop ; furt az do blba ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; napoveda: call strout db 13,10 db 'Citac 1.3 GHz (c) Petr Bravenec, verse 1.0',13,10 db 'H - kmitocty 20 MHz ... 1300 MHz',13,10 db 'L - kmitocty 0 MHz ... 20 MHz',13,10 db 'S - start/stop',13,10 db 'C - vycisti min/max hodnoty',13,10 db 'M - vytiskni min/max hodnoty',13,10 db '? - napoveda',13,10 db 0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clr_mmax: mov a, #0FFH mov MIN0, a mov MIN1, a mov MIN2, a mov MIN3, a mov a, #0 mov MAX0, a mov MAX1, a mov MAX2, a mov MAX3, a ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vypis_mmax: setb RS0 ; prepni na jinou banku registru call strout db 13,10,0 mov R0, MIN0 mov R1, MIN1 mov R2, MIN2 mov R3, MIN3 call vypis_minmax call strout db ' Minimum',13,10,0 mov R0, MAX0 mov R1, MAX1 mov R2, MAX2 mov R3, MAX3 call vypis_minmax call strout db ' Maximum',13,10,0 clr RS0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vyber_min: clr c mov a, R3 subb a, MIN3 jc n_min jnz k_min mov a, R2 subb a, MIN2 jc n_min jnz k_min mov a, R1 subb a, MIN1 jc n_min jnz k_min mov a, R0 subb a, MIN0 jc n_min k_min: ret n_min: mov MIN0, R0 mov MIN1, R1 mov MIN2, R2 mov MIN3, R3 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vyber_max: clr c mov a, MAX3 subb a, R3 jc n_max jnz k_max mov a, MAX2 subb a, R2 jc n_max jnz k_max mov a, MAX1 subb a, R1 jc n_max jnz k_max mov a, MAX0 subb a, R0 jc n_max k_max: ret n_max: mov MAX0, R0 mov MAX1, R1 mov MAX2, R2 mov MAX3, R3 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hodiny_init: clr F0 clr EA setb RCLK clr CCLR ; Vynulovat citac 74590 mov R1, #0 ; Vynulovat citac v CPU mov R2, #0 ; Vynulovat citac v CPU mov R3, #0 ; Vynulovat citac v CPU clr RCLK setb CCLR ; Nulovani 74590 hotovo setb IT1 mov TH0, #xth mov TL0, #xtl mov R0, #32 ; jedna sekunda jnb RELE, hi1 mov R0, #64 ; dve sekundy hi1: setb TR0 ; Nastartuj citac 0 setb EX1 ; Povolit preruseni od citace setb PT0 ; citac 0 vysoka priorita setb PX1 ; Preruseni od citace - vysoka priorita setb EA setb ET0 ; Nastartovat hodiny clr CCLKEN ; Povolit citac ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; serial_init: clr TR1 ; stop timer 1 mov SCON, #01011010B mov TMOD, #00100001B mov TH1, #BaudLoad setb TR1 ; start timer 1 setb TI ; setb ES ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; prikaz: jb RI, snt0 ret snt0: mov a, #4Ch ; L cjne a, SBUF, snt11 sjmp snt12 snt11: mov a, #6Ch ; l cjne a, SBUF, snt1 snt12: call strout db 'Kmitocty 0 az 20 MHz ',13,10,0 clr RELE jmp sntk ;;;;;;;;;;;; snt1: mov a, #48h ; H cjne a, SBUF, snt21 sjmp snt22 snt21: mov a, #68h ; h cjne a, SBUF, snt2 snt22: call strout db 'Kmitocty 20 az 1300 MHz ',13,10,0 setb RELE jmp sntk ;;;;;;;;;;;; snt2: mov a, #3Fh ; ? cjne a, SBUF, snt3 call napoveda jmp sntk ;;;;;;;;;;;; snt3: mov a, #53H ; S cjne a, SBUF, snt31 sjmp snt32 snt31: mov a, #73H ; s cjne a, SBUF, snt4 snt32: call startstop jmp sntk ;;;;;;;;;;;; snt4: mov a, #4DH ; M cjne a, SBUF, snt41 sjmp snt42 snt41: mov a, #6DH ; m cjne a, SBUF, snt5 snt42: call vypis_mmax jmp sntk ;;;;;;;;;;;; snt5: mov a, #43H ; C cjne a, SBUF, snt51 sjmp snt52 snt51: mov a, #63H cjne a, SBUF, snt6 snt52: call clr_mmax call strout db 'Min/max hodnoty vynulovany ',13,10,0 jmp sntk ;;;;;;;;;;;; snt6: sntk: clr RI ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; startstop - zastavi nebo pusti citani, podle stavu bitu STOP startstop: jb STOP, ss1 setb STOP call strout db 'Zastaveno - spusteni stiskem S',13,0 ret ss1: clr STOP mov b, #20H ss2: mov a, #20H call c_out djnz b, ss2 mov a, #0DH call c_out ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Prevod 32-bit kmitocet => dekadicke cislo; ; Nevim, jak to funguje, ale funguje to! ; vstupni hodnoty: R0, R1, R2, R3 (od nejnizsich citacu po nejvyssi) ; vystupni hodnoty: FR1, FR2, FR3, FR4, FR5 ; citac: R4 vypis_kmitocet: jnb STOP, vk1 ret vypis_minmax: vk1: mov FR1, #0 mov FR2, #0 mov FR3, #0 mov FR4, #0 mov FR5, #0 mov R4, #32 vkckl: mov a, R0 add a, acc mov R0, a mov a, R1 rlc a mov R1, a mov a, R2 rlc a mov R2, a mov a, R3 rlc a mov R3, a ; mov a, FR1 addc a, acc da a mov FR1, a ; mov a, FR2 addc a, acc da a mov FR2, a ; mov a, FR3 addc a, acc da a mov FR3, a ; mov a, FR4 addc a, acc da a mov FR4, a ; mov a, FR5 addc a, acc da a mov FR5, a ; djnz R4, vkckl ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; setb NULY mov a, FR5 call vyBCDp mov a, FR4 call vyBCD mov a, #32 call c_out mov a, FR3 call vyBCD mov a, FR2 call vyBCDp mov a, FR1 clr NULY call vyBCD call strout db ' Hz',0 ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Vypise na seriovy port dve cislice v ASCII kodu. ; Vstupni hodnota je ulozena v ACC ; Vstupni body jsou dva: vyBCD a vyBCDp ; vyBCDp vypise cislice a mezeru mezi nimi ; vyBCD vypise cislice bez mezery ; vyBCD: push acc call BCDy sjmp BCDx vyBCDp: push acc call BCDy mov a, #32 call c_out BCDx: pop acc sjmp BCDz BCDy: swap a BCDz: anl a, #00FH jnb NULY, BCDc jz BCDn clr NULY sjmp BCDc BCDn: mov a, #0F0H ; F0H + 30H = mezera BCDc: add a, #030H call c_out ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Tohle obrati poradi bitu v registru a prevod: push b mov b, #0 call ppvd call ppvd call ppvd call ppvd call ppvd call ppvd call ppvd call ppvd mov a, b pop b ret ppvd: rlc a xch A, b rrc a xch a, b ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Vynasobi 32-bitovou hodnotu citacu sedesati ctyrma ; pro mereni vysokych kmitoctu. nasobek64: clr c call posuv call posuv call posuv call posuv posuv: mov a, R0 rlc a mov R0, a mov a, R1 rlc a mov R1, a mov a, R2 rlc a mov R2, a mov a, R3 rlc a mov R3, a ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Pripravi do R0, R1, R2, R3 vsechny hodnoty citacu ; citace: clr RCLK ; povel pro citac: "vyplivni hodnoty" mov a, p1 ; Precti hodnotu ze 74590 setb RCLK ; Vypni vystup 74590 call prevod mov R0, a ; ted je rada citacu R0, R1, R2, R3 mov a, R1 cpl a ; V citacich je zaporne cislo inc a ; obratit mu znamenko! mov R1, a mov a, R2 cpl a inc a mov R2, a mov a, R3 cpl a inc a mov R3, a jnb RELE,ctc1 call nasobek64 ctc1: ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; xon: mov a, #17 call c_out ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; xoff: mov a, #19 call c_out ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; cr_out: mov a, #13 call c_out ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; timer_int: djnz R0, ti1 ; 2 2 clr TR0 ; Stop citac 0 (hodiny) setb CCLKEN ; zastavic citac 74590 clr EX1 ; zastavit ciatc (zakaz preruseni) clr ET0 ; zastavit hodiny setb F0 ; Nastavit priznak reti ti1: mov TH0, #xth ; 2 mov TL0, #xtl ; 2 - nemelo by se to zvetsit o 10? reti ; 2 Ztraceny cas 8+2 cyklu ^^^^^ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; C_OUT: JNB TI,$ ; pockej na ukonceni TX CLR TI ; Ukonci MOV SBUF, A ; Posli znak RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; STROUT: pop DPH pop DPL STRO_1: clr a movc A, @A+DPTR inc DPTR jz STRO_2 call C_OUT sjmp STRO_1 STRO_2: clr a jmp @A+DPTR END