LabVIEW Gi - Programadores G, manuales y tutoriales LabVIEW
LabVIEW ico
LabView Gi
LabVIEW ico
1ª Página de referencia en castellano para programadores G .:: www.labview.tk (enlace redirigido) ::.:: http://perso.wanadoo.es/jovilve (enlace directo)::.

 


Página Optimizada

1024x768
 

 

Proyecto Placa de Adquisición y Control por Puerto Serie
Versión 1.0

 
Como especificaciones para la primera versión del proyecto, se controlarán 8 salidas dígitales y monitorizarán 6 entradas digitales mediante LabVIEW.
Se utliza el microcontrolador Pic16f876 y el integrado Max232 como interfaz con el puerto serie.
Simularemos las salidas digitales mediante LEDs en el PORTB del PIC y las entradas digitales mediante switches en el PORTA del PIC.
Pincha el enlace para ver el esquema eléctrico: esquema.jpg

COMPONENTES:

IC1 MAX232.
IC2 PIC16F876.
Q1 XTAL 4MHZ.
D1, D2, D3, D4, D5, D6, D7, D8    Diodos LED.
C1, C2 Condensadores 18pf.
C3, C4, C5, C6 Condensadores electroliticos 10 uF (ojo con la polarización) .
R1, R2, R3, R4, R5, R6, R7, R8, R9     Resistencias 470 Ohmios.
R10, R11, R12, R13, R14, R15      Resistencias 10 KOhmios.
Conector SUBD9 Hembra.

           
El codigo fuente del microcontrolador:

#include "macros16.inc"

;***** VARIABLE DEFINITIONS

contador             EQU    0x72   
bIntSaveW0           EQU    0x70            ; variable used for context saving
bIntSaveStatus       EQU    0x72            ; variable used for context saving
bIntSaveSt           EQU    0x73        ; save Status
bIntSaveFSR          EQU    0x74        ; save FSR
bIntSavPCLATH        EQU    0x75        ; interrupt storage for PCLATH


;**********************************************************************
        ORG     0x000             ; processor reset vector
        clrf    PCLATH            ; ensure page bits are cleared
        goto    main              ; go to beginning of program
        ORG     0x004             ; vector de interrupciones
       
        movwf bIntSaveW0       ; save W
       
        ;; only way to preserve Status bits (since movf sets Z) is with a
        ;; swapf command now

        swapf STATUS,W ; Status to W with nibbles swapped
        BANK0
        movwf bIntSaveSt
        movfw FSR
        movwf bIntSaveFSR         ; save FSR
        movf PCLATH,W
        movwf bIntSavPCLATH         ; interrupt storage for PCLATH
        clrf PCLATH             ; set to page 0
       
        ;; interrupción por recepción de datos

        btfsc _RCIF            ;CAUSANTE DE LA INTERRUPCIÓN?
        call IntUSART            ;solo esperamos interrupcion a la recepcion.


IntReturn
        BANK0   
        movf bIntSavPCLATH,W         ; interrupt storage for PCLATH
        movwf PCLATH
        movf bIntSaveFSR,W         ; restore FSR
        movwf FSR
        swapf bIntSaveSt,W         ; get swapped Status (now unswapped)
        movwf STATUS             ; W to Status ( bank select restored )
        swapf bIntSaveW0,F         ; swap original W in place
        swapf bIntSaveW0,W         ; now load and unswap ( no status change)
        BANK1
        BSF _RCIE_P
        BSF INTCON,PEIE
        enableInt       
        retfie                 ; return from interrupt

main

; remaining code goes here

    CLRF     STATUS
    BANK1
    MOVLW    b'00111111'            ;PORTA como entrada
    MOVWF    TRISA_P
    MOVLW    b'00000000'
    MOVWF     TRISB_P                ;Portb como salida
    MOVLW     b'11000000'
    MOVWF    TRISC_P
    MOVLW     b'10000111'
    MOVWF     OPTION_REG_P            ;no pull_up, TMR0 , preescaler 1:256
    CLRF    INTCON                ;limpiamos intcon, gie=0
    BANK0
    CLRF    PORTB                ;limpiamos el portb
    CLRF    PORTA                ;limpiamos el porta

    BANK1
    MOVLW d'25'                ;seleccionamos la tasa de baudios a 9600
    MOVWF SPBRG_P
    MOVLW b'10000100'
    MOVWF TXSTA_P                ;habilitamos la transmisión asincrona
    BSF _RCIE_P
    BSF INTCON,PEIE
    BANK0
    MOVLW    b'10010000'            ;habilitamos recepción asincrona
    MOVWF RCSTA           
    EnableInt                ;interrupciones globales habilitadas


Label_0   
    goto Label_0


IntUSART    BANK1
            BCF _RCIE_P            ;borramos flag interrución por recepcion
            BANK0
            MOVF RCREG,0            ;transferimos el byte recibido al PORTB
            MOVWF PORTB
            BANK1
            BSF TXSTA_P, TXEN        ;preparamos la transferencia
            BANK0
            MOVF PORTA,0
            MOVWF TXREG            ;cargamos buffer de transmisión con PORTA
            return

        END                       ; directive 'end of program'


Algunas instrucciones pueden no resultar familiares, lo mas probable es que formen parte del archivo de macros "macros16.inc" que se incluye.
El Panel Frontal en LabVIEW presentaría esta apariencia:
Panel Frontal
 
Cada vez que pulsamos el botón "Actualizar", los valores booleanos representados en las "w" (write) se reflejarán en los Leds de la placa.
Además, en los indicadores "r" obtenemos el valor de las entradas digitales.
El diagrama de bloques que representa el código fuente del programa es el siguiente: diagrama.jpg
 
Ahí queda eso, espero vuestras dudas y comentarios en el FORO de LabVIEW Gi
José Félix Villena (webmaster de LabVIEW Gi)



Comunidad Virtual LabVIEW Gi - Todos los derechos reservados © 2002
labviewgi@gmail.com
www.labview.tk