Proyectos de comunicacion PIC16F877A con LabVIEW por el puerto Serial (RS232)

hola bueno sobre tu pregunta la prograamcion en labwie es solo para escribir daotos en este caso el pic tienes k configurar para la recepcion y tx comunicacion asincrona duplexx
 
supongamos que solo quiero encender 2 led, como haria el codigo del pic? en la interrupcion?? hago casos con valores string?, tengo varias dudas soy nuevo en labview y ccs, antes solo proton,pic basic y visual
 
Bueno, electrobicho. Te comento lo siguiente.
Para que enciendas dos leds mediante labview, tienes que utilizar necesariamente una interrupción por recepción que genera en el pic.

Sabemos que : CUANDO DETECTA EL BIT DE PARADA EL BUFFER RCREG
entonces esto genera una interrupción si es que hemos configurado el: BSF PIE1,RCIE
Esto es lo que habilita el permiso para la interrupción generado por PIR1,RCIF
Esto es como una bandera que indica el estado del buffer RCREG RCIF es cero.

Cuando el buffer está vacio, entonces no genera interrupción, RCIF a 1 es cuando el buffer está lleno.
Entonces ahí fácil configuramos la interrupción.

Bueno, te lo puedo dar los codigos en asembler no manejo el ccs


Código:
list p=16f877a           ;Tipo de procesador
 INCLUDE"P16F877a.Inc"    ;Librerias de Registros del PIC
#DEFINE SALIDA  PORTB,0
#DEFINE SALIDA1 PORTB,1
#DEFINE SALIDA2 PORTB,2
#DEFINE SALIDA3 PORTB,3
;**************************** DEFINICION DE REGISTROS***********************************
 CBLOCK 20H

 LEIDO_COMP
 MAYON
  PDel0 
  PDel1  
 endc

;**************************************************************************************** 
 org 00
 goto inicio
  org 04
 GOTO INTER_RX

inicio
      BSF RCSTA,SPEN
      BSF STATUS,5
      BSF SALIDA
      BSF SALIDA1
      BSF SALIDA2
      BSF SALIDA3
      clrf PORTA                     ;Inicializa el puerto A
      movlw 0X07                     ;Apaga los comparadores y
      movwf CMCON                    ;Activa los pines como I/O
      BSF TRISC,7      ;RX
      BCF TRISC,6      ;TX
      MOVLW b'00100100'
      MOVWF TXSTA
      MOVLW .25
      MOVWF SPBRG
      BSF  PIE1,RCIE
      BCF STATUS,5
      BSF RCSTA,SPEN    ;ACTIVA USART
      MOVLW b'10010000'   ;configuracion de la usart
      MOVWF RCSTA
      MOVLW b'11000000'
      MOVWF INTCON                   ;Permiso Interrupciones generales GIE<7>
                                     ;Permiso perifericos que NO se controlan con INTCON 
      BSF STATUS,5
      BSF TXSTA,TXEN                  ;HABILITACION LA  TRANSMISION
      BCF STATUS,5

 
 


MOSTAR
      BCF STATUS,Z
      MOVF LEIDO_COMP,W
      SUBWF B'00000001'
      BTFSS STATUS,Z
      GOTO   ssssss
      GOTO  PRIMER_DISPO



PRIMER_DISPO
      BTFSS SALIDA 
      GOTO   ERORR
      GOTO   MENSAJE_OK
      
MENSAJE_OK
          MOVLW 31
          CALL tx_reg 
          GOTO BUCLE
          CALL OKAS
ERORR
     MOVLW 30
     CALL tx_reg
     goto BUCLE

OKAS
    MOVLW 33
    CALL tx_reg
    GOTO BUCLE
ssssss
      MOVF RCREG,W  
      MOVWF MAYON  
  
      CALL tx_reg
      GOTO BUCLE
              
tx_reg
      BCF INTCON,GIE  ;SE DESABILITA LAS  INTERRUPCIONES GEENRALES
      MOVWF TXREG     ;SE ENVIA EL DATO ALA PC
      BSF STATUS,5  
      
tx_on
     BTFSS TXSTA,TRMT   ; COMPRUEBA SI ACABO DE TX
     GOTO  tx_on
     bcf STATUS,5
     RETURN


      
INTER_RX 
        BTFSS PIR1,RCIF                      ;Interrupcion producida por recepcion?
        GOTO INTER_RX                     ;No. Otro tipo de interrupción
        BCF PIR1,RCIF                        ;Si. Bajar bandera
        MOVF RCREG,W                         ;Lectura dato recibido
        MOVWF LEIDO_COMP                     ;carga valor leido del computador a este registro
        GOTO inicio
       
        ;,,,,,,,,,,,,,,,,,,,,,,,,,,call TX_REG                          ;llama subrutina para enviar el dato

                
     

BUCLE
     NOP
     NOP
     NOP
     NOP
     NOP 
     NOP
     BTFSS PIR1,RCIF
     GOTO BUCLE
     GOTO INTER_RX
;-------------------------------------------------------------
; Generado con PDEL ver SP  r 1.0  el 30/11/2011 Hs 1:25:22
; Descripcion: Delay 500000 ciclos
;-------------------------------------------------------------
DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
;-------------------------------------------------------------
    
                                                      

     END
Bueno, alguna duda, me mandas consultas.
 
Última edición por un moderador:
Gracias por la respuesta, lamentablemente nunca he programado en ensamblador.
Antes sólo lo hacía en pbp y proton, pero me obligaron a usar ccs (ne me agrada y nunca me a agradado c).
Pero aún así veré si logro deducir algo.



Así lo estoy utilizando. Si alguien me ayuda, sería excelente.
Código:
#include <16f877a.h>
#fuses XT,NOWDT
#device adc=8
#use delay(clock=4M)
#use rs232( baud=9600 , xmit=pin_c6, rcv=pin_c7)
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte portD=0x08
#define LED1 PIN_D0
#define LED2 PIN_D1
#define LED3 PIN_D2
#define LED4 PIN_D3
#define LED5 PIN_D4
#define LED6 PIN_D5
#define LED7 PIN_D6
#define LED8 PIN_D7

char VALOR;
#int_rda
void serial_isr()
{
   VALOR=getchar();
}

void main()
{
   set_tris_D(0); 
   set_tris_C(0x80);
   portd=0;
   
while(true)
   {
      while (!kbhit());
      if (VALOR==1)portd=1;
      if (VALOR==2)portd=2;
    }
 }
 
Última edición por un moderador:
Amigos:

quizas este cerrado este tema, pero tengo el siguiente problema.
con un pic 16F873A estoy leyendo 2 señales analogicas provenientes de 20amplificadores de instrumentacion usados para amplificar la señal de 2 celdas de carga.
La salida del Amplif instr esta conectadas a las patas ADC del PIC y luego usando un MAX232 conecto ese proyectyo a una PC con Labview.

El pic esta configurado para convertir las señales analogicas y enviar la conversion por UART a la pc. El labview levanta esos datos y los traduce a peso.

Simulando todo el proyecto con proteus y labview la conversion es perfecta. no hay perdida de bits en la comunicacion.

ahora cuando utilizo el sistema de celdas+amplif de instru+pic+max232+labview al leer los datos con hyperterminal veo que la señal convertida por el pic oscila entre +- 20 bits. Es decir si la conversion ADC deberia ser 128 bits , con simulacion en proteus y viendo los datos recibidos por hyperterminal recibo los 128+-1 bit. Ahora cuando energizo el sistema pic+max232 la lectura con el hyperterminal de los datos enviados por el pic correspondientes a la conversion tienen un error de +-20 bits.

La complicacion surge cuando al medir la calidad de la señal de 0-5v provenientes de la placa amplificadora de la señal de las celdas, esta medicion es muy estable incluso medida en los bornes previos a las patas ADC del PIC. Pero si tomamos los datos enviados por el pic al puerto seria como si la señal analogica variara en +-5% del valor original lo cual es imposible ya que el peso colocado sobre las pesas esta fijo.

Alguna sugerencia en cuanto al armado de la placa del pic con el 232.

Adicional quiero comentar que en una misma placa estan conectados los bornes para conectar las señales analogicas, esta alojado el MAX232, el pic. Es recomendable esta configuracion?
Estoy seguro que es ruido pero de que forma podria mejorarlo??
 
espero que el problema no este cerrado, necesito ayuda, estoy con un proyecto de EMG y mi problema es el mismo que tenia ya alguien de aquí, yo ya tengo instalado todos lo necesario, obtengo los datos, puedo ver algo, pero no es lo que necesito, yo no se si estoy teniendo solo problemas con las gráficas, pero no me dan muchas mas opciones para gráfica,y el oro problema si alguin lo sabe, es como gráfica 2 señales en una misma gráfica, ya que yo estor ,mandando tramas de string de una señal y luego la trama de la otra, por lo que quiero saber que función es la que necesito para ir separando estas en un array o algo parecido, luego lo tendría que convertir a datos si es necesario y posteriormente untarlas para el mismo gráfico simultáneamente, y no encuentro funciones para hacer esto, y tampoco ninguna que me de los suficientes parámetros como para saber si es posible realizar lo, si alguien sabe algo, lo que sea, por favor comente o si no es problema suba algo, yo adjunto lo poco que use, saludos a todos los de este magnifico foro.
 

Adjuntos

  • comunicacion simple 1.zip
    18.1 KB · Visitas: 241
con un bundle, es la forma más básica de lograrlo, vi un ejemplo en youtube, no recuerdo como le puse pero ahi vienen,el bundle solo le conetas los datos de entrada y lo mandas a la gráfica
 
si con eso no es el problema, sino que no se como hacer para dividir en dos la señal que me llega desde el pic por puerto serie, tengo dos señales que estoy mandando primero un string y luego el siguiente. el tema es que no se como hacer para dividir las señales que mando, o tampoco se como hacer para leer dos canales de una placa de adquisición simultáneamente, si lo saben agradezco la respuesta, saludos.
 
yo mande los datos digamos que mandare el valor 123 y 321, entonces mandaba A123B321, entonces utilizas string subset y recorres un lugar, le colocas "1" en offset, después, este te entregara a la salida 123b321 a la salida de la cadena, ahora usa search/split string y le das "b" en este caso, la salida ahora sera 321 y así sucesivamente, al menos así lo hice y funciono, la verdad no recuerdo bien
 
yo termine mi carrera en el armado de u controlador mio-eléctrico integrado, controlando con este u grado de libertad de un robot, para esto extraje dos señales EMG, si te interesa te lo mando, saludos.
 
¿Hola, qué tal?
Estoy haciendo un proyecto en el cual tengo que mandar tres variables, bueno esto ya lo hice pero me gustaría separarlas, ya que en la lectura me aparecen juntas, ejemplo. ( 12.33 10.2 9.5 )
Y lo que quiero es que en cada cuadro me aparezca cada una para poderle poner indicadores,
así sin esto que se vería mucho mejor, pero no sé utilizar mucho labview, la comunicacion la hice gracias a ejemplos que vi aquí.

¿Que me recomiendan revisar para lograrlo?


Saludos.
 
Última edición por un moderador:
hola estaba leyendo el foro y me tope con tu pregunta, resulta que tengo el mismo problema..
quisiera saber si lo pudiste resolver, te agradecería mucho si me pudieras ayudar...

Estoy haciendo un proyecto en el cual tengo que mandar tres variables, bueno esto ya lo hice pero me gustaría separarlas, ya que en la lectura me aparecen juntas, ejemplo. ( 12.33 10.2 9.5 )
Y lo que quiero es que en cada cuadro me aparezca cada una para poderle poner indicadores,
así sin esto que se vería mucho mejor, pero no sé utilizar mucho labview, la comunicacion la hice gracias a ejemplos que vi aquí.
 
Buenas tardes.
Quisiera saber si habrá algún problema entre la comunicación entre mi pic 16f877a y labview
Con este adaptador usb a rs232 ya que mi computadora no cuenta con ese puerto.
Alguien que haiga tenido ya esa experiencia?




11143600_1612735925610135_9193591172033569469_n.jpg
 
Si se puede, lo que no se puede es usarlo en programadores seriales como el JDM, pero ese tipo de adaptadores si funcionan para comunicarse de USB a RS-232 con un PIC.
 
Atrás
Arriba