Searching \ for '[PIC]: Re: Bit banging Asynchronous Serial Communi' in subject line. ()
Make payments with PayPal - it's fast, free and secure! Help us get a faster server
FAQ page: www.piclist.com/techref/microchip/ios.htm?key=serial
Search entire site for: 'Re: Bit banging Asynchronous Serial Communi'.

Exact match. Not showing close matches.
PICList Thread
'[PIC]: Re: Bit banging Asynchronous Serial Communi'
2001\01\11@021203 by Jacques Vrey

flavicon
face
Hi

I sent through some source to the piclist for the list members to peruse and
offer comment. Unfortunately I got no response. I'm sending it through
again, perhaps it can help you. I've tested it and it works for me but I'd
like to know if it works for others. Essentially the code is for a pic16f84
that provides half duplex rs232 comms at 19200,8,n,1

Cheers

Jacques Vrey

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Hi all

This is my first attempt at rs232 comms.
I've written a simple interrupt driven routine that does Half duplex,
19200,8,n,1 using a 4MHz crystal on a 16F84 (I would have used a 10Mhz pic
but my supplier was out of stock at the time).

I'd appreciate if you can offer advice and or criticism(preferably
constructive) on my code.

The routine simply echo's whatever is recieved. I've tested it and it
appears to work fine but I'd like to know if it works for you. So if you
have a 16F84 or similar test jig handy and a little time, I'd appreciate
your comments (email privately if you like). There are a few obvious things
I can fix up - like variable definitions based on freq & baud for the
timeout values instead of hardcoded values(which is simpler)... later.

Thanks

Jacques Vrey

Pin Designation:
----------------
RA4 - RX
RA3 - TX

Im using a MAX232 for the driver.

;;CODE BEGIN:
;;-----------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; RS232.ASM - Half duplex interrupt based serial comms at 19200,8,n,1
;; Jacques Vrey
;; 04/01/2001
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

       LIST   P=PIC16F84
       LIST   F=INHX8M

__CONFIG       _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC


include "p16f84.inc"

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Define
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

RXTIMEOUT equ h'e3'  ;RX Timeout Value for Timer
TXTIMEOUT equ h'e1'  ;TX Timeout Value for Timer
STARTBITDELAY equ h'dd'  ;Start Timeout Value for Timer
COUNTER  equ b'11111111'  ;Register setup for counter
TIMER  equ b'11011111'  ;Register setup for timer

SAVED_W         equ h'00'+h'0C'  ;SRAM register
SAVED_STATUS    equ h'01'+h'0C'  ;SRAM register
SERIALSTATUS    equ h'02'+h'0C'  ;SRAM register
BITPOS  equ h'03'+h'0C'  ;SRAM register
LOOPCOUNTER equ h'04'+h'0C'  ;SRAM register
SENDBUF  equ h'05'+h'0C'  ;SRAM register
RECBUF  equ h'06'+h'0C'  ;SRAM register

#define TX_BIT porta,3
#define RX_BIT porta,4
#define TRANSMIT SERIALSTATUS,0
#define RECEIVE SERIALSTATUS,1
#define BYTEINBUFFER SERIALSTATUS,2

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Define
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

ORG 0

goto START

ORG 4

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Interrupt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

INTERRUPT
;Disable Interrupts
bcf intcon,gie ;Disable Global

;Check if TMR0 interrupt - if not then exit interrupt routine
btfss intcon,t0if
retfie

;Save status & w
movwf SAVED_W
swapf status,w
movwf SAVED_STATUS

;Do things
btfsc TRANSMIT
goto TRANSMITBIT
btfsc RECEIVE
goto RECEIVEBIT
goto STARTBIT

;Restore Registers
RESTOREREGS
swapf SAVED_STATUS,w
movwf status
swapf SAVED_W,f
swapf SAVED_W,w
bcf intcon,t0if

;Enable Interrupts
bsf intcon,gie ;Enable Global
retfie

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Interrupt
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Enable Interrupts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

ENABLEINTERRUPTS
clrf intcon  ;Disable All
bsf intcon,gie ;Enable Global
bsf intcon,t0ie ;Enable TMR0 Interrupt
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Enable Interrupts
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Setup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

SETUP
clrf SERIALSTATUS
clrf RECBUF
clrf SENDBUF
bsf status,rp0 ;Bank 1
movlw h'10'  ;PortA RA4 as Input, rest Output
movwf porta
clrf portb  ;PortB all Output
movlw COUNTER  ;TMR0 - Counter
movwf tmr0
bcf status,rp0 ;Bank 0
bsf TX_BIT  ;RA4 High
clrf portb  ;PortB all Low
movlw h'ff'
movwf tmr0
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Setup
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Transmit Bit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

TRANSMITBIT
decfsz BITPOS,f
goto TXNEXTBIT
goto TXSTOPBIT
TXNEXTBIT
btfss SENDBUF,0
goto TXLOW
bsf TX_BIT
goto TXBITDONE
TXLOW
bcf TX_BIT
TXBITDONE
rrf SENDBUF,f
movlw TXTIMEOUT
movwf tmr0
goto RESTOREREGS
TXSTOPBIT
bsf TX_BIT
movlw h'06'
movwf LOOPCOUNTER
STOPLOOP   ;Loop to ensure valid stop bit
decfsz LOOPCOUNTER,f
goto STOPLOOP
bsf status,rp0 ;Bank 1
movlw COUNTER
movwf tmr0
bcf status,rp0 ;Bank 0
movlw h'ff'
movwf tmr0
bcf TRANSMIT
bcf BYTEINBUFFER
goto RESTOREREGS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Transmit Bit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Receive Bit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

RECEIVEBIT
decfsz BITPOS,f
goto NEXTBIT
goto BYTEDONE
NEXTBIT
rrf RECBUF,f
btfsc RX_BIT
goto HIGHBIT
bcf RECBUF,7
goto BITDONE
HIGHBIT
bsf RECBUF,7
BITDONE
movlw RXTIMEOUT
movwf tmr0
goto RESTOREREGS
BYTEDONE
bsf status,rp0 ;Bank 1
movlw COUNTER
movwf tmr0
bcf status,rp0 ;Bank 0
movlw h'ff'
movwf tmr0
bcf RECEIVE
bsf BYTEINBUFFER
goto RESTOREREGS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Receive Byte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Start Bit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

STARTBIT
bcf status,rp0 ;Bank 0
btfsc RX_BIT
goto NOTSTARTBIT
movlw 9
movwf BITPOS
bsf RECEIVE
bcf BYTEINBUFFER
movlw STARTBITDELAY ;Initial Bit Delay
movwf tmr0
bsf status,rp0 ;Bank 1
movlw TIMER
movwf tmr0
bcf status,rp0 ;Bank 0
goto RESTOREREGS
NOTSTARTBIT
movlw h'ff'
movwf tmr0
goto RESTOREREGS

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Start Bit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Transmit Byte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

TRANSMITBYTE
bsf TRANSMIT
bcf status,rp0 ;Bank 0
movlw TXTIMEOUT
movwf tmr0
movlw 9
movwf BITPOS
bcf TX_BIT
bsf status,rp0 ;Bank 1
movlw TIMER
movwf tmr0
bcf status,rp0 ;Bank 0
return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Transmit Byte
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Work
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

WORK
btfss BYTEINBUFFER
goto WORK
btfsc TRANSMIT
goto WORK
movf RECBUF,w ;Comment this line to test transmit
; movlw h'40'  ;Uncomment this line to transmit "@"
movwf SENDBUF
call TRANSMITBYTE
goto WORK

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Work
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

START
call ENABLEINTERRUPTS
call SETUP
goto WORK

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;; End Start
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;

END

;;CODE END.
;;---------



{Original Message removed}

2001\01\11@090528 by Olin Lathrop

face picon face
>  ORG 4
>
>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;
> ;; Interrupt
>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> ;
>
> INTERRUPT
> ;Disable Interrupts
>  bcf intcon,gie ;Disable Global

This is a waste of time.  GIE is automatically disabled by the interrupt.
That's why you have to return with RETFIE instead of RETURN.

> ;Check if TMR0 interrupt - if not then exit interrupt routine
>  btfss intcon,t0if

This will cause an infinite interrupt loop if you get something other than a
timer 0 interrupt.  Since you are only handling one interrupt and have
nothing intelligent to do if you encounter an unexpected one, I see little
point in testing which interrupt it is.

>  retfie


*****************************************************************
Olin Lathrop, embedded systems consultant in Devens Massachusetts
(978) 772-3129, spam_OUTolinTakeThisOuTspamembedinc.com, http://www.embedinc.com

--
http://www.piclist.com hint: To leave the PICList
.....piclist-unsubscribe-requestKILLspamspam@spam@mitvma.mit.edu


2001\01\11@093418 by Jacques Vrey

flavicon
face
Thanks for the feedback - remarks below



> >  ORG 4
> >
> >
>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> > ;
> > ;; Interrupt
> >
>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
> > ;
> >
> > INTERRUPT
> > ;Disable Interrupts
> >  bcf intcon,gie ;Disable Global
>
> This is a waste of time.  GIE is automatically disabled by the interrupt.
> That's why you have to return with RETFIE instead of RETURN.

******
Figured that out after reading more on the op codes the other day


{Quote hidden}

*****
Good point

{Quote hidden}

Thanks again

Regards

Jacques Vrey

--
http://www.piclist.com hint: To leave the PICList
EraseMEpiclist-unsubscribe-requestspam_OUTspamTakeThisOuTmitvma.mit.edu


More... (looser matching)
- Last day of these posts
- In 2001 , 2002 only
- Today
- New search...