por Vonnilmam » 24 Jan 2010 12:45
O lellis PEGA LEVE! TÁ NERVOSO VAI "PESCAR"
Aquí é um site de ajuda sobre mcus pic, não importa se o cidadão programa em assembler ou outra linguagem! No final dá tudo na mesma, mesmo...
Então faz assim com o andré indicou, aquí vai uma dica prática:
; ***************************************************************
; * PROJECT BY........: Vonnilmam *
; * DATA E REVISÃO....: 25/01/2009 - 23:12 / xx-xx-xx *
; * CLOCK.............: EXTERNO DE 20.000.000 HZ *
; * CRISTAL MCU.......: 20.000.000 HZ *
; * ANDAMENTO.........: APROVADO *
; ***************************************************************
; TABELA DE FRQ COM ESCALA LINEAR DE 49 STEPS
; ESSA VERSÃO UTILIZA O TIMER 1 (16BITS)
;-----------
__config b'00000100000010' ; 014F
; 0000---------- [CP1:0] Code Protection 1 = OFF
; ----0--------- --- * ---
; -----1-------- [CPD] Data Code Protection 0 = OFF
; ------0------- [LVP] Low Voltage Programming 0 = OFF
; -------1------ [BODEN] Brown-out Detect 0 = OFF
; --------0----- [MCLRE] RA5/MCLR pin function select = RA5
; ----------0--- [PWRTE] Power-up Timer disable
; -----------0-- [WDTE] Watchdog Timer disable
; ---------0--10 [FOSC2:0] HS, pin15 = pin16 = HighSpeedCrystal
;-----------
ERRORLEVEL -302, -306
#INCLUDE <P16F628.INC>
#INCLUDE <RAM.INC>
#INCLUDE <DEFINE.INC>
#INCLUDE <MACROS.INC>
#include <Ramclear.inc>
;---------------
ORG 00H
CLRF PCLATH
GOTO SETUP
ORG 04H
INT_TMR1:
MOVWF W_TEMP ; salva o conteúdo do w em w_temp
SWAPF STATUS, W ; salva o conteúdo do status ...
MOVWF STATUS_TEMP ; ... em status_temp
INCF PORTA, F ; A0=2",A1=4",A2=8",A3=16" PÉS...
;
BTFSC ANT_RELOAD ; BLOQUEIRA ATUALIZAÇÃO DOS
GOTO NOT_RELOAD ; REGISTROS DE CONTAGEM
;
MOVF TEMP_LSB, W
MOVWF RELOAD_LSB
MOVWF TMR1L
MOVF TEMP_MSB, W
MOVWF RELOAD_MSB
MOVWF TMR1H
BCF PIR1, TMR1IF ; APAGA FLAG DE INTERRUPÇÃO
SWAPF STATUS_TEMP, W ; restaura o conteúdo do ...
MOVWF STATUS ; ... registrador status
SWAPF W_TEMP, F ; restaura o conteúdo ...
SWAPF W_TEMP, W ; ... do registrador w
RETFIE
NOT_RELOAD:
MOVF RELOAD_LSB, W
MOVWF TMR1L
MOVF RELOAD_MSB, W
MOVWF TMR1H
BCF PIR1, TMR1IF ; APAGA FLAG DE INTERRUPÇÃO
SWAPF STATUS_TEMP, W ; restaura o conteúdo do ...
MOVWF STATUS ; ... registrador status
SWAPF W_TEMP, F ; restaura o conteúdo ...
SWAPF W_TEMP, W ; ... do registrador w
RETFIE
;---------------
#INCLUDE <FRQTON.INC>
ORG .256
;---------------
#INCLUDE <Ponteiro.INC>
;---------------
#INCLUDE <BOOT.INC>
;---------------
CLRF PORTA
CLRF BANDEIRA_1
BCF INTCON, GIE
BCF T1CON, T1CKPS0 ; PRESCALER 1/1=00 * 1/2=10 * 1/4=01 * 1/8=11
BCF T1CON, T1CKPS1 ; ...
BCF T1CON, T1OSCEN ; OSC INTERNO DISABLE
BSF T1CON, NOT_T1SYNC ; TIMER ASSINCRONO
BSF T1CON, TMR1CS ; CKL EXTERNO VIA T1OSO (RB6)
BCF T1CON, TMR1ON ; TIMER DISABLE
BCF PIR1, TMR1IF ; FLAG DE INTERRUPÇÃO
BSF STATUS, RP0
BSF PIE1, TMR1IE ; HABILITA INTERRUPÇÃO TIMER 1
BCF STATUS, RP0
BSF INTCON, GIE
BSF INTCON, PEIE ; INTERRUPÇÕES PERIFERICAS ENABLE
BSF T1CON, TMR1ON ; ENABLE TIMER 1
;---------------
INICIO:
;---------------
Essa rotina é um fragmento de um programa que faz o pic um timer counter programável desde 1 htz até 16khz, quero lembrar que o timer do pic ou de qualquer outro mcu de 8 bts não possui uma precisão exata, isso é devido ao fato de a recarga do timer ser feita através de software, a recarga ideal seria via hardware com o reload automático, e essa função só tem no timer 0 se não estou enganado e só no modo de 8 bits...
Dependendo da aplicação eu aconcelho utilizar um clock externo, se no caso de um relógio por exemplo utilize um chipset específico para isso...
VonNilmam "Assembler" e agora "C"