Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
06/13/02 19:24
Read: times


 
#24444 - RE: 8051: serial Input with a timer
Use this code as an example;
check initialization code for timer 1 at 2400 baud no parity.

;
;
;THIS PROGRAM IS FOR THE THERMALITO DIVERSION DAM
;POWER PLANT FLOWMETER PROTOCOL CONVERSION
;
;Serial data 2400 Baud 8 bit parity none
;
;PROCESSOR = Intel 87c51
;
;FILE NAME= TDPFlow.asm Creation Date= 8/3/99
;
;AUTHOR: J. Kimbriel
;
;MODIFICATION RECORD:
;
; 8/27/99
; The 3 |cr|lf| char's need to be at the end of the
; incomming message.
; 10/16/99
; Modified for variable char volume data.
; 10/17/99
; Removed error output messages.
;
;
; EQUATE REGISTER BITS TO A LABEL
;
; SYMBOL TABLE
; -------------------------------------------------------
; SYSTEM DEFAULTS
; A & B REGISTERS ARE BIT ADDRESSABLE
;ACC VAR E0H ;ACCUMULATOR
;B VAR F0H ;B REGISTER
;
; PSW: PROGRAM STATUS WORD. BIT DDRESSABLE
;
;CY REG PSW.7 ;CARRY FLAG
;AC REG PSW.6 ;AUXILIARY CARRY FLAG
;F0 REG PSW.5 ;FLAG 0 FOR GENERAL PURPOSE
;RS1 REG PSW.4 ;REGISTER BANK SELECTOR BIT 1
;RS0 REG PSW.3 ;REGISTER BANK SELECTOR BIT 0
;OV REG PSW.2 ;OVERFLOW FLAG
F1 equ PSW.1 ;USER BIT IN PROC STAT WORD
;P REG PSW.0 ;PARITY FLAG
;
; PCON: POWER CONTROL REGISTER. NOT BIT ADDRESSABLE
; (SEE THE BOOK)
;SMOD REG PCON.7 ;SET DOUBLES BAUD IN TIMER 1
;GF1 REG PCON.3 ;GENERAL PURPOSE FLAG BIT
;GF0 REG PCON.2 ;GENERAL PURPOSE FLAG BIT
;PD REG PCON.1 ;POWER DOWN BIT
;IDL REG PCON.0 ;IDLE MODE BIT
;
;
; IE: INTERUPT ENABLE REGISTER. BIT ADDRESSABLE
;
;EA REG IE.7 ;DISABLE ALL INTERUPS EA=0 NO RUPS
; REG IE.6 ; RESERVED
;ET2 REG IE.5 ;TIMER 2 (8052 ONLY)
;ES REG IE.4 ;SERIAL PORT
;ET1 REG IE.3 ;TIMER 1
;EX1 REG IE.2 ;EXTERNAL INTERUPT 1
;ET0 REG IE.1 ;TIMER 0
;EX0 REG IE.0 ;EXTERNAL INTERUPT 0
;
; IP: INTERUPT PRIORITY REGISTER. BIT ADDRESSABLE
; IF THE BIT = 0 THE CORRESPONDING INTERUP HAS A LOWER PRIORITY
;
; REG IP.7 ;FUTURE
; REG IP.6 ;FURURE
;PT2 REG IP.5 ;TIMER 2 (8052 ONLY)
;PS REG IP.4 ;SERIAL PORT
;PT1 REG IP.3 ;TIMER 1
;PX1 REG IP.2 ;EXTERNAL INTERUPT 1
;PT0 REG IP.1 ;TIMER 0
;PX0 REG IP.0 ;EXTERNAL INTERUPT 0
;
;
; TCON: TIMER/COUNTER CONTROL REGISTER. BIT ADDRESSABLE
;
;TF1 REG TCON.7 ;TIMER 1 OVERFLOW FLAG
;TR1 REG TCON.6 ;TIMER 1 RUN CONTROL BIT
;TF0 REG TCON.5 ;TIMER 0 OVERFLOW FLAG
;TR0 REG TCON.4 ;TIMER 0 RUN CONTROL BIT
;IE1 REG TCON.3 ;EXTERNAL INTERUPT 1 EDGE FLAG
;IT1 REG TCON.2 ;INTERUPT 1 TYPE CONTROL BIT
;IE0 REG TCON.1 ;EXTERNAL INTERUPT 0 EDGE FLAG
;IT0 REG TCON.0 ;INTERUPT 0 TYPE CONTROL BIT
;
;
; TMOD: TIMER/COUNTER MODE CONTROL REGISTER. NOT BIT ADDRESSABLE
; (SEE THE BOOK)
;
; SCON: SERIAL PORT CONTROL REGISTER. BIT ADDRESSABLE
;SCON VAR 98H
;SM0 REG SCON.7 ;
;SM1 REG SCON.6 ;
;SM2 REG SCON.5 ;
;REN REG SCON.4 ;RECIEVE ENABLE
;TB8 REG SCON.3 ;SET TO PROPER PARITY FOR XMIT IN MODE 2
;RB8 REG SCON.2 ;RECIEVED PARITY IN MODE 2
;TI REG SCON.1 ;TRANSMIT INT FLAG
;RI REG SCON.0 ;RECIEVE INT FLAG
;
;
;P0 VAR 80H ;PORT 1
;P1 VAR 90H ;PORT 2
;P2 VAR A0H ;PORT 3
;P3 VAR B0H ;PORT 4
;
;TH0 VAR 8CH ;TIMER/COUNTER HIGH BYTE
;TL0 VAR 8AH ;TIMER/COUNTER LOW BYTE
;TH1 VAR 8DH ;TIMER/COUNTER HIGH BYTE
;TL1 VAR 8BH ;TIMER/COUNTER LOW BYTE
;
;SBUF VAR 99H ;SERIAL DATA BUFFER
;
;=================================
; REGISTER BANK ADDRESSES
ORG 00H
;=================================
;RB0R0 VAR 00H
;RB0R1 VAR 01H
;RB0R2 VAR 02H
;RB0R3 VAR 03H
;RB0R4 VAR 04H
;RB0R5 VAR 05H
;RB0R6 VAR 06H
;RB0R7 VAR 07H
;
;RB1R0 VAR 08H
;RB1R1 VAR 09H
;RB1R2 VAR 0AH
;RB1R3 VAR 0BH
;RB1R4 VAR 0CH
;RB1R5 VAR 0DH
;RB1R6 VAR 0EH
;RB1R7 VAR 0FH
;
;
;=================================
; BIT ADDRESSABLE RAM AREA
ORG 20H
;=================================
;
;FLAGS VAR 20H ;USER FLAG WORD
;FLG0 REG 20H.0
;FLG1 REG 20H.1
;FLG2 REG 20H.2
;FLG3 REG 20H.3
;FLG4 REG 20H.4
;FLG5 REG 20H.5
;FLG6 REG 20H.6
;FLG7 REG 20H.7
;
;
;=================================
; RAM ALLOCATION
ORG 30H
;
;=================================
; New flow input buffer 10 char
FLOW: DS 10 ;Flow Value
FLOWE equ $ - FLOW
;
;
;New volume input buffer 10 char
;
VOL: DS 10 ;Volume Valu
;
VOLE: DS 1
VOLC: DS 1 ;count for vol char input
;
;
; Old flow output buffer 9 char
;
FLOWo: DS 10 ;Flow Value
FLOWEo equ $ - FLOWo
;
;
;Old volume output buffer 8 char
;
DS 1 ;overflow
DS 1 ;overflow from new volume
DS 1
VOLo: DS 7 ;Volume Value
VOLELo equ $ - 1
VOLEo equ $ - VOLo
;
;
;=================================
ORG 0
;=================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; POWER ON STARTUP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
AJMP INIT
;=================================
; ORG 03H ;externial interupt 0
;=================================
;
;=================================
; ORG 0BH ;timer 0 interupt
;=================================
;
;=================================
;
;=================================
ORG 100H
;=================================
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INITIALIZE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: MOV IE,#000H ; DISABLE ALL RUPS
MOV SP,060H ; SET STACK POINTER TO 60H
MOV PSW,#000H ; SET PTOG STATUS WORD T 00H
MOV PCON,#000H ; SET POWER CONTROL REG AND SMOD
MOV SCON,#050H ; SET SERIAL PORT MODE 1 ENABLE
MOV TMOD,#020H ; SET TMOD MODE 2 8 BIT AUTO RELOAD
MOV TH1,#0F4H ; SET TIMMER 1 VALUE 2400 BAUD
MOV TL1,#000H ; SET TIMMER 1 VALUE LOW BYTE 8 bits
MOV TCON,#040H ; SET TIMMER 1
MOV IP,#000H ; SET NO PRIORITY
MOV P0,#0FFH ; SET PORT 0 TO FLOAT
MOV P1,#0FFH ; SET PORT 1 FOR INPUT
MOV P2,#0FFH ; SET PORT 2 FOR INPUT
MOV P3,#0FFH ; SET PORT 3 FOR INPUT
CLR A ; CLEAR DATA STORAGE
MOV R1,#020h ; 1ST LOC. TO CLEAR
MOV R3,#05FH ; # TO CLEAR
CLR0: MOV @R1,A
INC R1
DJNZ R3,CLR0
CLR RS0 ;SET REGISTER BANK 0
CLR RS1 ;
SETB ES ;ENABLE SERIAL PORT INTER
SETB EA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;SET UP DEFAULTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;Start of main program
;Loop here and wait for new protocol message.
;
Idle: mov dptr,#TXDFH ;point to the flow header
mov r2,#TXDFHE ;get count
More: clr ri
jnb ri,$ ;wait for char
mov a,sbuf ;get char from buffer
anl a,#7fH
mov b,a
clr a
movc a,@a+dptr ;Get table char
cjne a,b,Idle
inc dptr ;point to next char to compare
djnz r2,More ;get next char and compare
;
; We got the new protocol flow header
;
mov r1,#FLOW ;point to the data flow header
mov r2,#FLOWE ;get count
M1: clr ri
jnb ri,$ ;wait for char
mov a,sbuf ;get char from buffer
anl a,#7fh
mov @r1,a ;stuff the value in buffer
inc r1 ;point to next char to store
djnz r2,M1 ;get next char and stuff in buffer
;
; We got the new protocol flow data
;
mov dptr,#TXDVH ;point to the volume header
mov r2,#TXDVHE ;get count
M2: clr ri
jnb ri,$ ;wait for char
mov a,sbuf ;get char from buffer
anl a,#7fH
mov b,a
clr a
movc a,@a+dptr ;Get table char
cjne a,b,Idle ;Got bad char go to idle
inc dptr ;point to next char to compare
djnz r2,M2 ;get next char and compare
;
; We got the new protocol volume header
;
mov r0,#VOL ;point to the volume data
mov r1,#VOLC ;point to char count
clr a
mov @r1,a ;clear char count
M3: clr ri
jnb ri,$ ;wait for char
mov a,sbuf ;get char from buffer
anl a,#7fh
cjne a,#0dh,n1 ;check for trailer
jmp gotvol
n1: inc @r1 ;inc count for vol char
mov @r0,a ;stuff the value in buffer
inc r0 ;point to next char to store
jmp M3 ;get next char and stuff in buffer
;
; We got the new protocol volume data
;
gotvol: mov dptr,#TXDT ;point to the volume trailer
mov r2,#TXDTE ;get count
M4: clr ri
jnb ri,$ ;wait for char
mov a,sbuf ;get char from buffer
anl a,#7fh
mov b,a
clr a
movc a,@a+dptr ;Get table char
cjne a,b,Idle ;Got bad char go to idle
inc dptr ;point to next char to compare
djnz r2,M4 ;get next char and compare
jmp Format ;Go format for output
;

;
; We got the new protocol complete message
;
;
;
Err1: mov dptr,#er1 ;Output bad flow header
mov r1,#er1e
call Tx1
jmp Idle
;
Err2: mov dptr,#er2 ;Output bad volume header
mov r1,#er2e
call Tx1
jmp Idle
;
Err3: mov dptr,#er3 ;Output bad trailer
mov r1,#er3e
call Tx1
jmp Idle
;
;
;
;
Tx1: clr TI ;Clear transmitter int
clr a
movc a,@a+dptr ;get the char
mov sbuf,a
jnb TI,$ ;transmit it
inc dptr
djnz r1,Tx1 ;loop until done
ret
;
;
;=================================
ORG 200H
;=================================
;
;Format the volumme read with period deleted and filled with
;spaces.
;
;
;Need to build new buffers for xmit
;
Format: mov r0,#FLOW ;start of input flow buffer
mov r1,#FLOWo ;start of output flow buffer
mov r2,#FLOWEo ;number of bytes to xfer
mv1: mov a,@r0 ;move data
mov @r1,a
inc r0
inc r1
djnz r2,mv1 ;loop until done
;
;
; Handle volum data

mov r0,#VOLo ;fill volume output buffer with 0
mov r1,#VOLEo
fil: mov @r0,#30h
inc r0
djnz r1,fil
;
mov r0,#VOL ;look for period and flag
mov r1,#VOLC
mov b,@r1 ;get count into b
clr F1
fnd: mov a,@r0
cjne a,#2eh,nfnd
setb F1 ;found period set flag
nfnd: inc r0
djnz b,fnd
;
jb F1,per ;found period


mov r0,#VOL ;get vol addr
mov r1,#VOLC ;get vol cout addr
mov a,r0
add a,@r1 ;add char count to vol addr
dec a
mov r0,a ;bottom of new vol buffer
;

mov r1,#VOLC ;number of bytes to fill
mov b,@r1
mov r2,b ;r2=count
mov r1,#VOLELo ;bottom of old vol out buffer
morvol: mov a,@r0 ;get char
mov @r1,a
dec r1
dec r0
djnz r2,morvol
jmp fin
;
per: mov r0,#VOL ;get vol addr
mov r1,#VOLC ;get vol cout addr
mov a,r0
add a,@r1 ;add char count to vol addr
dec a
mov r0,a ;bottom of new vol buffer
;

mov r1,#VOLC ;number of bytes to fill
mov b,@r1
mov r2,b ;r2=count
mov r1,#VOLELo ;bottom of old vol out buffer
itssp: mov a,@r0 ;get char
cjne a,#2eh,str
jmp fill
str: dec r0
djnz r2,itssp
fill: dec r2
film: dec r0
mov a,@r0
mov @r1,a
dec r1
djnz r2,film
;
;
;It's about time, now transmit this junk
;
fin: mov dptr,#RECFH ;transmit old flow header
mov r1,#RECFHE
call T1a
mov r0,#FLOWo ;transmit old flow
mov r1,#FLOWEo
call T1b
mov dptr,#RECVH ;transmit old volume header
mov r1,#RECVHE
call T1a
mov r0,#VOLo ;transmit old VOLUME
mov r1,#VOLEo
call T1b
mov dptr,#RECT ;transmit old trailer
mov r1,#RECTE
call T1a
jmp Idle ;go wait for next message
;
;
T1a: clr TI ;Clear transmitter int
clr a
movc a,@a+dptr ;get the char
mov sbuf,a
jnb TI,$ ;transmit it
inc r0
inc dptr
djnz r1,T1a ;loop until done
ret
;
;
T1b: clr TI ;Clear transmitter int
mov a,@r0 ;get the char
mov sbuf,a
jnb TI,$ ;transmit it
inc r0
djnz r1,T1b ;loop until done
ret
;=================================
ORG 300H
;=================================
;
; TABLES
;
; Old protocol header for flow
RECFH: db 02h,0dh,0ah,'FLWEX',00h,20h,'='
RECFHE equ $ - RECFH
;
; Old protocol header for volume
RECVH: db 00h,0dh,0ah,'VOLUM',00h,20h,'=',20h
RECVHE equ $ - RECVH
;
; Old protocol end of text
RECT: db 0dh,0ah,03h
RECTE equ $ - RECT
;
;
; New protocol header for flow
TXDFH: db 'TLFLWA:'
TXDFHE equ $ - TXDFH
;
; New protocol header for volume
TXDVH: db 0DH,0AH,'TLVOLM:'
TXDVHE equ $ - TXDVH
;
; New protocol trailer
TXDT: db 0AH,0DH,0AH,0DH,0AH
TXDTE equ $ - TXDT
;
; New protocol trailer short
TXDTs: db 0AH,0DH,0AH,0DH,0AH
TXDTEs equ $ - TXDTs
;
;
; Error messages
er1: db 'E1'
er1e equ $ - er1
;
er2: db 'E2'
er2e equ $ - er2
;
er3: db 'E3'
er3e equ $ - er2
;
;
;=================================
ORG 400H
;=================================
;
;=================================
ORG 500H
;=================================
;
;=================================
ORG 600H
;=================================
;
;=================================
ORG 700H
;=================================
;


List of 3 messages in thread
TopicAuthorDate
8051: serial Input with a timer            01/01/70 00:00      
RE: 8051: serial Input with a timer            01/01/70 00:00      
RE: 8051: serial Input with a timer            01/01/70 00:00      

Back to Subject List