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