| ??? 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 ;================================= ; |
| Topic | Author | Date |
| 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 |



