Ho scritto questo firmware (perfettamente funzionante,testato) che ogni secondo incrementa i due display di una unità,fino ad arrivare al numero 59 per poi ripartire da zero...
tutto funziona alla perfezione,,,solo che paragonandolo ad un'orologio dopo un poco perde il tempo...questo comporterebbe dei problemi se dovrei realizzare orologi o timer programmabili per l'intero arco della giornata...
Il metodo più efficace per ottenere ' 1 Hz ' quale sarebbe? qualcuno me lo spiegherebbe?magari tramite interrupt o altro...
Fosc 4Mhz
- Codice: Seleziona tutto
;OROLOGIO CARLO MUSUMECI CON PIC 16F84A
PROCESSOR 16F84
RADIX DEC
INCLUDE "P16F84A.INC"
ERRORLEVEL -302
__CONFIG 3FF5H
ORG 0CH
d1 RES 1
d2 RES 1
UNITA RES 1
DECINE RES 1
S1 RES 1
S2 RES 1
S3 RES 1
;definizione numeri
ZERO EQU B'00111111'
UNO EQU B'00000110'
DUE EQU B'01011011'
TRE EQU B'01001111'
QUATTRO EQU B'01100110'
CINQUE EQU B'01101101'
SEI EQU B'01111101'
SETTE EQU B'00000111'
OTTO EQU B'01111111'
NOVE EQU B'01101111'
;DEFINIZIONE CATODI DISPLAY
DISP_UNIT EQU 0
DISP_DECINE EQU 1
ORG 0X00
BSF STATUS,RP0 ;ACCEDI AL BANCO 1
MOVLW B'00000000';IMPOSTA TUTTI OUT
MOVWF TRISA ;A PORTA A
MOVLW B'10000000';IMPOSTA TUTTI OUT TRANNE BIT 7 IN INPUT
MOVWF TRISB ;A PORTA B
BCF STATUS,RP0 ;ACCEDI A BANCO 0
CLRF UNITA ;PULISCI DIPLAY UNITA'
CLRF DECINE ;PULISCI DISPLAY DECINE
CALL VISUALIZZA ;VISUALIZZA LE OPERAZIONI SUL DISPLAY
;_________________________________________________^^INIZIO PROGRAMMA^^___________________________________________
Main
CALL INC_UNIT ;INCREMENTA UNITA'
CALL INC_DEC ;INCREMENTA DECINA
MOVLW d'6' ;MUOVI IN W '6 DECIMALI'
SUBWF DECINE,W ;SOTTRAI 6 DA DECINE E METTI IL RISULTATO IN W
BTFSC STATUS,Z ;ESEGUI LA SUCCESSIVA SE Z E' A 0
CLRF DECINE ;SE ARRIVA A 6 AZZERA DECIN
GOTO Main ;RITORNA AL MAIN
INC_UNIT
CALL VISUALIZZA ;CHIAMA GESTIONE VISUALIZZAZIONE
call Delay1s ;RITARDO DI UN SECONDO
incf UNITA ;INCREMENTA UNITA'
movlw d'10' ;MUOVI IN W '10 DECIMALI'
subwf UNITA,W ;SOTTRAI 10 DA UNITA' E METTI RISULTATO IN W
BTFSC STATUS,Z ;SE RISULTA 0 ESEGUI OPERAZIONE SEGUENTE
RETURN ;SE 0 RITORNA AL PROGRAMMA PRINCIPALE
GOTO INC_UNIT ;SE NON è 0 CONTINUA A INCREMENTARE
INC_DEC
CLRF UNITA ;AZZERA UNITA'
BTFSC STATUS,Z ;SE Z SI TROVA A 0 ESEGUI LA SUCCESSIVA
INCF DECINE ;INCREMENTA DECINA
RETURN ;RITORNA AL PROGRAMMA PRINCIPALE
VISUALIZZA
BSF PORTA,DISP_UNIT
MOVF UNITA,0 ;legge il valore di unità e lo copia in W
CALL DISPLA
MOVWF PORTB
BCF PORTA,DISP_UNIT
CALL Delay5
BSF PORTA,DISP_DECINE
MOVF DECINE,0 ;legge il valore di unità e lo copia in W
CALL DISPLA
MOVWF PORTB
BCF PORTA,DISP_DECINE
CALL Delay5
RETURN
DISPLA
ADDWF PCL,1
RETLW ZERO
RETLW UNO
RETLW DUE
RETLW TRE
RETLW QUATTRO
RETLW CINQUE
RETLW SEI
RETLW SETTE
RETLW OTTO
RETLW NOVE
;__________________________________________RITARDO MULTIPLEXER_________________________________
Delay5
;4993 cycles
movlw 0xE6
movwf d1
movlw 0x04
movwf d2
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
;_________________________________________________________________________________________________
Delay1s
;999997 cycles
movlw 0x08
movwf S1
movlw 0x2F
movwf S2
movlw 0x03
movwf S3
Delay1_0
decfsz S1, f
goto $+2
decfsz S2, f
goto $+2
decfsz S3, f
goto Delay1_0
;3 cycles
goto $+1
nop
return
END

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

Hz.




.