Autor Tema: Conversion AD + TX rs232 pic16f876  (Leído 2106 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kiroov

  • PIC10
  • *
  • Mensajes: 3
Conversion AD + TX rs232 pic16f876
« en: 11 de Julio de 2005, 13:51:00 »
     Muy buenas,  estoy realizando un proyecto con un pic 16f876 y tengo un pequeño problema con el puerto serie.
      Estoy detectando una interrupcion en la RB0/INT0 que salta con la señal de un encoder que he colocado en el eje de un movil, cuando salta la interrupcion  tomo un muestra analogica por el pin RA0 y la guardo en NumH y NumL, despues envio las dos muestras por el puerto rs232. Mi problema es q no recibo dos muestras por el puerto serie si no tres, bueno varía, algunas veces son dos y otras tres. El aparatito no funciona xq algunas veces me envia la misma muestra para valores de tension diferentes.

La velocidad con la q tengo q hacer el proceso debe ser lo maximo posible por q en principio quiero colocar un modulo de radio en el movil y tomar muestras en tiempo real (lo mas deprisa posible).

      Muchas gracias por todo   Sonrisa Gigante

ahi va el codigo
; ************************************
; *    INCLUDES, BANCOS, ERRORES     *
; ************************************
   
   list      p=16f876            ; list directive to define processor
   #include <p16f876.inc>        ; INCLUIMOS LAS DEFINICIONES DEL PIC                                                       UTILIZADO
   #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 & _XT_OSC & _WRT_ENABLE_OFF & _LVP_ON& _DEBUG_OFF & _CPD_OFF

; frecuencia clock
XTAL_FREQ   EQU   4000000   ; OSC freq in Hz



; ***********************************
; *    DEFINICION DE ETIQUETAS      *
; ***********************************
cont       equ 0x20
NumH   equ 0x25
NumL    equ 0x26
PDel0    equ 0x27
PDel1    equ 0x28
PDel2    equ 0x29

; ****************
; *    START     *
; ****************

   org 0
    goto inicio


; ******************************************
; *    RUTINA de INTERRUPCIÓN GENERAL      *
; ******************************************

   org 4
 
      call    adsetnow
      call    Xready
      call    bith
      call   allsend
      nop
      nop
      call   Xready
      call    bitl
      call    allsend
      nop
      nop
      bcf     INTCON,INTF
      retfie



; **************************************************
; *    RUTINA DE INICIO, AUQI CONFIGURAMOS EL PIC  *
; **************************************************
inicio

   bcf        STATUS, RP0
   bcf      STATUS, RP1
   clrf      PORTB
   clrf      PORTC
   BANCO_1
   movlw      b"11111111"
   movwf      TRISB
   movlw      b"10000000"
   movwf      TRISC
   BANCO_0
   bsf         RCSTA, 7       ; activamos el USART MODO ASINCRONO
   BANCO_1
   movlw      b"00100100"   ; SYNC=0 (asincrono) y BRGH = 1 (alta velocidad)
   movwf      TXSTA
   movwf      .25                             <<<<<-------------     AQUI ESTA EL ERRORR
   movwf      SPBRG
   BANCO_0
   bcf         STATUS, 5
   clrf          PORTC
        BANCO_1
   movlw      b"11000000"
   movwf      OPTION_REG
        BANCO_0
   movlw      b"10010000"
   movwf      INTCON


; **********************************
; *       PROGRAMA PRINCIPAL       *
; **********************************
bucle
   goto    bucle

; ********************************************
; *    SUBRUTINAS PARA LAS INTERRUPCIONES    *
; ********************************************


adsetnow
   
      call     Init_ADC
      call     Read_ADC
           return

      
bith
      movf     NumH,0
      movwf    TXREG
      BANCO_1
      return

bitl

      movf   NumL,0
      movwf   TXREG
      BANCO_1
      return



Init_ADC
; Set ADCON0
          movlw   b"10000001"
          movwf   ADCON0
; Set ADCON1
          BANCO_1
          movlw   b"10001110"
          movwf   ADCON1
          BANCO_0
      return


Read_ADC
          bsf      ADCON0, GO_DONE      ;inicializa la conversion
          btfsc   ADCON0, GO_DONE
          goto    $-1            ;espera a terminar la conversion
         
      andlw   b"00000011"
          movf    ADRESH,W
      nop
          movwf   NumH
          BANCO_1
          movf    ADRESL,W
          andlw    b"11111111"
         BANCO_0
          movwf   NumL   ;el resultado es retornado en NumH (bit 0 y bit1) y NumL (8bits)
         return    


Xready

      BANCO_1
           bsf      TXSTA, TXEN
      BANCO_0
      return

allsend
      btfss   TXSTA,TRMT         ; byte transmitido ?????
      goto    allsend         ; No pues espera
      BANCO_0         
      return



   endSonrisa GiganteSonrisa GiganteSonrisa Gigante

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: Conversion AD + TX rs232 pic16f876
« Respuesta #1 en: 12 de Julio de 2005, 07:19:00 »
Hola kiroov. Estuve viendo tu codigo, no lo revise a fondo pero logre darme cuenta de algunas cosas.
Primero, si quieres lograr una velocidad de transmision mas alta, puedes cambiar de cristal usando uno de 10MHz, 16MHz o 20MHz, con ello puedes trabajar a una velocidad mas alta de transmision serial.
Segundo, me aprece que los errores que obtienes es porque no has configurado bien tus interrupciones. Cuando estes dentro de la misma interrupcion no olvides desabilitarlas, pues mientras se ejecuta esa interrupcion, puede llegar otra generando asi incoherencia en sus respuestas. Ademas, debiste haber guardado el registro STATUS, W y PCLATH apenas entras a la interrupcion, restituyendolas antes de salir de la misma.

Corrigue esos errores y me cuentas como te fue...Rebotado

Un saludo desde Peru Fumador
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado kiroov

  • PIC10
  • *
  • Mensajes: 3
RE: Conversion AD + TX rs232 pic16f876
« Respuesta #2 en: 12 de Julio de 2005, 15:42:00 »

   Hola Artifox, gracias por contestarme el post.
   A ver cuando entro en la interrupcion el bit GIE de INTCON se pone a 0 verdad??? con lo q toy deshabilitando las interrupciones, y cuando retfie estoy poniendo a 1 el gie de intcon. Lo q he hecho ahora es cargar 0x00 en intecon cuando entro en la interrupcion y volver a cargar 0x90  antes de salir.
Tmb guardo W y STATUS cuando entro a la interrupcion y de igual forma los recargo cuando voy a salir.
Tengo una respuesta muy parecida a la tenia antes Ardiendo

Podrias ser un poco mas conciso cuando dices q ves  errores cuando configuro las interrupciones??? xq no consigo ver el error.  

Muchas gracias!!!!   Sonrisa Gigante


KirooV ,  FRANJA REVOLUTIONS !!!  

Desconectado kiroov

  • PIC10
  • *
  • Mensajes: 3
RE: Conversion AD + TX rs232 pic16f876
« Respuesta #3 en: 13 de Julio de 2005, 04:42:00 »

    Muy Buenas a Todos, por fin he encontrado el error (oeoeoeoeoeoe, jejeje), como decia en el mensage anterior cuando entramos en la interrupcion se desactivan las interrrupciones globalmente y se guarda el contenido del PCL en la pila (no problemo pa volver). Sonrisa Gigante
    El problema estaba cuando cargaba el SPBRG (generador de baudios)

   movlw      .25        <<<-----   ESTA ES LA INSTRUCION CORRECTA
   movwf      SPBRG

   
     Ahora funciona de vicio!!!! FlashFlashFlash
     
A seguir programando q tengo ganas de verlo corre!! jejeje

Enga, espero q alguno le ayude!  
_____________________________________________________________

kiroov from la franja


 

anything