transmicion serial de la señal ECG a una PC

Hola todos me urge salir de estas dificultad bueno les cuento estoy transmitiendo datos de la señal ecg a través del pic 16f877a de forma serial a una pc paro estos datos cuando los visualizo las señal me sale incompleta
Como puedo almacenar cierta cantidad de datos en la memoria del pic para luego enviarlas en paquetes de datos a la pc y poder eliminar este problema
por favor necesito ayuda si me puede mandar algunos ejemplos de cómo serlo a alguna explicación se los agradecería

aqui les dejo el codigo de programa

Código:
list      p=16f877a                   ; list directive to define processor
   #include <p16f877a.inc>        ; INCLUIMOS LAS DEFINICIONES DEL PIC  TILIZADO
   
   #define BANCO_1 bsf STATUS,RP0   ;DEFINICION DE BANCO 1
   #define BANCO_0 bcf STATUS,RP0  ;DEFINICION DE BANCO 0
   ERRORLEVEL -306, -302            ;QUITAMOS LOS ERRORES DE BANCO EN MPLAB   
   RADIX HEX                       ; sistema de numeracion hexadecimal 

   __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _LVP_ON& _DEBUG_OFF & _CPD_OFF 
  
  Contador	equ	0x21	; Registro utilizado para demora.
; ***********************************
; *    DEFINICION DE ETIQUETAS      *
; ***********************************
   org 0
   goto inicio
 
; **************************************************
; *    RUTINA DE INICIO, AUQI CONFIGURAMOS EL PIC  *
; **************************************************
inicio 
    clrf       PORTA
    clrf   PORTB
    bsf   STATUS,RP0   ;Selecciona banco 1
    movlw   b'00001110'
    movwf   ADCON1      ;Puerta A E/S digitales
    clrf   TRISB      ;Puerta B se configura como 
  
 BANCO_1
   clrf   PORTC   
   movlw      b'10111111'
   movwf      TRISC
   movlw      b'00100100'   ; SYNC=0 (asincrono) y BRGH = 1 (alta velocidad)
   movwf      TXSTA 
   movlw      .129                            
   movwf      SPBRG     ;9600 CON UN CRISTAL DE 20MHz
   BANCO_0
   bsf   RCSTA,SPEN   ;USART en On 
  

Init_ADC
         BANCO_0
          movlw   b'10000001'
          movwf   ADCON0
 Loop     bsf   STATUS,RP0   ;Selecciona página 1
          movlw b'00000001'
          movwf TRISA      ;Puerta A entradas
          clrf   ADCON1      ;Puerta A entradas analógicas
          bcf   STATUS,RP0                 ;Selecciona página 0
          bcf   PIR1,ADIF                 ;Restaura el flag del 
          nop
          nop     
          bsf     ADCON0,GO_DONE      ;inicializa la conversion
ADC_TERNINO
          btfss    PIR1,ADIF   ;Fin de conversión ??
          goto     ADC_TERNINO          ;espera a terminar la conversion 
          bsf   STATUS,RP0   ;Selecciona banco 1
          movlw b'00001110'
          movwf ADCON1           
          BANCO_0
          movf      ADRESH,w
          andlw     b'11111111'         
          BANCO_0
          movwf     TXREG   ;el resultado es retornado  (8bits)
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop
          nop 
   allsend 
         BANCO_1       ; Banco 1  
         btfss  TXSTA,TRMT        ; byte transmitido ?????
         goto    allsend         ; No pues espera
         BANCO_0
         call  Demora_150us  
         goto Loop

Demora_150us	
              movlw	d'48'
              movwf	Contador
              decfsz	Contador
              goto	$-1
              return

    END:

mmm:
 
Última edición por un moderador:
veo que lo estas haciendo en asm, lo cual es bastante tedioso..... de todas maneras si te interesa te dejo uno que hice (lo mas sencillo posible) en ccs:

Código:
#include <16F877a.h>                //pic a utilizar
#fuses XT, NOWDT, NOPROTECT,NOLVP   //fusibles
#use delay(clock=4000000)          //frecuencia cristal
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7)

int16 adc;                        //variable donde se guardará la conversion analogo-digital

void main()
{SETUP_ADC(ADC_CLOCK_INTERNAL);  //adc con reloj interno
SETUP_ADC_PORTS(AN0);            //RA0 analogico el resto digitales

while(TRUE)
 {set_adc_channel(0);            //seleccion canal
 delay_us(40);
 adc=read_adc();                 //conversion adc
 putc(adc);                      //envio por el puerto serial
 delay_ms(100);                  //retardo 100ms
 }
}

si tienes alguna duda.. con mucho gusto te ayudo, saludos
 
Hola estoy ahciendo algo parecido, solo que soy algo nuev en el tema. Me apoyare en lo que escribieron(proju00 y jairo cuero), pero si pueden seguir escribiendo mas sobre el tema se los agradesco
 
Atrás
Arriba