Autor Tema: ayuda para crear una medicion de periodo en "C"  (Leído 1345 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado rabacero

  • PIC10
  • *
  • Mensajes: 7
ayuda para crear una medicion de periodo en "C"
« en: 30 de Junio de 2009, 22:25:40 »
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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ayuda para crear una medicion de periodo en "C"
« Respuesta #1 en: 30 de Junio de 2009, 23:19:42 »
No contesto mensajes privados, las consultas en el foro