Autor Tema: ayudita con comunicacion usart del 16f873  (Leído 1380 veces)

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

Desconectado flecha

  • PIC10
  • *
  • Mensajes: 15
ayudita con comunicacion usart del 16f873
« en: 02 de Marzo de 2007, 11:42:34 »
hola
mi nombre es javier eduardo soy estudiante de electronica en colombia tengo el sigte inconveniente:
estoy realizando un proyecto donde debo controlar varios dispositivos conectados AL PIC 16F873
EL PROBLEMA ES  " no se como hacer la interfaz de comunicacion entre el pc y el pic ya que consegui un diseño completo en una revista de la cekit pero no entiendo lo del envio y la recepcion de los datos ya que no se como lo hace el codigo es el sgt:

STATUS equ   03h    ;registro de estados
INTCON equ   0bh    ;registro INTCON
PIE1     equ    8ch    ;registro de interrupcion perifericos
PIR1     equ    0ch    ;Bandera de interrupcion
RCSTA  equ    18h    ;registro de Estado de Rx
TXSTA  equ    98h    ;registro de estado de Tx
SPBRG  equ    99h    ;registro generador de baud rate
TX        equ   19h
RX        equ   1Ah
OPCION equ   81h
PORTA  equ   05h    ;direccion en RAM
PORTB  equ   06h    ;direccion 06 de la RAM
PORTC  equ   07h
loops    equ   0dh    ;utilizado en retardos
loops2  equ   0eh    ;utilizado en retardos
TRISA  equ   85h    ;configuracion del puerto A
TRISB  equ   86h    ;configuracion puerto B
TRISC  equ   87h    ;configuracion puerto C
RX1     equ   20h    ;registro para los datos Rx
RX2     equ   21h
RX11   equ   22h
RX22   equ   23h
CONTARX equ  24h    ;contador de bytes recibidos
RXMEM   equ  25h    ;Guarda el ultimo Rx leido

z      equ   02h    ;bandera de 0 del registro de estados
c      equ   00h    ;bandera de carry del registro de estados
w      equ   00h    ;el resultado se guarda en w
r      equ   01h    ;el resultado se guarda enen registro

reset  org   00h    ;reset en la direccion 00
       goto  inicio ;se salta al inicio del programa

;---------------------interrupciones-----------------------
interrupcion
        org      4               ;rutina de interrupcion
        btfss    PIR1,5          ;verifica si hay int de USART
        goto     saleint
        movf    RX,w            ;lee el registro serial
        movwf  RXMEM           ;lo guarda en memoria
        incf     CONTARX,r       ;contador de bytes recibidos
        movf   CONTARX,w       ;carga el contador de bytes
        xorlw   01h                ;compara
        btfsc    STATUS,z        ;si es cero(diferente)salta
        goto     primerbyte      ;si es igual......
        movf     CONTARX,w       ;carga el contador de bytes
        xorlw    02h             ;compara
        btfsc    STATUS,z        ;si es cero(diferente)salta
        goto     segbyte         ;si es igual......
        movf     CONTARX,w       ;carga el contador de bytes
        xorlw    03h             ;compara
        btfsc    STATUS,z        ;si es cero(diferente)salta
        goto     tercerbyte      ;si es igual
        goto     cuartobyte

primerbyte
        movf    RXMEM,w        ;lee dato serial memorizado
        movwf    RX1           ;lo guarda en el registro del dato1
        goto    saleint

segbyte
        movf    RXMEM,w        ;lee dato serial memorizado
        movwf    RX2           ;lo guarda en el registro del dato2
        goto    saleint

tercerbyte
        movf    RXMEM,w         ;lee dato serial memorizado
        movwf    RX11           ;lo guarda en el registro del dato3
        goto    saleint

cuartobyte
        movf    RXMEM,w         ;lee dato serial memorizado
        movwf    RX22           ;lo guarda en el registro del dato4
        clrf    CONTARX         ;pone en ceros el contador de bytes


        movf    RX1,w           ;lee dato serial memorizado
        xorwf   RX11,w          ;compara el 1er y 3er byte
        btfss   STATUS,z        ;si la bandera es uno (iguales)salta

        goto    enviar
        movf    RX1,w           ;tomar el 1er byte recibido
        movwf   PORTA           ;LO TRANSFIERE AL PUERTO A

        movf    RX2,W
        xorwf   RX22,w          ;compara el 2do y 4to byte
        btfss   STATUS,z        ;si la bandera es uno(1) (iguales)salta
        goto    saleint
        movf    RX2,w           ;toma el 3er byte recibido
        movwf   PORTC           ;lo transfiere al puerto c

enviar

        movf    RX1,w
        movwf   TX                ;envia el 1er byte hacia el Pc
        call    retardo
        comf    PORTB,w
        movwf   TX                ;envia el puertoB hacia el Pc
        call    retardo
        movf    RX2,w
        movwf   TX                ;envia el 3er byte hacia el Pc


       saleint
       retfie             ;regresa de la interrupcion



;---------------PROGRAMA PRINCIPAL-----------------------

inicio  bsf  STATUS,5     ;banco 2
        movlw B'00000000'  ;
        movwf TRISA        ;puerto A como salidas
        movlw B'11110111'  ;
        movwf TRISB        ;puerto B como entradas
        movlw B'10000000'  ;
        movwf TRISC        ;puerto C como salidas

        movlw 020h         ;en el registro PEI1 solo se
        movwf PIE1         ;SE PROGRAMA bit para interrupcion serial
        movlw B'00100100'  ;en el registro de estado de Tx se
        movwf TXSTA        ;programan TXENAB Y BRGH

        movlw D'25'        ;en el registro de baud rate se
        movwf SPBRG        ;para 9600 bps (clock=4MHZ)

        bcf   STATUS,5     ;BANCO 1
        movlw 0c0h         ;en el registro INTCON solo se
        movwf INTCON       ;bit PEIE y se habilita GIE

        movlw B'10010000'  ;en el registro de estado de RX
        movwf RCSTA        ;se programa bit SPENAB Y CRENAB
        movlw 00h
        movwf CONTARX      ;se pone en ceros el cont de bytes

leer
        nop
        nop
        goto   leer        ;

;-------------------------------------------------------------------------
retardo                   ;subrutina de retardo de 50 milisegundos

        movlw  D'10'      ;el registro loops contiene el numero
        movwf  loops      ;de milisegundos del  retardo
top2    movlw D'110'      ;
        movwf loops2      ;
top     nop
        nop
        nop
        nop
        clrwdt
        nop
        decfsz loops2    ;pregunta si termino 1 ms
        goto   top
        decfsz loops     ;pregunta si termina el retardo
        goto   top2
        retlw   0

        end
;===================================================================================

;fusibles de programacion

;      osc       XT
;      watchdog  off
;      code protect   off
;      power-up-timer   ON
;      micro.  PIC16F873

;===================================================================================








































































Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: ayudita con comunicacion usart del 16f873
« Respuesta #1 en: 02 de Marzo de 2007, 15:07:19 »
flecha, sería conveniente que nos digas qué parte en específico no entiendes.

Si es TODO, te sugiero compres un libro sobre los pics y/o leas detenidamente el datasheet.  Cada paso de configuración se corresponde a algo que hay que programar para que tu sistema funcione.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)