Andre_Cruz escreveu:MOR_AL,
... Se eu quiser andar o ponteiro de 3º em 3º por exemplo eu calculo assim:
1/(30RPS * 120) = 278 uS ...
Muito obrigado
Pense que para 1 grau (


MOR_AL
Moderadores: andre_luis, 51, guest2003, Renie
Andre_Cruz escreveu:MOR_AL,
... Se eu quiser andar o ponteiro de 3º em 3º por exemplo eu calculo assim:
1/(30RPS * 120) = 278 uS ...
Muito obrigado
; PROTÓTIPO RELOGIO DE PONTEIRO
;
; INTERUPÇÃO DE MUDANÇA DE ESTADO EM GPIO3 DETECTA A POSIÇÃO DO PONTERIO
; TIMER 0 GERA A BASE DE TEMPO DE 185uS CORRESPONDENTE A 1SEGUNDO DO RELOGIO OU 6º
; TIMER 1 GERA A BASE DE TEMPO DE 1 SEGUNDO
;
; ESTE PROGRAMA DE TESTE, DEVE ACENDER O PONTEIRO TODA VEZ QUE A RACHURA PASSAR PELO SENSOR DE ROTAÇÃO
; 31/08/2009
; ESCRITO POR: ANDRÉ NOBREGA DA CRUZ
#define __12F675
include <p12f675.inc>
errorlevel -302 ; Não mostra o Error 302
__CONFIG _CP_ON & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC ; _INTRC_OSC_NOCLKOUT
; Config
; Code Protect ligado
;
; BOR Desligado
; Master Clear MCRL Desligado
; Watch Dog Timer WDT Desligado
; Power Up Timer PWRTE Ligado
; Oscilador Externo 20MHz
;DEFINES
#DEFINE LED_AZUL GPIO,0 ; PINO 7
#DEFINE LED_VERDE GPIO,1 ; PINO 6
#DEFINE LED_VERMELHO GPIO,2 ; PINO 5
#DEFINE ROTACAO GPIO,3 ; PINO 4
#DEFINE BANK1 BSF STATUS,RP0 ; SELECIONA BANCO 1
#DEFINE BANK0 BCF STATUS,RP0 ; SELECIONA BANCO 0
; CONSTANTES
;VARIAVEIS
CBLOCK 0x020
P_PONTEIRO ; ARMAZENA A POSIÇÃO DO PONTEIRO EM SEGUNDOS
SEG ; ARMAZENA OS SEGUNDOS
FLAG
PRESCALER_TMR1
DELAY_AC
; PARA A INTERUPÇÃO
BACKUP_W
BACKUP_STATUS
BACKUP_FSR
BACKUP_PCLATH
ENDC
; FLAGS
#DEFINE BORDA_ROT FLAG,0
#DEFINE ACIONOU_AZUL FLAG,1 ; FLAG QUE INDICA 0 -> AINDA NÃO ACIONOU LED AZUL 1 -> JA ACIONOU LED AZUL
#DEFINE ACIONOU_VERDE FLAG,2 ; FLAG QUE INDICA 0 -> AINDA NÃO ACIONOU LED VERDE 1 -> JA ACIONOU LED VERDE
#DEFINE ACIONOU_VERMELHO FLAG,3 ; FLAG QUE INDICA 0 -> AINDA NÃO ACIONOU LED VERMELHO 1 -> JA ACIONOU LED VERMELHO
; CONSTANTES
TMR1_HIGH EQU HIGH (.65536-.62500)
TMR1_LOW EQU LOW (.65536-.62500) ; VALOR PARA CONTAGEM DE
; 62500 CICLOS DE CONTAGEM
; DO TMR1 (PROGRAMADO P/
; PRESCALER DE 1:8)
; VETOR DE RESET
ORG 0x000
NOP
GOTO CONFIG_CPU
; VETOR DE INTERUPÇÂO
ORG 0x004
;SALVA REGISTRADORES IMPORTANTES
MOVWF BACKUP_W
SWAPF STATUS,W
MOVWF BACKUP_STATUS
MOVF FSR,W
MOVWF BACKUP_FSR
MOVF PCLATH,W
MOVWF BACKUP_PCLATH
CLRF PCLATH
CLRF STATUS
INT_TMR1
BTFSS PIR1,TMR1IF ; É INTERUPÇÃO DE TIMER 1 ?
GOTO SENSOR ; NÃO TESTA PRA VER SE INTERUPÇÃO DE GPIO3
; SIM
MOVLW TMR1_HIGH
MOVWF TMR1H
MOVLW TMR1_LOW
MOVWF TMR1L ; RECARREGA TIMER 1 PRA CONTAR 0,1 S OU 100mS
BCF PIR1,TMR1IF ; LIMPA FLAG DA INTERUPÇÃO DE TIMER 1
DECFSZ PRESCALER_TMR1,F ; 1 SEGUNDO ?
GOTO SAI ; NÃO, ENTÃO SAI DA INTERRUPÇÃO
; SIM
MOVLW .10
MOVWF PRESCALER_TMR1 ; REINICIA O PRESCALER
;************************************************************************************************************
INCF SEG,F ; INCREMENTA OS SEGUNDOS
GOTO SAI
SENSOR
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BTFSS INTCON,GPIF ; É INTERUPÇÃO DE MUDANÇA DE ESTADO EM GPIO3 ?
GOTO T_TIMER ; NÃO TESTA SE É INTERUPÇÃO DE TIMER 0
; SIM
BCF INTCON,GPIF ; LIMPA FLAG DA INTERUPÇÃO DE MUDANÇA DE ESTADO EM GPIO3
;LE BORDA
BTFSC GPIO,3 ; SENSOR ESTA EM 0
GOTO SENSOR_ALTO ; NÃO, ENTÃO ESTA EM 1
; SIM
BTFSS BORDA_ROT ; FLAG DA BORDA DE SUBIDA ESTAVA EM 1 ?
GOTO SENSOR_ALTO ; NÃO, ESTAVA EM 1
; SIM
BCF BORDA_ROT ; ATUALIZA A BORDA
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;CLRF P_PONTEIRO ; REINICIA A POSIÇÃO DO PONTEIRO
MOVLW .0
MOVWF P_PONTEIRO
GOTO SAI
SENSOR_ALTO
BSF BORDA_ROT ; ATUALIZA BORDA_ROT E SAI
GOTO SAI
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
T_TIMER
; INTERUPÇÃO DO TIMER0 ?
BTFSS INTCON,T0IF
GOTO SAI ; NÃO, SAI
; SIM, TRATA INTERUPÇAO DE TIMER 0
MOVLW .36
MOVWF TMR0 ; REINICIA O TIMER 0
TESTA_SEG
; ESTA NA HORA DE ACIONAR O PONTEIRO DOS SEGUNDOS ?
MOVF SEG,W
XORWF P_PONTEIRO,W
BTFSS STATUS,Z ; POSIÇÃO DO PONTEIRO IGUAL A SEGUNDO ATUAL ?
GOTO SAI_TMR0 ; NÃO, TESTA MINUTO
; SIM
; ACIONA LED CORRESPONDENTE AO PONTEIRO DOS SEGUNDOS
BSF LED_AZUL
MOVLW .20
MOVWF DELAY_AC
; DELAY DE 20uS POR INSTRUÇÃO
DELAY
NOP
NOP
NOP
NOP ; 1 uS
DECFSZ DELAY_AC,F
GOTO DELAY
BCF LED_AZUL
GOTO SAI_TMR0
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
SAI_TMR0
; PONTEIRO ANDOU 6º OU 1 SEGUNDO
INCF P_PONTEIRO,F ; INCREMENTA A POSIÇÃO DO PONTEIRO
BCF INTCON,T0IF ; LIMPA FLAG
SAI
; RESTAURA OS VALORES DOS REGISTRADORES
MOVF BACKUP_PCLATH,W
MOVWF PCLATH
MOVF BACKUP_FSR,W
MOVWF FSR
SWAPF BACKUP_STATUS,W
MOVWF STATUS
SWAPF BACKUP_W,F
SWAPF BACKUP_W,W
RETFIE ; RETORNA
CONFIG_CPU
; Inicia a configuração da CPU
BANK1
CLRF ANSEL
MOVLW B'00001000'
MOVWF TRISIO ; Configura I/O
MOVLW B'01101000' ; CONFIGURA AS INTERUPÇÕES
MOVWF INTCON
; <7> GIE DESLIGADA
; <6> INTERUPÇÕES PARALELAS LIGADAS
; <5> INTERUPÇÃO DE TIMER 0 LIGADA
; <4> INTERUPÇÃO DE MUDANÇA DE ESTADO EM GPIO2 DESLIGADA
; <3> INTERUPÇÕES DE GPIO DESLIGADAS
; <2> FLAG DO OVER FLOW DO TIMER 0
; <1> FLAG DO EVENTO DA INTERUPÇÃO DE GPIO2
; <0> FLAG DO EVENTO DE INTERUPÇÃO DE GPIO
MOVLW B'10010001' ; CONFIGURA OS PERIFERICOS
MOVWF OPTION_REG
; <7> PULL-UP DESLIGADOS
; <6> INTERUPÇÃO DE GPIO2 NA BORDA DE DESCIDA 0
; <5> TIMER 0 OPERANDO COM O CLOCK INTERNO
; <4> CLOCK PARA O TIMER 0 DE GPIO2 DESLIGADO
; <3> PRESCALER NO TIMER 0
; <2><1><0> PRESCALER DE 1:4 NO TIMER 0
BSF PIE1,TMR1IE
MOVLW B'00001000'
MOVWF IOC ; LIGA A INTERUPÇÃO DE GPIO3
MOVLW B'00001000'
MOVWF WPU ; LIGA A INTERUPÇÃO DE GPIO3
BANK0
MOVLW 0x07
MOVWF CMCON ; DESLIGA COMPARADOR INTERNO
CLRF ADCON0 ; DESLIGA CONVERSOR A/D
MOVLW B'00110000'
MOVWF T1CON
; <6> TIMER1 GATE DESLIGADO
; <5><4> PRESCALER 1:4
; <3> LC OSC DESLIGADO
; <2> CLOCK NÃO SINCRONIZADO COM O CLOCK EXTERNO (PINO)
; <1> CLOCK INTERNO
; <0> TIMER 1 DESLIGADO
; INICIALIZA AS VARIAVEIS E FLAGS
CLRW ; LIMPA ACUMULADOR "W"
CLRF GPIO ; LIMPA AS PORTAS GPIO
MOVLW .36
MOVWF TMR0 ; INICIALIZA TIMER 0
MOVLW .10
MOVWF PRESCALER_TMR1
; LÊ O ESTADO ATUAL DO SENSOR DE ROTAÇÃO
BTFSS GPIO,3 ; GPIO3 IGUAL A 1 ?
GOTO BORDA_ROT0 ; NÃO, ZERO
; SIM
BSF BORDA_ROT
GOTO CON
BORDA_ROT0
BCF BORDA_ROT
CON
BSF INTCON,GIE ; LIGA GIE
MOVLW .0
MOVWF SEG
MAIN
NOP
GOTO MAIN
END
Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante