Autor Tema: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A  (Leído 4371 veces)

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

Desconectado lawren

  • PIC10
  • *
  • Mensajes: 9
CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« en: 22 de Junio de 2012, 05:45:46 »
bueno amigos del foro, estoy realizando un programa que convierta un dato analogo a digital  el cual debe ser visualizado en la PC, para lo cual estoy utilizando visual basic,  lo que quiero es que tome un dato en la entrada analoga lo convierta  a digital y luego la envie, mientras no hay variacion en la entrada analoga no envie, solo que envie una sola ves por cada variacion de la entrada, es donde tengo un problema ya que el programa que  estoy relizando  envia constamtemente, haber si alguien me puede hechar una manito en esto. adjunto el circuito  y el programa que abanse . Gracias..

LIST P=16F877A
   __config 3f32

   INCLUDE  <P16F877A.INC>
                   INCLUDE <MACROPIC.INC>

   ORG      0000H
   banco 1      
   bcf      TRISC,6            ; RC6 como salida
   mov      SPBRG,.129         ; Vtx = 9600bps
   mov      TXSTA,B'00100100'   ; TX-ON / 8 bits /BRGH=1
                  
   banco 0      
;===========================================
   movlw   B'10101001'      ; Tad = 1.6us /CH-5 /ON
   movwf   ADCON0
                  bsf      RCSTA,SPEN
OTRA
   bsf   ADCON0,GO      ; Inicio de conversión
   btfsc   ADCON0,GO
   goto   $-1         ; ¿Fin?
   movf   ADRESH,0      ; W <-- ADRESH
   
                   call   TX_DATO
                   call   RET30us
   goto   OTRA
;=========================================
TX_DATO
   banco   1
   btfss   TXSTA,TRMT
   goto   $-1
   banco   0
   movwf   TXREG
   return
;=========================================
RET30us
   movlw   .30
   movwf   20H
LAZO
   nop                  ; 0.2us
   nop                  ; 0.2us
   decfsz   20H,1         ; 0.2us
   goto   LAZO         ; 0.4us
   return
   END
« Última modificación: 22 de Junio de 2012, 13:24:43 por lawren »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #1 en: 22 de Junio de 2012, 06:22:16 »
Pues cuando haces la conversion comparas con la anterior haciendo la resta SUBWF o XORWF si da 0, STATUS,Z=1, no transmites ya que es igual al anterior, si STATUS,Z=0 transmites y lo guardas en un reg. de RAM para comparar en la proxima conversion.

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #2 en: 22 de Junio de 2012, 08:14:30 »
ademas deberias poner un margen del valor del A/D.ya que las pequeñas interferencias hacen que los valores del A/D varien un valor ariba/abajo.
y seguiria mandndote datos por la usart.aunque en este caso serian valores diferentes.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado lawren

  • PIC10
  • *
  • Mensajes: 9
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #3 en: 22 de Junio de 2012, 11:35:46 »
hola tapi8 gracias por responder mi pregunta seguiendo tu instruccion hice esto.  me puedes decir en que estoy mal un favor.

LIST P=16F877A
   __config 3f32

   INCLUDE  <P16F877A.INC>
                   INCLUDE <MACROPIC.INC>

CBLOCK 0X20
VAR1
ENDC

   ORG      0x00
   banco 1      
   bcf      TRISC,6            ; RC6 como salida
   mov      SPBRG,.129         ; Vtx = 9600bps
   mov      TXSTA,B'00100100'   ; TX-ON / 8 bits /BRGH=1
                  
   banco 0      
;===========================================
   movlw   B'10101001'      ; Tad = 1.6us /CH-5 /ON
   movwf   ADCON0
                  bsf      RCSTA,SPEN
OTRA
   bsf   ADCON0,GO      ; Inicio de conversión
   btfsc   ADCON0,GO
   goto   $-1         ; ¿Fin?
   movf   ADRESH,0      ; W <-- ADRESH
  
  ENVIO                 call   TX_DATO
                   movf VAR1 ; el dato enviado guardo en este variable
                  call   RET30us
                   goto OTRA2
OTRA2
   bsf   ADCON0,GO      ; Inicio de conversión
   btfsc   ADCON0,GO
   goto   $-1         ; ¿Fin?
   movf   ADRESH,0      ; W <-- ADRESH
   subwf   VAR1,W        ;comparo si el dato guardado es igual o diferente al nuevo conversio que realice

   btfss   STATUS,Z
    goto  ENVIO;  es cero por lo que  envio y guardo
   bcf  STATUS, Z  ; es uno borro el flag  
    goto OTRA2
;=========================================
TX_DATO
   banco   1
   btfss   TXSTA,TRMT
   goto   $-1
   banco   0
   movwf   TXREG
   return
;=========================================
RET30us
   movlw   .30
   movwf   20H
LAZO
   nop                  ; 0.2us
   nop                  ; 0.2us
   decfsz   20H,1         ; 0.2us
   goto   LAZO         ; 0.4us
   return
   END
« Última modificación: 22 de Junio de 2012, 13:25:00 por lawren »

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #4 en: 22 de Junio de 2012, 13:54:19 »
Creo que el fallo es que no guardas el valor de ADRESH en VAR1:

movf VAR1 ; el dato enviado guardo en este variable

Seria:

movwf  VAR1

Ademas a ENVIO el programa llega de dos formas (lo estoy mirando a ojo sin simular) desde OTRA donde no miras si hubo cambio, y desde OTRA2 aqui si miras si hubo cambio, guarda el valor despues de "btfss   STATUS,Z"  tampoco borres el FLAG Z.

Citar
ademas deberias poner un margen del valor del A/D.ya que las pequeñas interferencias hacen que los valores del A/D varien un valor ariba/abajo.
y seguiria mandndote datos por la usart.aunque en este caso serian valores diferentes.

Esto que te dice Groundman tambien es cierto, aunque tu no utilizas los dos ultimos bits (ADRESL) y esto te amortiguara variaciones pequeñas, habra que ver si es suficiente.

Desconectado lawren

  • PIC10
  • *
  • Mensajes: 9
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #5 en: 22 de Junio de 2012, 16:11:27 »
 Groundman gracias por tu aporte la verdad soy novato en programacion recien estoy comensando y lo que entendi es lo siguente:  el registro ADRESH tiene 10 bit no es cierto y el ADRESL 6  bits, como yo esoty utlizando el adresh y mi conversor es de 8 bit me queda 2 bits el cual hace que mi ad varie de arriba/abajo y como puedo poner esos margenes y no utilizar los esos dos ultimos bits

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #6 en: 22 de Junio de 2012, 16:56:16 »
No, ambos reg. tienen 8 bits, como todos en estos PICs, pero pero el ADC es de 10 bits, puedes hacer conversion a 8bits con uno solo, o usar los dos, mirate en el datasheet ese apartado.

Si no controlas mucho ingles mirate esto:

http://www.alos.5u.com/indexpic877.htm

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #7 en: 23 de Junio de 2012, 06:56:00 »
lawren.es como dice tapi8.el ADC tiene 10 bit.asi que si el pic trabaja con niveles logicos de 5v. cada bit del ADC se incrementa cada 5/1024=0.0048v
pero si solo utilizamos ADRESL.solo podremos llegar a visualizar 1,24v en un solo registro.y luego volveria a 0v para seguir incrementandose.

por eso si quieres visualizar hasta los 5v en un solo registro,tendras que utilizar los bits b1 y b0 del registro ADRESH y los bits d7,d6,d5,d4,d3 y d2.del registro
ADRESL. lo que pasa es que tendras menos precision en la lectura del valor analogico.con un valor minimo de 0.019v.que tampoco esta tan mal.
y que aun asi puede que el valor oscile por las interferencias.

espero no haberme equivocado en los calculos.ya hace mucho tiempo que no trabajo con los A/D.
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado lawren

  • PIC10
  • *
  • Mensajes: 9
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #8 en: 05 de Julio de 2012, 22:48:57 »
muchas gracias por su ayuda amigos del foro y la verdad me salio  queria compartilos gracia a ustedes.

LIST P=16F877
                      __config 3f32   ; para 20MHZ
               ;__config 3f31   ; para 4MHZ
                    INCLUDE  <P16F877.INC>
                          INCLUDE <MACROPIC.INC>
 ;*************************************************************                 
                          CBLOCK    0x20
                          VAR1
                          VAR2
                          ENDC
                         ORG    0x00
;**************************************************************
banco 1
 
                           mov   ADCON1, b'00001110'          ;Justificamos el resultado de los registros
                                                                                  ;ADRES a la izquierda (ADMF=0). Solo el pin RA0 será canal analógico
                                                                                  ;y las tensiones de referencia para el ADC serán VREF+=VDD y VREF-= VSS
                           bsf            TRISA,0                        ;Canal AN0 como entrada
                           bcf            TRISC,6                     ;RC6/TX salida, pin de transmisión
                           mov      SPBRG,.129            ; Vtx = 9600bps
                           mov      TXSTA,b'00100100'   ; TX-ON / 8 bits /BRGH=1
banco 0
;**************************************************************
                           movlw   B'01000001'      ; Tad = 1.6us /CH-0 /ON/FOSC/8
                     movwf       ADCON0   
                           bsf      RCSTA,SPEN                ; SPEN = 1   
INICIO   
                     bsf            ADCON0,GO      ; Inicio de conversión
                     btfsc            ADCON0,GO      ;pregunto si la conversion termino
                           goto   $-1                           ; ¿Fin?
                           movf            ADRESH,W                  ;Si, W=ADRESH     
GUARDA             movwf       VAR1                           ;cargo el dato convertido en esta variable
                           call             TX_DATO         ;llamo para enviar 
                           
NUEVO
                    bsf            ADCON0,GO      ; Inicio la nueva  conversión
                    btfsc            ADCON0,GO      ;pregunto si la conversion termino
                          goto   $-1                           ; ¿Fin?
                          movf            ADRESH,W                  ;Si, llevo a W=ADRESH     
                          movwf       VAR2            ;guardo la nueva conversion
                          subwf         VAR1,W         ;comparo si el dato enviado es igual a la nueva conversion
                    btfss           STATUS,Z         ;pregunto por el flag
                          goto           Z_0            ;la comparacion es diferente ?
                    goto       Z_1            ;la comparacion es igual ?
Z_0                    movf      VAR2,W         ;si es diferente saco el nuevo dato a    W
                          goto     GUARDA         ;me voy pra enviar
Z_1                     bcf       STATUS,Z         ;si es igual borro el flag inicio la nueva conversion
                          goto     NUEVO
;**************************************************************
TX_DATO
banco 1
                     btfss            TXSTA,TRMT      ;pregunto  si la linea de transmision esta libre
                     goto   $-1
banco 0
                     movwf   TXREG         ;el dato que esta en W es enviado
                           btfss            PIR1,TXIF                     ;Espera hasta que transmisión culminó
                     goto   $-1
                           return
           
                           END   

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #9 en: 06 de Julio de 2012, 04:00:38 »
Me alegro por tu logro.la primera vez que use el a/d.me satifacio mucho.
Lo principal de la programación de pics es aprenderse el funcionamiento
De los módulos internos.y luego ir avanzando a otros pic más avanzados.
Los módulos en distintas series se parecen.pero no son iguales.

Saludos
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: CONVERSOR A/D Y TRANSMISION USART EN PIC 16F877A
« Respuesta #10 en: 06 de Julio de 2012, 04:48:41 »
Me alegro que te haya salido, lawren  :-/ :-/