Transcript

I/O Interfacing

ECE 511: Digital System & Microprocessor

What we are going to learn in this session: M68230 Parallel Interface Timer. Registers in the M68230. Port initialization method. How M68230 interfaces with various

devices. Delay subroutine.

The M6230 Parallel Interface/Timer

M68230 Parallel Interface/Timer

Used by M68000 to communicate with external devices.

Parallel data transfer. Has three ports:

Port A, Port B, Port C. Each port is 8-bits long. Ports connect to devices. Ports need to be initialized before used.

M68230 Datasheet

M68230 Interfacing

MAD

Memory

CS*

CS*

M68k

M68230

Port A

Port B

Port C

Data BusCS* Device #1

Device #2

Device #3

(LED, Switches, Motor,7-Segment, Keypad, etc.)

How M68230 connects to M68k

D0-D7 D0-D7

DTACK*DTACK*

R/W*R/W*

CLK

RESET* RESET*

MAD CS*

A6-A23

A1-A5RS1-RS5

PA0-PA7

PB0-PB7

PC0-PC7

M68k M68230

CLK

(Register select pins)

M68230 Ports

Registers in M68230

M68230 contains 23 registers. Each of the registers have a unique address that

refers to them. To initialize ports, some registers need to be

configured. Port General Control Register. Port X Control Register (A, B). Port X Data Direction Register (A, B, C). Port X Data Register (A, B, C).

PGCR

Port General Control Register. Used to set the operation of Port A & Port

B. You only need to know (and use) Mode 0. MOVE.B #$00,PGCR

PGCR Settings

PGCR= Description

$00 Unidirectional 8-bit transfer (Port A, Port B)

Mode

0

$40 Unidirectional 16-bit transfer (Port A + Port B)1

$80Bidirectional 8-bit transfer on

Port B, bit I/O on Port A.2

$C0 Bidirectional 16-bit transfer (Port A + Port B)3

Port X Control Register

Used to set buffering of input/output on PXDR.

Three modes:Mode 00.Mode 01.Mode 1X.

You only need to know (and use) mode 1X.

PXCR Settings

PXCR= Description

$00 Double-buffered input

Sub-mode

00

$40 Double-buffered output01

$80 Bit I/O1X

Port X Data Direction Register

Used to specify the direction of data transfer for each bit in the port.

Two states: If PXDDR bit = 0, will be set as input. If PXDDR bit = 1, will be set as output.

Port X Data Register

Contains the data sent/received to/from devices.

Each PXDR carries 8-bits of data. There are three data registers in the

M68230: PADR, PBDR, PCDR.

Port Initialization

To perform port initialization:Assign the register addresses to a unique

name.PGCR must be set to #$00.PXCR must be set to #$80.Set PXDDR to input or output.

Port Initialization Example

START ORG $XXXXXX

PGCR EQU $A00001

PACR EQU $A0000D

PBCR EQU $A0000F

PADDR EQU $A00005

PBDDR EQU $A00007

PCDDR EQU $A00009

PADR EQU $A00011

PBDR EQU $A00013

PCDR EQU $A00019

MOVE.B #$00,PGCR

MOVE.B #$80,PACR/PBCR

MOVE.B #$XX,PADDR/PBDDR/PCDDR

(DEPENDING ON THE H/W)

Port Address

PGCR $A00001

PACR $A0000D

PBCR $A0000F

PADDR $A00005

PBDDR $A00007

PCDDR $A00009

PADR $A00011

PBDR $A00013

PCDR $A00019

68230 Interfacing

M68230 Interfacing

M68230 interfacing is similar to memory interfacing in last chapter.

Instead of interfacing memory, M68230 is interfaced.

A1-A5 is reserved for M68230, the rest used for decoder.

Example: Full Decoding

Interface M68230 with M68k so that its base address is $A50000.

Discussion

For M68230 interfacing, 5 lines are automatically reserved for M68230.

Step 1: Allocate Address Line

A23 A22 A21 A20 A19 A18 A17 A16 A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5

X

A4

X

A3

X

A2

X

A1

X

A0

UDS/LDS(reserved)

5 lines allocated

Step 2: Set Base Address

A23

1

A22

0

A21

1

A20

0

A19

0

A18

1

A17

0

A16

1

A15

0

A14

0

A13

0

A12

0

A11

0

A10

0

A9

0

A8

0

A7

0

A6

0

A5

X

A4

X

A3

X

A2

X

A1

X

A0

UDS/LDS(reserved)

A 5 0 0

Step 3: Find Lower Range

A23

1

A22

0

A21

1

A20

0

A19

0

A18

1

A17

0

A16

1

A15

0

A14

0

A13

0

A12

0

A11

0

A10

0

A9

0

A8

0

A7

0

A6

0

A5

0

A4

0

A3

0

A2

0

A1

0

A0

0

A 5 0 0 0 0

Step 4: Find Upper Range

A23

1

A22

0

A21

1

A20

0

A19

0

A18

1

A17

0

A16

1

A15

0

A14

0

A13

0

A12

0

A11

0

A10

0

A9

0

A8

0

A7

0

A6

0

A5

1

A4

1

A3

1

A2

1

A1

1

A0

1

A 5 0 0 3 F

Step 5: Design Decoder

A23

1

A22

0

A21

1

A20

0

A19

0

A18

1

A17

0

A16

1

A15

0

A14

0

A13

0

A12

0

A11

0

A10

0

A9

0

A8

0

A7

0

A6

0

A 5 0 0

A23 A16

NA

ND

NA

ND

NA

ND

A15 A8 A7 A6 AS*

SELIO*

Memory Block Diagram

unused

Interfaced with M68k (M68230 I/O)

unused

$FFFFFF

$000000

$A50000

$A5003F

(Lower Range)

(Upper Range)

Sample Programs

LEDs & Switches

Example 1

Example 1: Set LED

PB0

PB1

PB2

PB3

PB4

PB5

PB6

PB7

M68230A set of LEDs are connected toPort B in M68230. Write a program that turns on LED3 and LED4, and turns off the rest.

LED0

LED1

LED2

LED3

LED4

LED5

LED6

LED7

Port Address

PGCR $800001

PACR $800005

PBCR $800007

PADDR $800009

PBDDR $80000D

PCDDR $80000F

PADR $800011

PBDR $800013

PCDR $800019

Discussion

Port B should be initialized before being used.

To turn on LED, the voltage at Port B bits should be high.

To turn off LED, the voltage at Port B should be low.

LED Operation

A B

A B LED

0 0 Zero biased (OFF)

0 1 Reverse biased (OFF)

1 0 Forward biased (ON)

1 1 Zero biased (OFF)

Solution

START ORG $1000PGCR EQU $800001PBCR EQU $800007 PBDDR EQU $80000DPBDR EQU $800013

INIT MOVE.B #$00,PGCRMOVE.B #$80,PBCRMOVE.B #$FF,PBDDR

ONLED MOVE.B #%00011000,PBDR

END START

Example 1: Set LED

PB0

PB1

PB2

PB3

PB4

PB5

PB6

PB7

M68230LED0

LED1

LED2

LED3

LED4

LED5

LED6

LED7

0

0

0

1

1

0

0

0

Example 2

Example 2: Read Switches & Output to LED A set of switches are connected to Port A,

and a set of LEDs are connected to Port B in M68230. Write a program that reads the value in the switches and turns on the respective LEDs.

Switch Operation+5V

A

R

Switch A

OPEN 0

CLOSE 1

Switch Operation+5V

A

RSwitch A

OPEN 1

CLOSE 0

Circuit Diagram

PA0 PB0

PA1 PB1

PA2 PB2

PA3 PB3

PA4 PB4

PA5 PB5

PA6 PB6

PA7 PB7

M68230LED0

LED1

LED2

LED3

LED4

LED5

LED6

LED7

+5V

R

R

R

R

R

R

R

R

Port Assignments

Port Address

PGCR $A00001

PACR $A0000D

PBCR $A0000F

PADDR $A00005

PBDDR $A00007

PCDDR $A00009

PADR $A00011

PBDR $A00013

PCDR $A00019

Discussion

Both Port A & B should be initialized before being used.

When the switch is OPEN, 5V is passed to M68230 (logic high).

When the switch is CLOSE, 0V is passed to M68230 (logic low).

Solution – Initialize Ports

INIT MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$80,PBCR

MOVE.B #$00,PADDR

MOVE.B #$FF,PBDDR

Solution – Solve Problem

LOOP MOVE.B PADR,D0

MOVE.B D0,PBDR

BRA LOOP

Solution – Complete Program

START ORG $1000PGCR EQU $A00001PACR EQU $A0000DPBCR EQU $A0000FPADDR EQU $A00005PBDDR EQU $A00007PADR EQU $A00011PADR EQU $A00013

INIT MOVE.B #$00,PGCRMOVE.B #$80,PACRMOVE.B #$80,PBCRMOVE.B #$00,PADDRMOVE.B #$FF,PBDDR

LOOP MOVE.B PADR,D0MOVE.B D0,PBDRBRA LOOP

END START

Sample Output

PA0 PB0

PA1 PB1

PA2 PB2

PA3 PB3

PA4 PB4

PA5 PB5

PA6 PB6

PA7 PB7

M68230LED0

LED1

LED2

LED3

LED4

LED5

LED6

LED7

0

1

1

0

1

1

0

1

PADR D0 PBDR

+5V

R

R

R

R

R

R

R

R

7-Segment

7-Segment

Consists of 7-LEDs arranged together.

Can display numbers and characters.

Each segment is marked with a letter (a to g).

To display characters, need to turn on/off certain segments.

Also has E (enable) pin to turn on/off 7-segment.

Interfacing 7-Segment with M68230

To interface with M68230, each segment (a to g) is connected to a port in M68230.

The E signal must also be connected to a port to enable/disable the 7-segment.

7-Segment Types

There are two types of 7-segment displays:Common cathode.Common anode.

Each type differs in how they behave with certain inputs.

Common Cathode 7-Segment

E

Input (from M68230)

E Input

0 0

0 1

1 0

Output

OFF

ON

OFF

1 1 ON

Example: Interfacing CC 7-Segment with M68230 (No Transistor)

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

E

M68230

(Common cathode)

To turn on the 7-segment, E must be set to 0, and the input to be turned on must be set to 1.

Example: Interfacing CC 7-Segment with M68230 (With Transistor)

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

E

M68230

R (Common cathode)To turn on the 7-segment,

E must be set to 1, and the input to be turned on

must be set to 1.By setting E to 1, the transistor is

turned ON, providing a path to GND.

Displaying Numbers: CC7S (No Transistor)

b c d e f g NumberaE

X X X X X X NoneX1

1 0 0 0 0 0 110

1 0 1 1 0 1 210

1 1 1 0 0 1 310

1 1 0 0 1 1 400

0 1 1 0 1 1 510

0 1 1 1 1 1 600

1 1 0 0 0 0 710

1 1 1 1 1 1 810

1 1 0 0 1 1 910

1 1 1 1 1 0 010

Displaying Numbers: CC7S (with Transistor)

b c d e f g NumberaE

X X X X X X NoneX0

1 0 0 0 0 0 111

1 0 1 1 0 1 211

1 1 1 0 0 1 311

1 1 0 0 1 1 401

0 1 1 0 1 1 511

0 1 1 1 1 1 601

1 1 0 0 0 0 711

1 1 1 1 1 1 811

1 1 0 0 1 1 911

1 1 1 1 1 0 011

Common Anode 7-Segment

E Input

0 0

0 1

1 0

Output

OFF

OFF

ON

1 1 OFF

E

Input (to M68230)

Example: Interfacing CA 7-Segment with M68230

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

E

M68230

(Common anode)

To turn on the 7-segment, E must be set to 1, and the input to be turned on must be set to 0.

Displaying Numbers: CA7S (No Transistor)

b c d e f g NumberaE

X X X X X X NoneX0

0 1 1 1 1 1 001

0 1 0 0 1 0 101

0 0 0 1 1 0 301

0 0 1 1 0 0 411

1 0 0 1 0 0 501

1 0 0 0 0 0 611

0 0 1 1 1 1 701

0 0 0 0 0 0 801

0 0 1 1 0 0 901

0 0 0 0 0 1 101

Example 1

Example: Displaying ‘C’ on 7-Seg

B0

B1

B2

B3

B4

B5

B6

B7

a=1

b=0

c=0

d=1

e=1

f=1

g=0

E=1

M68230

R (Common cathode)

MOVE.B #$00,PGCRMOVE.B #$80,PBCRMOVE.B #$FF,PBDDR

ULANG MOVE.B #$B9,PBDRBRA ULANG

Displaying More Numbers/Characters

7-Segments can also be grouped together to display multiple numbers/characters.

Usually done using a technique called multiplexing.

Interfacing 2 7-Segments with M68230

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

Example 2

Example: Displaying on Multiple 7-Segs

Write a program to display ‘12’ on 2 7-Segment displays. The circuit diagram is shown.

Example: Displaying 12 on 2 7-Segments

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

Step 1: Init Ports

MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$80,PBCR

MOVE.B #$FF,PADDR

MOVE.B #$FF,PBDDR

Step 2: Activate E2, Send First Number

MOVE.B #$01,PADR * activate E2

MOVE.B #$5B,PBDR * display 2

BSR DELAY * delay for a while to * allow 7-seg to

* turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=1

B1=1

B2=0

B3=1

B4=1

B5=0

B6=1

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 1 (off)

E2 = 0 (on)

Step 2: Activate E1, Send Second Number

MOVE.B #$02,PADR * activate E1

MOVE.B #$06,PBDR * display 1

BSR DELAY * delay for a while to * allow 7-seg to

* turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=0

B1=1

B2=1

B3=0

B4=0

B5=0

B6=0

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 0 (on)

E2 = 1 (off)

Step 3: Activate E2 Back, Send First Number Again

MOVE.B #$01,PADR * activate E2

MOVE.B #$5B,PBDR * display 2

BSR DELAY * delay for a while to * allow 7-seg to

* turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=1

B1=1

B2=0

B3=1

B4=1

B5=0

B6=1

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 0 (off)

E2 = 1 (on)

Discussion

Using multiplexing, only one digit may be turned on at one time.

But, if the delay is fast enough (<100ms), our eyes won’t be able to catch the change.

Example: Displaying 12 on 2 7-Segments

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

Complete Program

ORG $080C00

DELAY MOVE.L #50,D7DELLOOP SUB.L #1,D7

CMP.L #0,D7BNE DELLOOPRTS

START ORG $080D00

PGCR EQU $100001PADDR EQU $100005PBDDR EQU $100007PCDDR EQU $100009PADR EQU $100011PBDR EQU $100013PCDR EQU $100019PACR EQU $10000DPBCR EQU $10000F

INIT MOVE.B #$00,PGCRMOVE.B #$80,PACRMOVE.B #$80,PBCRMOVE.B #$03,PADDRMOVE.B #$7F,PBDDR

BEGIN MOVE.B #$01,PADRMOVE.B #$5B,PBDR BSR DELAY

MOVE.B #$02,PADRMOVE.B #$06,PBDR BSR DELAY

BRA BEGIN

END START

Example 2

Example: Displaying on 5 7-Segs.

A set of 7-segment displays are connected on Port A and Port B in M68230. Write a program to display the message ‘HELLO’ on the 7-segment display.

Circuit DiagramM68230

A0A1A2A3A4A5A6A7

B0B1B2B3B4B5B6B7

R

R

E0E1E2E3E4

Algorithm Turn on E4,

Display ‘H’. Delay for a while.

Turn on E3, Display ‘E’. Delay for a while.

Turn on E2, Display ‘L’. Delay for a while.

Turn on E1, Display ‘L’. Delay for a while.

Turn on E0, Display ‘O’. Delay for a while.

Do E4 again.

Character H

A = 0B = 1C = 1D = 0E = 1F = 1G = 1

MOVE.B #%01110110,PBDR

OR

MOVE.B #$76,PBDR

Character E

A = 1B = 0C = 0D = 1E = 1F = 1G = 1

MOVE.B #%01111001,PBDR

OR

MOVE.B #$79,PBDR

Character L

A = 1B = 0C = 0D = 1E = 1F = 1G = 0

MOVE.B #%00111001,PBDR

OR

MOVE.B #$39,PBDR

Character H

A = 1B = 1C = 1D = 1E = 1F = 1G = 0

MOVE.B #%00111111,PBDR

OR

MOVE.B #$3F,PBDR

ProgramORG $080C00

DELAY MOVE.L #50,D7 * 80 MS DELAY

DELLOOP SUB.L #1,D7CMP.L #0,D7BNE DELLOOPRTS

START ORG $080D00

PGCR EQU $100001

PADDR EQU $100005PBDDR EQU $100007PADR EQU $100011PBDR EQU $100013PACR EQU $10000DPBCR EQU $10000F

INIT MOVE.B #$00,PGCRMOVE.B #$80,PACRMOVE.B #$80,PBCRMOVE.B #$FF,PADDRMOVE.B #$FF,PBDDR

HELLO MOVE.B #$0F,PADR * ACTIVATE E4MOVE.B #$76,PBDR * DISPLAY HBSR DELAY

MOVE.B #$17,PADR * ACTIVATE E3MOVE.B #$79,PBDR * DISPLAY EBSR DELAY

MOVE.B #$1B,PADR * ACTIVATE E2MOVE.B #$39,PBDR * DISPLAY LBSR DELAY

MOVE.B #$1D,PADR * ACTIVATE E1MOVE.B #$39,PBDR * DISPLAY LBSR DELAY

MOVE.B #$1E,PADR * ACTIVATE E0MOVE.B #$3F,PBDR * DISPLAY OBSR DELAY

BRA HELLO

END START

7-Segment + BCD Decoder

7-Segment + BCD Decoder

A BCD 7-Segment decoder can be used to simplify the interface to M68230.

Just send a BCD number, and it will be automatically displayed at 7-segment.

Also reduces the number of connections required to display 7-segment values.

Example: 7-Segment + BCD Decoder

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

BCD 7-Seg

Decoder

BCD Decoder I/O

B1 B0 NumberB2B3

0 1 100

2

3

4

5

6

7

8

9

0

0 101

0 000

1 110

0 001

0 110

1 010

1 100

0 010

1 000

Example 3

Displaying 12 on 7-Segments

A circuit is wired as in the next figure. Write a program that displays ‘12’ on the 7-Segment.

Example: 7-Segment + BCD Decoder

B0

B1

B2

B3

B4

B5

B6

B7

a

b

c

d

e

f

g

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

BCD 7-Seg

Decoder

Step 1: Init Ports

MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$80,PBCR

MOVE.B #$FF,PADDR

MOVE.B #$FF,PBDDR

Step 2: Activate E2, Send First Number

MOVE.B #$01,PADR * activate E2

MOVE.B #$02,PADR * display 2

BSR DELAY * delay for a

* while to allow 7-seg * to turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=0

B1=1

B2=0

B3=0

B4

B5

B6

B7

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 1 (off)

E2 = 0 (on)

a

b

c

d

e

f

g

BCD 7-Seg

Decoder

Step 2: Activate E1, Send Second Number

MOVE.B #$02,PADR * activate E1

MOVE.B #$01,PADR * display 1

BSR DELAY * delay for a while

* to allow 7-seg * to turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=0

B1=1

B2=1

B3=0

B4=0

B5=0

B6=0

B7

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 0 (on)

E2 = 1 (off)

a

b

c

d

e

f

g

BCD 7-Seg

Decoder

Step 4: Activate E2 Back, Send First Number Again

MOVE.B #$01,PADR * activate E2

MOVE.B #$02,PADR * display 2

BSR DELAY * delay for a

* while to allow 7-seg * to turn on.

Example: Displaying 12 on 2 7-Segments

OFF

B0=0

B1=1

B2=0

B3=0

B4

B5

B6

B7

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1 = 1 (off)

E2 = 0 (on)

a

b

c

d

e

f

g

BCD 7-Seg

Decoder

Discussion

Using multiplexing, only one digit may be turned on at one time.

But, if the delay is fast enough (<100ms), our eyes won’t be able to catch the change.

Example: Displaying 12 on 2 7-Segments

B0

B1

B2

B3

B4

B5

B6

B7

M68230

(Common cathode)

a

b

c

d

e

f

g

A0

A1

E1

E2

a

b

c

d

e

f

g

BCD 7-Seg

Decoder

Complete ProgramORG $080C00

DELAY MOVE.L #50,D7DELLOOP SUB.L #1,D7

CMP.L #0,D7BNE

DELLOOPRTS

START ORG $080D00

PGCR EQU $100001

PADDR EQU $100005PBDDR EQU $100007PCDDR EQU $100009PADR EQU $100011PBDR EQU $100013PCDR EQU $100019PACR EQU $10000DPBCR EQU $10000F

INIT MOVE.B#$00,PGCR

MOVE.B#$80,PACR

MOVE.B#$80,PBCR

MOVE.B#$FF,PADDR

MOVE.B#$FF,PBDDR

BEGIN MOVE.B#$01,PADR

MOVE.B#$02,PBDR

BSR DELAYMOVE.B

#$02,PADRMOVE.B

#$01,PBDRBSR DELAYBRA BEGIN

END START

DC Motor

Controlling DC Motors

Has two terminals (positive/negative), connected to DC voltage.

If positive voltage applied at positive terminal, motor moves clockwise.

If negative voltage applied at positive terminal, motor moves anti-clockwise.

DC Motor+12V

+ -

+ with + = clockwise

+ -

+12V

+ with - = anti-clockwise

Interfacing DC Motor with M68230 – Single Direction

+

-

M68230

A0

A1

A2

A3

A4

A5

A6

A7

+12V

R

R

R

MOVE.B #$00,PGCRMOVE.B #$80,PACRMOVE.B #$FF,PADDRMOVE.B #$10,PADR

Interfacing DC Motor with M68230 (Two Directions)

+12V

RR

R

+

-

R

RR

A0

A1

A2

A3

T1

T4 T3

T2

PNP transistors are turned on by 0 at base.NPN transistors are turned on by 1 at base.

Moving the Motor Clockwise

MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$FF,PADDR

MOVE.B #%00001100,PADR(Turn on T1 and T3)

Interfacing DC Motor with M68230 (Clockwise)

+12V

RR

R

+

-

R

RR

A0

A1

A2

A3

T1

T4 T3

T2

Positive meets positive, clockwise direction

0

01

11

0

0

1

Moving the Motor Anti-clockwise

MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$FF,PADDR

MOVE.B #%00000011,PADR(Turn on T2 and T4)

Interfacing DC Motor with M68230 (Anti-clockwise)

+12V

RR

R

+

-

R

RR

A0

A1

A2

A3

T1

T4 T3

T2

Positive meets negative, anti-clockwise direction

0 1

1 0

0 1

1 0

Keypad

Keypad

A set of switches. CPU determines what button pressed by

scanning each column in turn. Need to be de-bounced after each key

press:Done using de-bouncing subroutine.

Keypad

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1 P2

P4

P5

P6

P7

Step 1: Initialization

Lets say Port A is connected to keypad.

MOVE.B #$00,PGCR

MOVE.B #$80,PACR

MOVE.B #$0F,PADDR

Step 2 – Scan 1st Column

1

4

7

*

2

5

8

0

3

6

9

#

P0=1 P1 P2

P4

P5

P6

P7

Step 2: Scan 1st ColumnCOL1 BCLR.B #1,PBDR

BCLR.B #2,PBDRBSET.B #0,PBDR

MOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS1CMP.B #$20,D1BEQ IS4CMP.B #$40,D1BEQ IS7CMP.B #$80,D1BEQ ISSTARBNE COL2

IS1 MOVE.B #1,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS4 MOVE.B #4,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS7 MOVE.B #7,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISSTAR MOVE.B #$00,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

* MOVE.B #9,D3 and TRAP #0 are used as an example to displaythe output to screen. Replace it with your own code.

Step 3 – Scan 2nd Column

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1=1 P2

P4

P5

P6

P7

Step 3: Scan 2nd ColumnCOL2 BCLR.B #0,PBDR

BCLR.B #2,PBDRBSET.B #1,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS2CMP.B #$20,D1BEQ IS5CMP.B #$40,D1BEQ IS8CMP.B #$80,D1BEQ IS0BNE COL3

IS2 MOVE.B #2,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS5 MOVE.B #5,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS8 MOVE.B #8,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS0 MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Step 4 – Scan 3rd Column

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1 P2=1

P4

P5

P6

P7

Step 4: Scan 3rd ColumnCOL3 BCLR.B #0,PBDR

BCLR.B #1,PBDRBSET.B #2,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS3CMP.B #$20,D1BEQ IS6CMP.B #$40,D1BEQ IS9CMP.B #$80,D1BEQ ISHASHBNE COL1

IS3 MOVE.B #3,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS6 MOVE.B #6,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS9 MOVE.B #9,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISHASH MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Complete ProgramORG $080C00

DELAY MOVE.B #$1F,D4NEXTDEL SUB.B #1,D4

BNE NEXTDEL

WAIT MOVE.B PBDR,D2AND.B #$F0,D2CMP.B #$00,D2BNE WAITRTS

START ORG $080D00

PGCR EQU $100001PACR EQU $10000DPBCR EQU $10000FPADDR EQU $100005PBDDR EQU $100007PCDDR EQU $100009PADR EQU $100011PBDR EQU $100013PCDR EQU $100019

INIT MOVE.B #$00,PGCRMOVE.B #$80,PACRMOVE.B #$80,PBCRMOVE.B #$0F,PBDDRMOVE.B #$00,PBDR

COL1BCLR.B #1,PBDRBCLR.B #2,PBDRBSET.B #0,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS1CMP.B #$20,D1BEQ IS4CMP.B #$40,D1BEQ IS7CMP.B #$80,D1BEQ ISSTARBNE COL2

IS1 MOVE.B #1,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS4 MOVE.B #4,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS7 MOVE.B #7,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISSTAR MOVE.B#$00,D0

BSRWAIT

MOVE.B#9,D3

TRAP#0

BRACOL1

ENDSTART

COL2BCLR.B #0,PBDRBCLR.B #2,PBDRBSET.B #1,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS2CMP.B #$20,D1BEQ IS5CMP.B #$40,D1BEQ IS8CMP.B #$80,D1BEQ IS0BNE COL3

IS2 MOVE.B #2,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Complete ProgramIS3 MOVE.B #3,D0

BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS6 MOVE.B #6,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS9 MOVE.B #9,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISHASH MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS5 MOVE.B #5,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS8 MOVE.B #8,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS0 MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

COL3BCLR.B #0,PBDRBCLR.B #1,PBDRBSET.B #2,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS3CMP.B #$20,D1BEQ IS6CMP.B #$40,D1BEQ IS9CMP.B #$80,D1BEQ ISHASHBNE COL1

Example

Example – 4 Pressed

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1 P2

P4

P5

P6

P7

Step 2: Scan 1st ColumnCOL1 BCLR.B #1,PBDR

BCLR.B #2,PBDRBSET.B #0,PBDR

MOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS1CMP.B #$20,D1BEQ IS4CMP.B #$40,D1BEQ IS7CMP.B #$80,D1BEQ ISSTARBNE COL2

IS1 MOVE.B #1,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS4 MOVE.B #4,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS7 MOVE.B #7,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISSTAR MOVE.B #$00,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Example – 8 Pressed

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1 P2

P4

P5

P6

P7

Step 3: Scan 2nd ColumnCOL2 BCLR.B #0,PBDR

BCLR.B #2,PBDRBSET.B #1,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS2CMP.B #$20,D1BEQ IS5CMP.B #$40,D1BEQ IS8CMP.B #$80,D1BEQ IS0BNE COL3

IS2 MOVE.B #2,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS5 MOVE.B #5,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS8 MOVE.B #8,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS0 MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Example – 6 Pressed

1

4

7

*

2

5

8

0

3

6

9

#

P0 P1 P2

P4

P5

P6

P7

Step 4: Scan 3rd ColumnCOL3 BCLR.B #0,PBDR

BCLR.B #1,PBDRBSET.B #2,PBDRMOVE.B PBDR,D1AND.B #$F0,D1CMP.B #$10,D1BEQ IS3CMP.B #$20,D1BEQ IS6CMP.B #$40,D1BEQ IS9CMP.B #$80,D1BEQ ISHASHBNE COL1

IS3 MOVE.B #3,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS6 MOVE.B #6,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

IS9 MOVE.B #9,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

ISHASH MOVE.B #0,D0BSR WAITMOVE.B #9,D3TRAP #0BRA COL1

Delay Subroutine

Delay Subroutine

In some applications, we may need to delay the output before executing next instruction.

Can be achieved using delay subroutine: Does some meaningless repetitive task over and

over. “Wastes” processing time of M68k. Can be set to repeat until desired delay is achieved.

Delay Subroutine Example

DELAY MOVE.L #xxx,Dn

LOOP SUB.L #1,Dn

CMP.L #0,Dn

BNE LOOP

RTS

Calculating The Delay

To calculate delay, you need to know the time required to execute each instruction:

Instruction Clock Cycles to Complete Time (M68k @10MHz)

MOVE.L 12 0.0000012s

SUB.L 16 0.0000016s

CMP.L 14 0.0000014s

BNE 10 0.0000010s

RTS 16 0.0000016s

M68k @ 10MHz T = 1/10MHz = 1x10-7secs.

Exe

cute

d n

times

.

Calculating the Delay – M68k 10MHz

For 1 sec., 10,000,000 clock cycles are required.

10,000,000 = 12 + 16 + (16 + 14 + 10)n

10,000,000 = 28 + 40n

n = (10,000,000 – 28)/40

n = (10,000,000 – 28)/40 = 249,999

Delay Subroutine Example – 1s

DELAY MOVE.L #249999,D6

LOOP SUB.L #1,D6

CMP.L #0,D6

BNE LOOP

RTS

Calculating The Delay – 0.25s

To calculate delay, you need to know the time required to execute each instruction:

Instruction Clock Cycles to Complete Time (M68k @10MHz)

MOVE.L 12 0.0000012s

SUB.L 16 0.0000016s

CMP.L 14 0.0000014s

BNE 10 0.0000010s

RTS 16 0.0000016s

M68k @ 10MHz T = 1/10MHz = 1x10-7secs.

Exe

cute

d n

times

.

Calculating the Delay

For 0.25 sec., 2,500,000 clock cycles are required.

2,500,000 = 12 + 16 + (16 + 14 + 10)n

2,500,000 = 28 + 40n

n = (2,500,000 – 28)/40

n = (2,500,000 – 28)/40 = 62,499

Delay Subroutine Example – 0.25s

DELAY MOVE.L #62499,D6

LOOP SUB.L #1,D6

CMP.L #0,D6

BNE LOOP

RTS

Implementing Delay

START ORG $090000INIT MOVEA.L #$100001,A6 * base address of pi/t MOVE.B #$80,$E(A6) * configure port B control reg to mode 1x MOVE.B #$FF,$6(A6) * configure port B data reg to o/p

LOOP MOVE.B #$FF,$100013 BSR DELAYMOVE.B #$00,$100013 BSR DELAYBRA LOOP

DELAY MOVE.L #249999,D7DELLOOP SUB.L #1,D7

CMP.L #0,D7BNE DELLOOPRTS

END START

Turn on all LEDs,Wait 1 second,Turn off all LEDs,Wait 1 second.

Conclusion

Conclusion

The M68230 is a parallel interface used by M68k to connect with various devices.

The M68230 has three ports, which can be configured to interface with many devices.

To use the ports, it MUST be initialized first.

Conclusion

The delay subroutine is used to “waste” the CPU’s time by telling it to do repetitive tasks.

The delay format is basically the same, just adjust the counter to get the delay you want.

The End

Please read:Antonakos, pg. 352-366M68230 DatasheetAblelogic, Abitec, VTES Manuals

top related