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 ;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 ;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 ; 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 ;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;----------------------------------------------------------------------------;Variables CBLOCK 0x020 Flags ;byte indicador banderas CUENTA1 ;Las variables retardo CUENTA2 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 bank1MainLoop: movlw 0x37 movwf PORTB;muestra dato en b call TransmitSerial;emitir el dato call DELAY movlw 0x81 movwf PORTB;muestra dato en b call TransmitSerial;emitir el dato call DELAY goto MainLoop;bucle ;----------------------------------------------------------------------------;Transmit data in WREG when the transmit register is empty. TransmitSerial: Bank0 ;select bank 0 btfss PIR1,TXIF;verifica si transmision ocupada goto $-1 ;espera a transmisor ;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 velocidad alta movwf TXSTA Bank0 movlw 0x80 ;activa puerto serial movwf RCSTA clrf Flags ;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
Ir a la versión completa