Programación Específica > Soluciones de Hard y Soft

 Emision Y Recepcion Serie Rs232

(1/1)

Kain589:
La siguiene rutina recive un dato y lo vuelve a transmitir

--- Código: Text ---     list p=16f876  ;micro    #include <p16f876.inc>;include    errorlevel -302  ;suprime error no banco 0     __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ;----------------------------------------------------------------------------;ConstantsSPBRG_VAL  EQU  .25  ;configuracion 9600 baudios a 4Mhz;----------------------------------------------------------------------------;Bit DefinitionsGotNewData  EQU  0  ;bit indica nuevo dato recibido;----------------------------------------------------------------------------;Variables    CBLOCK  0x020    Flags    ;byte indicador banderas    ENDC;----------------------------------------------------------------------------;Macros para seleccion de bancoBank0    MACRO    ;bank 0    bcf  STATUS,RP0    bcf  STATUS,RP1    ENDMBank1    MACRO    ;bank 1    bsf  STATUS,RP0    bcf  STATUS,RP1    ENDMBank2    MACRO    ;bank 2    bcf  STATUS,RP0    bsf  STATUS,RP1    ENDMBank3    MACRO    ;bank 3    bsf  STATUS,RP0    bsf  STATUS,RP1    ENDM ;----------------------------------------------------------------------------    ORG     0x0000    ResetCode:      clrf    PCLATH  ;selecciona pagina 0      goto    Main  ;va a programa    ORG  0x0004  ;vector interrupcionmInterruptCode:;codigo isr    retfie    ;retorno;----------------------------------------------------------------------------Main:  call  SetupSerial;inicializa serial y buffer    Bank1    clrf  TRISB;puerto b como salida del dato recibido    clrf  TRISA;puerto a salida para mostrar si hay error    bank1MainLoop:      call  ReceiveSerial;recepcion dato    btfsc  Flags,GotNewData;verifica si se recibe dato    call  showandtransmit;si ha recibido va a emitir     bcf  Flags,GotNewData;indica dato no recibido  ;codigo     goto  MainLoop;bucleshowandtransmit    clrf  PORTA;limpia a    movwf  PORTB;muestra dato en b    call  TransmitSerial;si ha recibido muestra                                                                               &#59;y emite el dato  ;----------------------------------------------------------------------------;Analiza el dato recibido y lo pasa a W. ReceiveSerial:  Bank0    btfss  PIR1,RCIF;analiza si se ha rebicido dato    return    ;vuelve si no se ha recibido     btfsc  RCSTA,OERR;analiza desbordamiento    goto  ErrSerialOverr;si hay se va a rutina    btfsc  RCSTA,FERR;analiza error frame    goto  ErrSerialFrame;si hay se va a rutina     movf  RCREG,W  ;se carga el dato en w    bsf  Flags,GotNewData;pone a 1 indicador de                                                                           ;dato nuevo    return ;error desbordamientoErrSerialOverr:      bcf  RCSTA,CREN;resetea la recepcion    clrf PORTA;    bsf PORTA,0;  indica error desbordamiento    bsf  RCSTA,CREN;habilita la recepcion    return ;error FERR ErrSerialFrame:    clrf PORTA;    bsf PORTA,1;  ;indica error ferr    return ;----------------------------------------------------------------------------;Transmite el dato en W cuando el transmisor esta listo TransmitSerial:  Bank0    ;select bank 0    btfss  PIR1,TXIF;verifica si transmision ocupada    goto  $-1  ;espera a transmisor                                                                               &#59;no ocupado    movwf  TXREG  ;transmite el dato    return ;----------------------------------------------------------------------------;Set up serial port. SetupSerial:  Bank1        movlw  0xc0  ;configura bits tx y rx    iorwf  TRISC,F    movlw  SPBRG_VAL;carga para baudios    movwf  SPBRG    movlw  0x24  ;habilita transmision y                                                                                   &#59; velocidad alta    movwf  TXSTA    Bank0    movlw  0x90  ;activa puerto serial y la recepcion    movwf  RCSTA    clrf  Flags  ;limpia banderas    return ;----------------------------------------------------------------------------     END 
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:
Rutina para la transmision, transmite un dato realiza un retardo y manda otro dato, es un bucle infinito


--- Código: Text ---    list p=16f876  &#59;micro    #include <p16f876.inc>&#59;include    errorlevel -302  &#59;suprime error no banco 0     __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_ENABLE_OFF & _LVP_OFF & _DEBUG_OFF & _CPD_OFF ;----------------------------------------------------------------------------;ConstantsSPBRG_VAL  EQU  .25  &#59;configuracion 9600 baudios a 4Mhz;----------------------------------------------------------------------------;Variables    CBLOCK  0x020    Flags    &#59;byte indicador banderas    CUENTA1    &#59;Las variables retardo    CUENTA2        ENDC ;----------------------------------------------------------------------------;Macros para seleccion de bancoBank0    MACRO    &#59;bank 0    bcf  STATUS,RP0    bcf  STATUS,RP1    ENDMBank1    MACRO    &#59;bank 1    bsf  STATUS,RP0    bcf  STATUS,RP1    ENDMBank2    MACRO    &#59;bank 2    bcf  STATUS,RP0    bsf  STATUS,RP1    ENDMBank3    MACRO    &#59;bank 3    bsf  STATUS,RP0    bsf  STATUS,RP1    ENDM ;----------------------------------------------------------------------------    ORG     0x0000    ResetCode:      clrf    PCLATH  &#59;selecciona pagina 0      goto    Main  &#59;va a programa    ORG  0x0004  &#59;vector interrupcionmInterruptCode:&#59;codigo isr    retfie    &#59;retorno;----------------------------------------------------------------------------Main:  call  SetupSerial&#59;inicializa serial y buffer    Bank1    clrf  TRISB;puerto b como salida del dato recibido    bank1MainLoop:    movlw  0x37      movwf  PORTB;muestra dato en b    call  TransmitSerial&#59;emitir el dato    call   DELAY    movlw  0x81      movwf  PORTB;muestra dato en b    call  TransmitSerial&#59;emitir el dato    call   DELAY    goto  MainLoop&#59;bucle ;----------------------------------------------------------------------------;Transmit data in WREG when the transmit register is empty. TransmitSerial:  Bank0    &#59;select bank 0    btfss  PIR1,TXIF&#59;verifica si transmision ocupada    goto  $-1  &#59;espera a transmisor                                                                                &#59;no ocupado    movwf  TXREG  &#59;transmite el dato    return ;----------------------------------------------------------------------------;Set up serial port. SetupSerial:  Bank1        movlw  0xc0  &#59;configura bits tx y rx    iorwf  TRISC,F    movlw  SPBRG_VAL&#59;carga para baudios    movwf  SPBRG    movlw  0x24  &#59;habilita transmision                                                                                &#59;y velocidad alta    movwf  TXSTA    Bank0    movlw  0x80  &#59;activa puerto serial    movwf  RCSTA    clrf  Flags  &#59;limpia banderas    return ;----------------------------------------------------------------------------;=================================================== ;=  DELAY:  Subrutina de retardo               = DELAY  MOVLW  0FFH                    MOVWF  CUENTA1    ACA1  MOVLW  0FFH      MOVWF  CUENTA2  ACA  DECFSZ  CUENTA2,F                    GOTO  ACA                  DECFSZ  CUENTA1,F    GOTO  ACA1                      RETURN END 
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

Navegación

[0] Índice de Mensajes

Ir a la versión completa