eee502 embedded systems

40
EEE502 Embedded Systems Lecture 5: Embedded C using PIC microcontrollers Simple I/O and XC8 Teaching resources are at www.eej.ulst.ac.uk My office 5B18, telephone 028 90 366364 My email [email protected] http://www.eej.ulst.ac.uk/~ian/modules/ EEE502 1/

Upload: matsu

Post on 05-Jan-2016

36 views

Category:

Documents


0 download

DESCRIPTION

Lecture 5: Embedded C using PIC microcontrollers Simple I/O and XC8 Teaching resources are at www.eej.ulst.ac.uk My office 5B18, telephone 028 90 366364 My email [email protected]. EEE502 Embedded Systems. Microchip Inc. Ranked number 4 (after Renesas , Freescale and Atmel) - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: EEE502 Embedded  Systems

EEE502 Embedded Systems

Lecture 5: Embedded C using PIC microcontrollers

Simple I/O and XC8

Teaching resources are at www.eej.ulst.ac.uk

My office 5B18, telephone 028 90 366364My email [email protected]

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 1/

Page 2: EEE502 Embedded  Systems

2

Microchip Inc

• Ranked number 4 (after Renesas, Freescale and Atmel)

• Atmel make the chips that are in arduino boards.• Microchip make nearly 3000 different types of MCU• Make microcontrollers/MCUs in 5 families (as well as

serial memory and analogue products, sensors etc.,)• Families include 10F,12F,16F,18F and then the

24F,30F and 33F as well as the 32F parts.• We will use the 16F877A• This is available to us in a 40 pin DIP package. • Its datasheet is 234 pages long, and worth reading –

we will select relevant chapters.http://www.eej.ulst.ac.uk/~ian/modules/EEE502

Page 3: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 3

Page 4: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 4

Start up MPLAB X It is very important you use the “projects”way of working- Create a new project -> Microchip Embedded ->standalone Project- Select Device -> Mid Range… ->PIC16F877A (but check your board)- Hardware tools ->Pickit 2 or 3 (the 2 is black, the 3 is red)- Select Compiler – XC8- Give the project a name and make a new folder. One folder per program!

- To get started; under the project window on the top left hand side- Right click on sources and select a NEW – C Main File, name it sensibly .c

(we will try and stick to single file C programs)

You need to include the special header file <xc.h> - it loads PIC16F877A.h MPLAB infers this from the project file. It is better to use XC.h as it is more portable.

You need to #define _XTAL_FREQ 4000000 // or whatever you board has

You need to find and load up the datasheet for the PIC16F877A and possibly look atThe device specific header file PIC16F877A, this allows you to use predefined names Such as PORTB and TRISB

Page 5: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 5

I/O pins; PORTS A-E Similar but different

Page 6: EEE502 Embedded  Systems

Accessing special function registers (SFRs) in XC8

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 6

The Special Function Registers (SFRs) are registers which control aspects of the MCU operation or that of peripheral modules on the device.

Memory-mapped SFRs are accessed by special C variables that are placed at the address of the register. (Variables that are placed at specific addresses are called absolute variables). These variables can be accessed like any ordinary C variable so that no special syntax is required to access SFRs.

The names of the structures that hold the bit-fields will typically be those of the corresponding register followed by bits. For example, the following shows code that includes the generic header file, clears PORTA as a whole, sets bit 0 of PORTA using a bit variable and sets bit 2 of PORTA using the structure/bit-field definitions.

#include <xc.h> void main(void) { PORTA = 0x00; // how we access alll 8 bitsRA0 = 1; // how we could access one bitPORTAbits.RA2 = 1; // an alternative way of accessing a bit}

Page 7: EEE502 Embedded  Systems

Internally we need to configure the PIC

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 7

This used to use the __CONFIG macro but the modern way is to use #pragma keyword

To get the PIC to work correctly we must plant a pattern of ‘1’s and ‘0’s in a special register on powerup. This is the CONFIG register (there can be more than one of these depending on the PIC)

Examine chapter 14 of the datasheet;

Page 8: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 8

The XC8 compiler documents in the folderC:/Program Files (x86)/Microchip/xc8/v1.11/docs/pic_chipinfo.html

#pragma config CP=OFF, DEBUG=OFF, PWRTE=OFF

Page 9: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 9

#pragma config BOREN=OFF

#pragma config WRT=OFF

#pragma config WDTE=OFF

#pragma config FOSC=HS

#pragma config CPD=OFF, LVP=OFF

Page 10: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 10

Important CONFIG fuses; Oscillator Type and Watchdog disable

The config fuse setting for the oscillator affects the bias current applied to the oscillator circuitry within the PIC

Page 11: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 11

Important CONFIG fuses; Watchdog

A watchdog circuit forces reset active unless activated every so often, e.g every 20 seconds. Some systems are unsafe if a microprocessor “hangs” so it may be better to force a reset if a hardware failure occurs.

The designer should ensure that the system is safe in the reset state – relays, motors, heaters, solenoids all in a safe state.

Watchdogs should only be added near the end of the system design, when a complete study of failure mechanisms is undertaken.

It also confuses things if the PIC could reset at any time. You have to add code to every loop to reset the watchdog counter, it must be sent to zero before it reaches its trigger level.

Hence it is best to disable it.

Page 12: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 12

Page 13: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 13

Page 14: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 14

PORTB: typical input or output port (like A,C,D and E though A is 6 bits and E 3bits)

The top 4 bits of PORT B are special in that they have extra circuitry to cause and “interrupt on change” – we can use that to wake up the MCU from low power sleep mode or use it for high priority inputs;

In addition RB6 and RB7 should NOT be used by the user – they are used by the PICKIT programmer.

Page 15: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 15

Page 16: EEE502 Embedded  Systems

Electrical details: chapter 17 of datasheet

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 16

Page 17: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 17

Page 18: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 18

Page 19: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 19

Page 20: EEE502 Embedded  Systems

Simple output: LEDs

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 20

Look up a datasheet from farnell.co.uk ->products->Optoelectronics->LEDs Standard Farnell have 4062 different LEDS! Select green (545) Show All and click on price ascending (the orange triangle) The first non surface mount device is FEC 1652494

Page 21: EEE502 Embedded  Systems

An output pin driving an LED

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 21

When the output is low it is maybe at 0.6V, the LED will require 2.1Volts across it and a current of 20,A to light. Hence the resistor must drop 5-2.1-0.6 = 2.3 volts across it, which if it is carrying 20mA means its value is V/I = 2.3/20 kOhms = 0.115 or

Roughly 120 Ohms,

What value should it be for 10mA to flow (still a reasonably bright LED)

Page 22: EEE502 Embedded  Systems

Multiple LEDs

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 22

Bar Graphs

7 seg displays – either

Starburst displays(14 segment)

5x7 Dot Matrix - common cathode common anodes also available or 8x8

Alphanumeric – smart – serial in, serial out

Page 23: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 23

An output pin driving a Relay Some 12 Volt relay might have a coil resistance of 300 Ohms. This means 40mA. We could parallel port pins, but it is easy to use a transistor to carry the higher current. Cheaper relays need more current.

The power dissipated in the transistor is Vcesat * 40mA – quite low.

If the Beta of the transistor is 40 then 1ma will flow, the pin output is maybe 4 volt, and the Base emitter is at 0.6v so R should drop 3.4 volts at 1ma = 3k3

Look at farnell.co.uk and search for farnell parts FEC1455510 and FEC1094428 read the datasheets.

Page 24: EEE502 Embedded  Systems

Typical Relays: (Use www.farnell.co.uk, ww.maplin.co.uk or RS)

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 24

E.G Enter relays into the search box on the Farnell website, (7,014 products)Pick Power-General purpose or Automotive as a category.

Page 25: EEE502 Embedded  Systems

Note ticked blue triangle and PDF icons below part photo

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 25

Page 26: EEE502 Embedded  Systems

Driving multiple outputs – many relays or 7 segment displays

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 26

Page 27: EEE502 Embedded  Systems

Multiplexed output

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 27

One output to feed 1 Led or Relay is easy.

You may run out of pins!

You can either add extra devices or sometimes multiplex the outputs.

Multiplex means to make a pin do two different things

From http://embedded-lab.com/blog/?p=2086 on 26/3/13

Page 28: EEE502 Embedded  Systems

Be careful, use NPN transistors if common cathode displays.

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 28

From http://www.electronicsblog.net/4-digits-7-segments-led-display-multiplexing-with-arduino/ on 26/3/13

Page 29: EEE502 Embedded  Systems

Problems with multiplexing displays

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 29

Humans have persistence of vision, but only up to a point.

Peak currents need to be high to avoid splitting the perceived brightness

Processor has little time to do other things. It needs to “update” the display (move to next digit) every 20 milliseconds)

We can use hardware timers and interrupts to help with this but it complicates code.

There are special interface chips – display drivers that will do the multiplexing for us. E.g using the SPI or IIC (I2C or I2C) interfaces – these save lots of pins! (c.f later)

Or we can use ways of increasing the number of i/o pins and effectively avoid multiplexing. Still makes PCB and wiring a nuisance though…

Page 30: EEE502 Embedded  Systems

Expanding I/O

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 30

There are specialist chips to do this – using SPI or IIC, you can even send a RS232 message to a second or third PIC to achieve the same overall effect. – master-slave PICs

But we can use simple 8 bit latches or shift registers (c.f EEE324!)

e.g Look at the datasheets for a 74AC573 (£0.22). Also a ‘595 , ‘165 and ‘164 (any prefix)

Page 31: EEE502 Embedded  Systems

Using 11 lines to give 24 outputs

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 31

From http://www.dtvt-ictu.info/t1058-topic on 26/3/13

Page 32: EEE502 Embedded  Systems

Shift registers – output using 74HC595

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 32

Page 33: EEE502 Embedded  Systems

Example- 4 digit 7-segment display using 74595 shift registers

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 33 From http://www.reflow-kit.com/download/rk/RK-10122_104.pdf on 26/3/13

Page 34: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 34

Shift registers – input using 74HC165 (£0.31)

Page 35: EEE502 Embedded  Systems

http://www.eej.ulst.ac.uk/~ian/modules/EEE502

35

Datasheet

Software should keep CE low, put PL low then high and read Q7, bring clock (CP) high then low, read Q7 and repeat. As each bit is read it should be shifted into a byte you receive the most significant bit first. After 8 shifts the 8 inputs are in the 8 bit variable (an unsigned char in C)

From http://www.ti.com/lit/ds/symlink/cd74hc165.pdf on 26/3/13

Page 36: EEE502 Embedded  Systems

Reading 8 inputs using 3 lines from a micro

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 36 From http://forums.parallax.com/showthread.php/115628-74hc164-Schematic-amp-Sample-Code on 26/3/13

1. pulse LOAD low then high to load parallel inputs.

2. read Q7’ (pin 7) and store data bit. (you can also use Pin 9 instead)

3. pulse CP high then low to shift next data bit out.

4. go back to Step 2 and repeat until 8 bits are read

This works with any simple digital i/o lines. You can also use the built in USART peripheral in a PIC is synchronous mode – when it outputs its clock. With a 74HC165 and 74HC164 you can do 8 bit i/o over 2 lines. (c.f book by Han-Way Huang/ “Pic Microcontroller: An Introduction to Software and Hardware interfacing” )

Page 37: EEE502 Embedded  Systems

Using digital inputs

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 37

If you need to read the logic state of a chip and it has the same power supply as the PIC then you just read a ‘1’ or a ‘0’. The PIC will require very little current and has voltage thresholds given in the datasheet.

Chips that use 3.3V are becoming common, this can just about drive a PIC input to a readable value – if the current from the 3.3V output only drives the PIC input. You can add a buffer chip to ensure this, or you can add a 3.3 to 5 volt translator chip.

If you choose to run the PIC itself from 3.3V then you need to ensure you do not damage the PIC, check if you have 5V tolerant pins (some are some aren’t), use translator chips, use a potential divider (this wastes current)

You can use a transistor or mosfet. This is the reverse of the open collector circuit you used to drive a 12 volt relay, in this case use a pullup to VDD of the PIC.

You can use opto-isolators (opto-couplers) to avoid electric shock or to deal with voltages that might damage the PIC or are too low or where the “earth” or zero volts of two circuits are not common.

Page 38: EEE502 Embedded  Systems

Optocoupler (£0.42p from Farnell)

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 38

From http://www.analog.com/library/analogDialogue/Anniversary/20.html on 26/3/13

The LED should have nearly 10mA through it to illuminate the phototransistor sufficiently; Datasheet states Vf is 1.5V max so if the driving voltage is 4.5 Volts we need 330 Ohms. Use the next bigger in case the 330 is 5% too low.

The current transfer ratio tells us that we can draw up to 10mA from the collector , 10k is ok as a pull up. – we will draw 0.5mA when switched on. Note these can be slow devices.

Page 39: EEE502 Embedded  Systems

Multiplexing inputs

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 39

Ironically we use outputs to read inputs. If the output port outputs the patterns {1110, 1101, 1011, 0111} repetitively and checks on the input port that the 4 inputs are all still 1111 then no key has been hit

If a low is read then this gives us a ROW where a key has been hit. Since the software knows which COLUMN is has outputted low then the combination of the ROW and COLUMN tells us which key has been hit.

We need to scan reasonably quickly and this puts restraints on what else the software can do. There are also special key encoder chips that you can add – extra facilities such as debounce

Read in1

1

0

1

Having Output1110

i.e We know COL1 was active when ROW3 went low – tells us which switch is depressed

Page 40: EEE502 Embedded  Systems

Lab exercise HW1

http://www.eej.ulst.ac.uk/~ian/modules/EEE502 40

1. Examine the circuit diagram of the millenium board and the board itself to look at ports, LEDs D1-D3 and pushbuttons Sw1-3

2. Wire up an LED to RB0 and get it flashing twice a second

3. Read (and use) the code on OHP 15

4. Wire up a pushbutton switch to RD0 and read it, if it is ‘1’ light the LED, else do not light the LED (and repeat for ever)

5. Wire up three LEDs and three pushbutton switches, create an infinite loop that lights each LED if the corresponding switch is depressed