|
From: KA8VIT <ka...@ka...> - 2006-02-23 17:40:49
|
Here are serial bit-bang routines written in
assembler that you can put into SDCC with inline
ASM.
These were written for an AT89S8252 with an
11.0592 MHz crystal and set up for 9600 baud.
The BB_Send routine sends data at 9600, 8/1/N
You will need to tweek the GET_GPS receive routine
as it was written for grabbing data from an AISIN GPS
Engine with output serial data at 8-data bits, 1-stop bit
and even parity (8/1/E).
Good luck,
Bill KA8VIT
;BIT-BANG SERIAL ROUTINES
;THESE ROUTINES DO NOT SAVE ANY REGISTERS
;IF YOU NEED YOUR REGISTERS SAVED, PUSH THEM
;AT THE BEGINING OF THE ROUTINES AND POP THEM
;AT THE END
;BIT-BANG TIME PERIOD FORMULA (((XTAL/12)/BAUD)-5)/2
BITTIME EQU 45 ;(((11059200/12)/9600)-5)/2
TXD1 EQU P1.0 ;PORT PIN FOR SENDING DATA
GPS_RX EQU P1.1 ;PORT PIN FOR GETTING DATA FROM GPS ENGINE
;BIT-BANG TRANSMIT ROUTINE
BB_SEND:
CLR TXD1 ;DRIVE LINE LOW FOR START BIT
MOV R0,#BITTIME ;SET WAIT TO ONE BIT TIME PERIOD
DJNZ R0,$ ;DO THE WAIT
MOV R1,#8 ;SEND EIGHT BITS
BB_SEND_A:
RRC A ;ROTATE ACC RIGHT INTO CARRY FLAG
MOV TXD1,C ;NOW MOVE THE CARRY BIT TO THE XMIT PIN
MOV R0,#BITTIME ;SET WAIT TO ONE BIT TIME PERIOD
DJNZ R0,$ ;DO THE WAIT
DJNZ R1,BB_SEND_A ;DID WE SEND EIGHT BITS?
SETB TXD1 ;SET LINE HIGH FOR STOP BIT
RRC A ;ROTATE ONE MORE TIME SO ACC IS RESTORED
MOV R0,#BITTIME ;SET WAIT TO ONE BIT TIME PERIOD
DJNZ R0,$ ;DO THE WAIT (SOPT BIT)
RET
; GET_GPS-A BIT-BANG SERIAL RECEIVE ROUTINE
; ON EXIT; IF C=1 THEN CHARACTER RECEIVED
; IF C=0 NO CHARACTER RECEIVED OR TIMEOUT OCCURED
GET_GPS:
CLR C ;CLEAR CARRY FLAG
MOV R3,#0FFH ;OUR TIMEOUT FAILSAFE
GET_GPS_A:
DJNZ R3,GET_GPS_B ;COUNT DOWN OUR TIMEOUT
RET ;IF ZERO RETURN
GET_GPS_B:
JB GPS_RX,GET_GPS_A ;WAIT FOR START BIT
MOV R0,#BITTIME/2 ;SET WAIT TO ONE-HALF THE BIT TIME PERIOD
DJNZ R0,$ ;DO THE WAIT
JB GPS_RX,GET_GPS_A ;IF LINE HIGH IT WAS PROBABLY NOISE
MOV R1,#8 ;RECEIVE EIGHT BITS
GET_GPS_C:
MOV R0,#BITTIME ;SET WAIT TO ONE BIT TIME PERIOD
DJNZ R0,$ ;DO THE WAIT
MOV C,GPS_RX ;MOVE LINE TO THE CARRY BIT
RRC A ;ROTATE CARRY INTO THE ACC
DJNZ R1,GET_GPS_C ;DID WE RECEIVE EIGHT BITS?
SETB C ;SET THE CARRY FLAG SINCE WE GOT A CHARACTER
RET
Diego Manenti Martins wrote:
>Is there any library or source for sdcc that can "emulate" a serial
>port with i/o pins for at89s8252?
>Thank you!
>
>
--
Bill Chaikin, KA8VIT
USS COD Amateur Radio Club - W8COD
WW2 Submarine USS COD SS-224 (NECO)
ka...@ka...
http://ka8vit.com
http://www.usscod.org
QRP-L NBR: 2596
FP#-1043
|