16.04.2014 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!