Programming The MCS-51: Subroutines (L12) - Webstaff.kmutt.ac.th ...
Programming The MCS-51: Subroutines (L12) - Webstaff.kmutt.ac.th ...
Programming The MCS-51: Subroutines (L12) - Webstaff.kmutt.ac.th ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Page 1<br />
ENE 334 Microprocessors<br />
Lecture 12:<br />
Serial Data Transmission<br />
Week #12 : Dejwoot KHAWPARISUTH<br />
http://webstaff.<strong>kmutt</strong>.<strong>ac</strong>.<strong>th</strong>/~dejwoot.kha/
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission<br />
Page 2<br />
Week #12<br />
Outlines:<br />
➔<br />
Char<strong>ac</strong>ter Transmission Using a Time Delay<br />
➔<br />
Char<strong>ac</strong>ter Transmission by Polling<br />
➔<br />
Interrupt-Driven Char<strong>ac</strong>ter Transmission<br />
➔<br />
Polling for Received Data<br />
➔<br />
Interrupt-Driven Data Reception
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 3<br />
Week #12<br />
Serial Data Tx:<br />
Asynchronous 8-bit Char<strong>ac</strong>ter:<br />
<strong>The</strong> 80<strong>51</strong> contains serial data transmission/reception<br />
circuitry <strong>th</strong>at can be programmed to use four asynchronous<br />
data communication modes numbered from 0 to 3. One of<br />
<strong>th</strong>ese, mode 1, is <strong>th</strong>e standard UART mode (universal<br />
asynchronous receiver transmitters)
Serial Data Tx: Sendchar<br />
SENDCHAR:<br />
A program called Sendchar takes <strong>th</strong>e char<strong>ac</strong>ter in <strong>th</strong>e A<br />
register, transmits it, delays for <strong>th</strong>e transmission time, and<br />
<strong>th</strong>en returns to <strong>th</strong>e calling program.<br />
- Timer 1 must be used to set <strong>th</strong>e baud rate, which is<br />
2400 baud in <strong>th</strong>is example. Using a 12 megahertz crystal,<br />
<strong>th</strong>e reload number is 256 - 12E6/(32 x 12 x 2400), which<br />
is 242.98 or integer 243. This yields an <strong>ac</strong>tual rate of<br />
2404. (TH1 = 243d = 0F3h, SMOD = 0)<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 4<br />
Week #12
Serial Data Tx: Sendchar<br />
SENDCHAR:<br />
- Timer 1: <strong>th</strong>e baud frequency (mode 2)<br />
= 12E6/(32 x 12 x (256-243))<br />
= 2403.846 Hz.<br />
%error = (2403.846-2400)/2400 x 100% = 0.16%<br />
- <strong>The</strong> delay for one 10-bit char<strong>ac</strong>ter is (1000/2400) x 10 or<br />
4.16 milliseconds. <strong>The</strong> software delay softime is used for a 5<br />
millisecond delay.<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 5<br />
Week #12
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 6<br />
Week #12<br />
Serial Data Tx: Sendchar<br />
7 6 5 4 3 2 1 0<br />
SMOD - - - GF1 GF0 PD IDL<br />
<strong>The</strong> Power Mode Control (PCON)<br />
7 6 5 4 3 2 1 0<br />
Gate C/T M1 M0 Gate C/T M1 M0<br />
[ Timer1 ] [ Timer0 ]<br />
<strong>The</strong> Timer Mode Control (TMOD)<br />
7 6 5 4 3 2 1 0<br />
SM0 SM1 SM2 REN TB8 RB8 TI RI<br />
<strong>The</strong> Serial Port Control (SCON)
Serial Data Tx: Sendchar<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 7<br />
Week #12
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 8<br />
Week #12<br />
Serial Data Tx: Sendchar<br />
Char<strong>ac</strong>ter Transmission Using a Time Delay:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 9<br />
Week #12<br />
Serial Data Tx: Sendchar<br />
Char<strong>ac</strong>ter Transmission Using a Time Delay:
Serial Data Tx: Sendchar<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 10<br />
Week #12
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 11<br />
Week #12<br />
Serial Data Tx: Sendchar<br />
Note:<br />
- If timer 1 and <strong>th</strong>e serial port have different uses in <strong>th</strong>e<br />
user program, <strong>th</strong>en push and pop affected control<br />
registers. But remember, TI and SBUF can only be used<br />
for one function at any given time.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 12<br />
Week #12<br />
Serial Data Tx: Xmit<br />
Char<strong>ac</strong>ter Transmission by Polling:<br />
An alternative to waiting a set time for transmission is to<br />
monitor <strong>th</strong>e TI flag in <strong>th</strong>e SCON register until it is set by <strong>th</strong>e<br />
transmission of <strong>th</strong>e last char<strong>ac</strong>ter written to SBUF. <strong>The</strong> polling<br />
routine must reset TI before returning to <strong>th</strong>e call program. Failure<br />
to reset TI will inhibit all calls after <strong>th</strong>e first, stopping all data<br />
transmission except <strong>th</strong>e first char<strong>ac</strong>ter.<br />
This technique has <strong>th</strong>e advantage of simplicity; less code is used,<br />
and <strong>th</strong>e routine xmit, does not care what <strong>th</strong>e <strong>ac</strong>tual baud rate is.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 13<br />
Week #12<br />
Serial Data Tx: Xmit<br />
Char<strong>ac</strong>ter Transmission by Polling:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 14<br />
Week #12<br />
Serial Data Tx: Sbufr<br />
SBUFR:<br />
An interrupt-driven data transmission routine for<br />
continuous char<strong>ac</strong>ter transmission, which is assembled<br />
at <strong>th</strong>e interrupt vector location 0023h. A portion of <strong>th</strong>e<br />
user program <strong>th</strong>at <strong>ac</strong>tivates <strong>th</strong>e interrupt routine is<br />
shown.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 15<br />
Week #12<br />
Serial Data Tx: Sbufr<br />
Interrupt-Driven Char<strong>ac</strong>ter Transmission:
Serial Data Tx: Sbufr<br />
Interrupt-Driven Char<strong>ac</strong>ter Transmission:<br />
7 6 5 4 3 2 1 0<br />
EA - ET2 ES ET1 EX1 ET0 EX0<br />
<strong>The</strong> Interrupt Enable (IE)<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 16<br />
Week #12
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 17<br />
Week #12<br />
Serial Data Rx:<br />
Receiving Serial Data:<br />
Transmissions from outside sources to <strong>th</strong>e 80<strong>51</strong> are<br />
not predictable unless an elaborate time-of-day clock is<br />
maintained at <strong>th</strong>e sender and receiver. Messages can<br />
<strong>th</strong>en be sent at predefined times. A time-of-day clock<br />
generally ties up timers at bo<strong>th</strong> ends to generate <strong>th</strong>e<br />
required “wake-up” calls.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 18<br />
Week #12<br />
Serial Data Rx: Recv<br />
Polling for Received Data<br />
Polling involves periodically testing <strong>th</strong>e Received Data<br />
flag RI and calling <strong>th</strong>e data receiving subroutine when<br />
it is set. Care must be taken to remember to reset RI,<br />
or <strong>th</strong>e same char<strong>ac</strong>ter will be read again. Reading<br />
SBUF does not clear <strong>th</strong>e data in SBUF or <strong>th</strong>e RI flag.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 19<br />
Week #12<br />
Serial Data Rx: Recv<br />
RECV<br />
A polling-type program named Recv follows. Recv is a<br />
circular-type program <strong>th</strong>at tests RI at <strong>th</strong>e label here:<br />
and jumps to <strong>th</strong>e receive subroutine if RI is set. If RI is<br />
not set <strong>th</strong>e program continues wi<strong>th</strong> <strong>th</strong>e section<br />
represented by <strong>th</strong>e NOP instruction. At <strong>th</strong>e end of <strong>th</strong>e<br />
program a jump b<strong>ac</strong>k to here: re-tests RI.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 20<br />
Week #12<br />
Serial Data Rx: Recv<br />
Polling for Received Data:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 21<br />
Week #12<br />
Serial Data Rx: Recv<br />
Polling for Received Data:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 22<br />
Week #12<br />
Serial Data Rx: intdat<br />
Interrupt-Driven Data Reception<br />
When large volumes of data must be received, <strong>th</strong>e<br />
data rate will overwhelm <strong>th</strong>e polling appro<strong>ac</strong>h unless<br />
<strong>th</strong>e user program is extremely short, a feature not<br />
usually found in systems in which large amounts of<br />
data are interchanged. Interrupt-driven systems allow<br />
<strong>th</strong>e program to run wi<strong>th</strong> brief pauses to read <strong>th</strong>e<br />
received data.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 23<br />
Week #12<br />
Serial Data Rx: intdat<br />
INTDAT<br />
Intdat demonstrate how RI may be enabled to<br />
automatically cause an interrupt call to location 0023h<br />
in <strong>th</strong>e program. Once RI is enabled to interrupt <strong>th</strong>e<br />
main program, data is read as it is received by <strong>th</strong>e<br />
subroutine at 0023h. Received data could be <strong>th</strong>en<br />
stored by <strong>th</strong>e subroutine in <strong>th</strong>e RAM locations (a data<br />
buffer) for later reading by <strong>th</strong>e main program.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 24<br />
Week #12<br />
Serial Data Rx: intdat<br />
Interrupt-Driven Data Reception:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 25<br />
Week #12<br />
Serial Data Rx: intdat<br />
Interrupt-Driven Data Reception:
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 26<br />
Week #12<br />
Serial Data Rx: intdat<br />
Note<br />
- <strong>th</strong>at a program <strong>th</strong>at bo<strong>th</strong> transmits and receives would<br />
have to test bo<strong>th</strong> <strong>th</strong>e TI and <strong>th</strong>e RI flags to determine<br />
<strong>th</strong>e proper response to an interrupt to 0023h.<br />
- If <strong>th</strong>e receive subroutine <strong>th</strong>at is called takes longer to<br />
execute <strong>th</strong>an <strong>th</strong>e char<strong>ac</strong>ter time, <strong>th</strong>en data will be lost.<br />
Long subroutine times would be highly unusual;<br />
however, it is possible to overload any system by<br />
constant data reception.
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 27<br />
Week #12<br />
Conclusions:<br />
Final:<br />
Friday, Dec 7 <strong>th</strong> , 2012 (9am-12pm)
Questions?:<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 28<br />
Week #12
Hw:<br />
ENE 334 <strong>MCS</strong>-<strong>51</strong> Serial Data Transmission Page 29<br />
Week #12