Z8 Frequenzimetro da 6 cifre e 1/2 Questo programma mostra come lo Z8 è in grado di contare direttamente frequenze maggiori di un Mhz, (1,7 Mhz con quarzo da 10 Mhz) e aggiungendo al programma la parte di gestione di un display LCD a 16 caratteri si può completare per passare alla costruzione di un effettivo frequenzimetro. Per il momento mostro come fare la misura, con l'uso dei due timer T0 e T1. NOTA(*):E' necessario ricordare che i due timer lavorano in contemporanea e che T0 ha la priorità su T1, per questo motivo occorre fare una correzione nei valori di PRE0 e SEC in modo da annullare il tempo che INT0 toglie al contatore di T1. In questo modo la lettura è più precisa. Con SEC=82 i microsecondi da aggiungere a T1 sono circa 203. Per questo ho trovato conveniente portare PRE0=61 e SEC=82, in modo da recuperare il tempo mancante per il conteggio di T1. Con un quarzo da 16 Mhz, PRE0=58, SEC=138 (137,93 Hz), FX max=2,7 Mhz ;IK1WJQ PROGRAMMA ASSEMBLER Z8, QUARZO 10 MHZ ;FREQ.ASM Z86E04/8 T0 = 82 HZ PER LETTURA OGNI SECONDO (*) ;T1 DIVISORE 100 DI FX = DECINE E UNITA' ;P31 INGRESSO FX - MASSIMA FREQUENZA 1,7 MHZ (6 CIFRE E 1/2) ;P00 USCITA LED RT1 EQU 17 ;PER CONTEGGIO RITARDO RT2 EQU 18 UNI EQU R15 ;7 CIFRE ASCII DCN EQU R14 CEN EQU R13 MIG EQU R12 DMI EQU R11 CMI EQU R10 MIL EQU R9 SEC EQU R8 ;82 = 1 SEC. PER T0(*) ACC EQU R4 ;USO ACCUMULATORE B EQU R5 ;AUSILIARIO CT EQU RR6 ;CONTATORE 16 BIT R7 E R6 ORG 0008H ;INT T0 81,97 HZ(*) WORD #INT0 ;SALTO IRQ4 = INT0 ORG 000AH ;INT T1 WORD #INT1 ;SALTO IRQ5 = INT1 ORG 000CH LD P01M,#4 ;P0 USCENTE CLR RP ;R0-R3 PUNTANO P0-P3 CLR R0 LD SPL,#127 LD P3M,#1 ;P3 INGRESSO DIGITALE LD P2M,#0 ;P2 USCITA LD PRE0,#11110101B ;PRE0=61 CLOCK INTERNO CONTINUO (*) LD PRE1,#00000101B ;PRE1=1 CLOCK ESTERNO, CONTINUO LD T0,#250 ;XTAL/8/61/250 = 81,97 HZ IRQ4 (*) LD T1,#100 ;ING. P31 / 100 = FX/100 IRQ5 OR TMR,#0FH ;CARICA E ABILITA T0 E T1 DI ;NO INT OR IMR,#30H ;ABILITA INT T0 E T1 OR IPR,#3 ;IRQ4 > IRQ5 CLR R6 ;AZZERA CT CLR R7 LD SEC,#82 ;PREPARA SEC EI ;ATTIVA INT INI: CALL RIT ;LAMPEGGIO LED OR R0,#1 CALL RIT AND R0,#6 JR INI INT0: DJNZ SEC,INTR AND TMR,#F5H ;FERMA T0 E T1 DI ;E INT GENERALE LD UNI,#48 ;PREPARA 7 CIFRE ASCII LD DCN,#48 LD CEN,#48 LD MIG,#48 LD DMI,#48 LD CMI,#48 LD MIL,#48 LD ACC,#100 ;CONTROLLO CIFRE BASSE LD B,T1 SUB ACC,B JR Z,FINE ;NO CONTEGGIO CP ACC,#100 ;CONTROLLO ACC=100 JR NZ,CONT INCW CT ;CT + 100 HZ JR DEC2 CONT: INC ACC ;AGGIUSTA UNITA' DECX: DJNZ ACC,DEC1 JR DEC2 ;CONTINUA CIFRE SUCESSIVE DEC1: INC UNI ;1 CP UNI,#58 JR NZ,DECX LD UNI,#48 INC DCN ;10 CP DCN,#58 JR NZ,DECX LD DCN,#48 JR DECX DEC2: LD ACC,R6 ;CONTROLLO SE CT = 0 OR ACC,R7 JR Z,FINE INC CEN ;100 CP CEN,#58 JR NZ,DCC LD CEN,#48 INC MIG ;1.000 CP MIG,#58 JR NZ,DCC LD MIG,#48 INC DMI ;10.000 CP DMI,#58 JR NZ,DCC LD DMI,#48 INC CMI ;100.000 CP CMI,#58 JR NZ,DCC LD CMI,#48 INC MIL ;1.000.000 DCC: DECW CT ;CT - 1 JR DEC2 FINE: OR TMR,#0FH ;ATTIVA T0 E T1 LD SEC,#82 ;PREPARA SEC NUOVA LETTURA EI INTR: IRET INT1: INCW CT ;R7 E R6 CONTATORE 16 BIT IRET ;TOTALE FMAX = 1,7 MHZ RIT: LD RT1,#125 PAU: CLR RT2 PAU1: NOP NOP DEC RT2 JR NZ,PAU1 PAU2: NOP NOP DEC RT2 JR NZ,PAU2 DEC RT1 JR NZ,PAU RET END Vai a Pagina1