hola a todos...necesito que alguien me oriente con este programa ya que tengo que ejecutarlo en lenguage c (pic C)
a continuacion les escribo el programa ya que aki se los copie en asm pero este programa tengo que hacerlo en c
les pido ayuda a ustedes ya que me han recomendado mucho este pagina saludos a todo y espero su ayuda...
;* Este programa mide el periodo de una señal oscilatoria en la *
;* patita RC2/CCP1. El valor de periodo capturado representa el *
;* número de ciclos Tcy por periodo y se envía continuamente por*
;* el puerto serie. Se supone un cristal de 14.7456 Mhz *
;****************************************************************
list p=p16f877A
Include "p16f877A.inc"
org 0x0000
msnib EQU 0x20
lsnib EQU 0x21
Inic CALL initrans ;inicializa puerto serie como transmisor
BSF STATUS,RP0 ;Banco1
BSF TRISC,2 ;patita RC2/CCP1 como entrada
BCF STATUS,RP0 ;Banco 0
MOVLW 0x01
MOVWF T1CON ;Configura Timer1 modo temporizador, preesc 1/1
CLRF TMR1H ;Inicializa en cero el timer 1
CLRF TMR1L ;apaga el módulo CCP para inicializar
CLRF CCP1CON ;limpia latch de CCP1
BSF CCP1CON,CCP1M2 ;Habilita modulo CCP1 para modo de captura
BSF CCP1CON,CCP1M0 ;en transición de subida
BCF PIR1,CCP1IF ;limpia bandera de interrupcion.
checa BTFSS PIR1,CCP1IF ;checa bandera
GOTO checa ;si no se ha activado espera
BCF PIR1,CCP1IF ;si ya se activó, la limpia
CLRF TMR1L ;limpia la cuenta del timer 1
CLRF TMR1H
MOVF CCPR1H,W ;copia periodo capturado
CALL Envbyte ;y lo envía por el puerto serie
MOVF CCPR1L,W
CALL Envbyte
MOVLW 0x0D ;envía separador
CALL envia
MOVLW 0x0A
CALL envia
GOTO checa ;repite
;***************************************************************
; Subrutina que envía el byte en W por el puerto serie, separado
; en los códigos ASCII de sus dos nibbles hexadecimales
;***************************************************************
Envbyte:
MOVWF msnib ;pone byte en msnib
MOVWF lsnib ;y una copia en lsnib
SWAPF msnib,1 ;intercambia nibbles en lsnib
MOVLW 0x0F ;máscara para limpiar el nibble alto
ANDWF msnib,1 ;limpia parte alta de msnib
ANDWF lsnib,1 ;limpia parte alta de lsnib
MOVF msnib,W ;carga msnib en W
CALL asc ;obtiene código ASCII equivalente
CALL envia ;lo envía por el puerto serie
MOVF lsnib,W ;carga lsnib en W
CALL asc ;obtiene código ASCII equivalente
CALL envia ;lo envía por el puerto serie
RETURN
asc ADDWF PCL,1 ;Calcula el código a retornar
;Saltando W instrucciones adelante
DT "0123456789ABCDEF"
;****************************************************************
;Subrutina para inicializar el puerto serie USART como transmisor
;a 9600 Bauds, considerando un cristal de reloj de 14.7456 MHZ
;****************************************************************
initrans:
BCF STATUS,RP1
BSF STATUS,RP0 ;banco 1
BCF TXSTA,BRGH ;pone bit BRGH=0 (velocidad baja)
MOVLW 0x17 ;valor para 9600 Bauds (Fosc=14.7456 Mhz)
MOVWF SPBRG ;configura 9600 Bauds
BCF TXSTA,SYNC ;limpia bit SYNC (modo asíncrono)
BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisión)
BCF STATUS,RP0 ;regresa al banco 0
BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie)
RETURN
;***************************************************************
;Subrutina para enviar el byte guardado en W por el puerto serie
;***************************************************************
envia BSF STATUS,RP0 ;banco 1
esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisión
GOTO esp ;si está ocupado espera
BCF STATUS,RP0 ;regresa al banco 0
MOVWF TXREG ;envía dato guardado en W
RETURN
end