• Viernes 29 de Marzo de 2024, 10:18

Autor Tema:  Emision Y Recepcion Serie Rs232  (Leído 3480 veces)

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Emision Y Recepcion Serie Rs232
« en: Jueves 5 de Enero de 2006, 22:53 »
0
La siguiene rutina recive un dato y lo vuelve a transmitir
Código: Text
  1.  
  2.     list p=16f876  ;micro
  3.     #include <p16f876.inc>;include
  4.     errorlevel -302  ;suprime error no banco 0
  5.  
  6.     __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
  7.  
  8. ;----------------------------------------------------------------------------
  9. ;Constants
  10. SPBRG_VAL  EQU  .25  ;configuracion 9600 baudios a 4Mhz
  11. ;----------------------------------------------------------------------------
  12. ;Bit Definitions
  13. GotNewData  EQU  0  ;bit indica nuevo dato recibido
  14. ;----------------------------------------------------------------------------
  15. ;Variables
  16.     CBLOCK  0x020
  17.     Flags    ;byte indicador banderas
  18.     ENDC
  19. ;----------------------------------------------------------------------------
  20. ;Macros para seleccion de banco
  21. Bank0    MACRO    ;bank 0
  22.     bcf  STATUS,RP0
  23.     bcf  STATUS,RP1
  24.     ENDM
  25. Bank1    MACRO    ;bank 1
  26.     bsf  STATUS,RP0
  27.     bcf  STATUS,RP1
  28.     ENDM
  29. Bank2    MACRO    ;bank 2
  30.     bcf  STATUS,RP0
  31.     bsf  STATUS,RP1
  32.     ENDM
  33. Bank3    MACRO    ;bank 3
  34.     bsf  STATUS,RP0
  35.     bsf  STATUS,RP1
  36.     ENDM
  37.  
  38. ;----------------------------------------------------------------------------
  39.     ORG     0x0000    
  40. ResetCode:  
  41.     clrf    PCLATH  ;selecciona pagina 0
  42.       goto    Main  ;va a programa
  43.     ORG  0x0004  ;vector interrupcionm
  44. InterruptCode:;codigo isr
  45.     retfie    ;retorno
  46. ;----------------------------------------------------------------------------
  47. Main:  call  SetupSerial;inicializa serial y buffer
  48.     Bank1
  49.     clrf  TRISB;puerto b como salida del dato recibido
  50.     clrf  TRISA;puerto a salida para mostrar si hay error
  51.     bank1
  52. MainLoop:  
  53.     call  ReceiveSerial;recepcion dato
  54.     btfsc  Flags,GotNewData;verifica si se recibe dato
  55.     call  showandtransmit;si ha recibido va a emitir
  56.     bcf  Flags,GotNewData;indica dato no recibido
  57.   ;codigo
  58.  
  59.     goto  MainLoop;bucle
  60. showandtransmit
  61.     clrf  PORTA;limpia a
  62.     movwf  PORTB;muestra dato en b
  63.     call  TransmitSerial;si ha recibido muestra
  64.                                                                               &#59;y emite el dato
  65.  
  66.  
  67. ;----------------------------------------------------------------------------
  68. ;Analiza el dato recibido y lo pasa a W.
  69.  
  70. ReceiveSerial:  Bank0
  71.     btfss  PIR1,RCIF;analiza si se ha rebicido dato
  72.     return    ;vuelve si no se ha recibido
  73.  
  74.     btfsc  RCSTA,OERR;analiza desbordamiento
  75.     goto  ErrSerialOverr;si hay se va a rutina
  76.     btfsc  RCSTA,FERR;analiza error frame
  77.     goto  ErrSerialFrame;si hay se va a rutina
  78.  
  79.     movf  RCREG,W  ;se carga el dato en w
  80.     bsf  Flags,GotNewData;pone a 1 indicador de
  81.                                                                           ;dato nuevo
  82.     return
  83.  
  84. ;error desbordamiento
  85. ErrSerialOverr:  
  86.     bcf  RCSTA,CREN;resetea la recepcion
  87.     clrf PORTA;
  88.     bsf PORTA,0;  indica error desbordamiento
  89.     bsf  RCSTA,CREN;habilita la recepcion
  90.     return
  91.  
  92. ;error FERR
  93.  
  94. ErrSerialFrame:
  95.     clrf PORTA;
  96.     bsf PORTA,1;  ;indica error ferr
  97.     return
  98.  
  99. ;----------------------------------------------------------------------------
  100. ;Transmite el dato en W cuando el transmisor esta listo
  101.  
  102. TransmitSerial:  Bank0    ;select bank 0
  103.     btfss  PIR1,TXIF;verifica si transmision ocupada
  104.     goto  $-1  ;espera a transmisor
  105.                                                                               &#59;no ocupado
  106.     movwf  TXREG  ;transmite el dato
  107.     return
  108.  
  109. ;----------------------------------------------------------------------------
  110. ;Set up serial port.
  111.  
  112. SetupSerial:  Bank1    
  113.     movlw  0xc0  ;configura bits tx y rx
  114.     iorwf  TRISC,F
  115.     movlw  SPBRG_VAL;carga para baudios
  116.     movwf  SPBRG
  117.     movlw  0x24  ;habilita transmision y  
  118.                                                                                 &#59; velocidad alta
  119.     movwf  TXSTA
  120.     Bank0
  121.     movlw  0x90  ;activa puerto serial y la recepcion
  122.     movwf  RCSTA
  123.     clrf  Flags  ;limpia banderas
  124.     return
  125.  
  126. ;----------------------------------------------------------------------------
  127.  
  128.     END
  129.  

Si solo se desea la recepcion del dato y no volver a emitir se elimina la rutina de transmision o se emplea para transmitir en otra parte de programa un dato diferente

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Emision Y Recepcion Serie Rs232
« Respuesta #1 en: Jueves 5 de Enero de 2006, 23:00 »
0
Rutina para la transmision, transmite un dato realiza un retardo y manda otro dato, es un bucle infinito

Código: Text
  1.     list p=16f876  &#59;micro
  2.     #include <p16f876.inc>&#59;include
  3.     errorlevel -302  &#59;suprime error no banco 0
  4.  
  5.     __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
  6.  
  7. ;----------------------------------------------------------------------------
  8. ;Constants
  9. SPBRG_VAL  EQU  .25  &#59;configuracion 9600 baudios a 4Mhz
  10. ;----------------------------------------------------------------------------
  11. ;Variables
  12.     CBLOCK  0x020
  13.     Flags    &#59;byte indicador banderas
  14.     CUENTA1    &#59;Las variables retardo
  15.     CUENTA2      
  16.   ENDC
  17.  
  18. ;----------------------------------------------------------------------------
  19. ;Macros para seleccion de banco
  20. Bank0    MACRO    &#59;bank 0
  21.     bcf  STATUS,RP0
  22.     bcf  STATUS,RP1
  23.     ENDM
  24. Bank1    MACRO    &#59;bank 1
  25.     bsf  STATUS,RP0
  26.     bcf  STATUS,RP1
  27.     ENDM
  28. Bank2    MACRO    &#59;bank 2
  29.     bcf  STATUS,RP0
  30.     bsf  STATUS,RP1
  31.     ENDM
  32. Bank3    MACRO    &#59;bank 3
  33.     bsf  STATUS,RP0
  34.     bsf  STATUS,RP1
  35.     ENDM
  36.  
  37. ;----------------------------------------------------------------------------
  38.     ORG     0x0000    
  39. ResetCode:  
  40.     clrf    PCLATH  &#59;selecciona pagina 0
  41.       goto    Main  &#59;va a programa
  42.     ORG  0x0004  &#59;vector interrupcionm
  43. InterruptCode:&#59;codigo isr
  44.     retfie    &#59;retorno
  45. ;----------------------------------------------------------------------------
  46. Main:  call  SetupSerial&#59;inicializa serial y buffer
  47.     Bank1
  48.     clrf  TRISB;puerto b como salida del dato recibido
  49.     bank1
  50. MainLoop:
  51.     movlw  0x37  
  52.     movwf  PORTB;muestra dato en b
  53.     call  TransmitSerial&#59;emitir el dato
  54.     call   DELAY
  55.     movlw  0x81  
  56.     movwf  PORTB;muestra dato en b
  57.     call  TransmitSerial&#59;emitir el dato
  58.     call   DELAY
  59.     goto  MainLoop&#59;bucle
  60.  
  61. ;----------------------------------------------------------------------------
  62. ;Transmit data in WREG when the transmit register is empty.
  63.  
  64. TransmitSerial:  Bank0    &#59;select bank 0
  65.     btfss  PIR1,TXIF&#59;verifica si transmision ocupada
  66.     goto  $-1  &#59;espera a transmisor
  67.                                                                                &#59;no ocupado
  68.     movwf  TXREG  &#59;transmite el dato
  69.     return
  70.  
  71. ;----------------------------------------------------------------------------
  72. ;Set up serial port.
  73.  
  74. SetupSerial:  Bank1    
  75.     movlw  0xc0  &#59;configura bits tx y rx
  76.     iorwf  TRISC,F
  77.     movlw  SPBRG_VAL&#59;carga para baudios
  78.     movwf  SPBRG
  79.     movlw  0x24  &#59;habilita transmision
  80.                                                                                &#59;y velocidad alta
  81.     movwf  TXSTA
  82.     Bank0
  83.     movlw  0x80  &#59;activa puerto serial
  84.     movwf  RCSTA
  85.     clrf  Flags  &#59;limpia banderas
  86.     return
  87.  
  88. ;----------------------------------------------------------------------------
  89. ;===================================================
  90.  
  91. ;=  DELAY:  Subrutina de retardo               =
  92.  
  93. DELAY  MOVLW  0FFH    
  94.                 MOVWF  CUENTA1    
  95. ACA1  MOVLW  0FFH    
  96.   MOVWF  CUENTA2  
  97. ACA  DECFSZ  CUENTA2,F    
  98.                 GOTO  ACA  
  99.                 DECFSZ  CUENTA1,F  
  100.   GOTO  ACA1      
  101.                 RETURN
  102.  
  103. END
  104.  

Este programa puede modificarse para mandar un dato de cualquier tipo en el momento deseado sin retardos, el que yo realice era solo a modo de prueba