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