110 likes | 239 Views
Simple Digital I/O in C. These lecture notes created by Dr. Alex Dean, NCSU. Simple Digital I/O Port Data Direction Data Drive Capacity Use Initialization Reading Writing Example Echo LEDs. In these notes. Digital Input/Output (I/O) Ports. The fundamental interfacing subsystem
E N D
Simple Digital I/O in C These lecture notes created by Dr. Alex Dean, NCSU
Simple Digital I/O Port Data Direction Data Drive Capacity Use Initialization Reading Writing Example Echo LEDs In these notes . . .
Digital Input/Output (I/O) Ports • The fundamental interfacing subsystem • A port bit can be input or output • M30626 has 11 Programmable I/O Ports (total of 87 digital I/O bits) (P1 through P7 and P9 and P10 are bidirectional 8-bit ports, while P8 has an an input-only bit) • For some other MCUs some ports may be limited to only input or output • Direction register sets bit direction (PD1, etc.) • 1: Output • 0: Input (value of direction register bits after reset) • Data register holds actual data • P1 etc. • M16C62P Hardware Manual, “Programmable I/O Ports”
Read direction Read port Read port Programmable I/O Port
Digital I/O Port as Input enabled, turns on pull-up when input is 1 0 1 Read direction 1 off 0 Read port 0 disabled 1 off Read port enabled
Digital I/O Port as Output disabled 1 0 Read direction 1 Read port 1 enabled 0 Read port 1 enabled, behave as inverters disabled
Pull-Up Resistors for Inputs • Used to simplify interfacing with devices with limited signal swing • M30626 is digital CMOS and is only designed to operate correctly with valid input voltages (Everything else is illegal and is not guaranteed) • Logic 1: 0.8 * VCC to VCC, Logic 0: 0V to 0.2 * VCC • Resistor is used to pull up voltage of signal from devicewith two states • Low resistance to ground • High resistance (essentially open circuit) • Pull-up resistor is built into microcontroller to simplify circuit design and eliminate external components (save money, space, assembly effort) • M30626 Pull-Ups • Controlled in blocks of 4 (upper and lower halves of each port) • Each block is enabled by a bit in PUR0, PUR1 or PUR2 • Pull-ups disabled if a port bit is configured as an output • Value typically 120kW, min 66 kW, max 500kW • M16C62P Hardware Manual, “Programmable I/O Ports”.
Example in Assembly: P6 Echoes Nibble Data • Configuring port to desired structure • Top 4 bits (4-7) of P6 are inputs • Clear bits 4-7 of PD6 • These inputs need pull-up resistors • Set bit PU15 of special function register (SFR) PUR1 to enable pull-ups • Bottom 4 bits of P6 are outputs • Set bits 0-3 of PD6 Bits 7-4 Port 6 Bits 3-0 Init: or.b #PU15, PUR1 mov.b #00001111b,PD6 Loop: mov.b P6, R0 ; read inputs shl.b #-4, R0 ; move bits 7-4 into 3-0 mov.b R0, P6 ; write outputs jmp Loop ; repeat forever
C-Level Support for SFR Interfacing • Renesas has provided C support for MCU special function registers and special bits in sfr62p.h • Original is in Renesas\QSK62P\Sample_Code\Common • File is copied into project directory when you create a new file • Note that these names are lower-case! • Can treat SFR’s (and some bits) as variables • Examples • To initialize a GPIO port’s direction, set the port data direction register • pd0 is the name for SFR PD0 • Write all 0’s (0x00) to it to make it an input port • pd0 = 0x00; • Write all 1’s (0xff) to make it an output port • pd1 = 0xff; • To read from the port • data = p0; • To write to a port • p1 = data; • Can even access some bits (use names in sfr62p.h) • p1_1 = 0; • n = p0_7;
Example in C: P6 Echoes Nibble Data #include “sfr62p.h” #define DIR_OUT (1) #define DIR_IN (0) unsigned char a; pu15 = 1; /* pd6 = 0xf0; */ pd6_0 = pd6_1 = DIR_OUT; pd6_2 = pd6_3 = DIR_OUT; pd6_4 = pd6_5 = DIR_IN; pd6_6 = pd6_7 = DIR_IN; while (1) { a = p6; a >>= 4; p6 = a; } • Reading and writing data • Load data from input port • Move top nibble to bottom • Write data to output port • Jump back to start • Now let’s invert the data before writing it out • Load data from input port • Move top nibble to bottom • Invert it (complement) • Write data to output port • Jump back to start Bits 7-4 a = ~a; Port 6 Bits 3-0
Example Application: Revisiting the Response Timer • Requirements • Measure time delay between when program lights LED and user presses switch • Display delay on LCD • Input • Switch: active low, needs pull-up • Outputs • LED: active low, triggers user • LCD: displays time measurement • Development plan • Get a simple program skeleton to compile – follow tutorial 1 or 2 if needed • Verify debugger takes us to main() • Configure and test LED outputs • Configure and test switch inputs • Configure and test LCD • Create and test time delay measurement function