centre for instrumentation, control and automation (inca)

27
Term 8 Electrical and Computer Engineering Project Course January 2002 Mark Simms Steven Taylor PIC Development, The Easy Way

Upload: flashdomain

Post on 18-May-2015

639 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Centre for Instrumentation, Control and Automation (INCA)

Term 8 Electrical and Computer Engineering Project Course

January 2002

Mark Simms

Steven Taylor

PIC Development, The Easy Way

Page 2: Centre for Instrumentation, Control and Automation (INCA)

Overview

Basic PIC Circuits

Development in C using CCS

Typical Tasks (A/D, PWM, timing)

How to Layout a Program

Debugging Tips

The Pumpkin protoboard

Page 3: Centre for Instrumentation, Control and Automation (INCA)

Basic PIC Circuits

All designs are based around the PIC16F877, a mid-range microcontroller that supports: 8kB of flash program memory

Interrupts

In-circuit programming

Hardware timers

Capture/Compare/PWM modules

10-bit A/D conversion (up to 8 channels)

Built-in USART for serial communication

Lots of Digital I/O

Page 4: Centre for Instrumentation, Control and Automation (INCA)

Basic PIC Circuits

The most basic circuit consists of: The microcontroller

Power and GND (+5V)

Oscillator with Caps

Typical development circuit adds: RS232 interface (typically with a MAX2.. Chip)

LED’s / switches / etc

Schematics available on INCA web site (resources at end)

Page 5: Centre for Instrumentation, Control and Automation (INCA)

Programming in C

Programming the PIC in C offers several advantages:

Higher level language – developer is insulated from details of the chip

Library support for common tasks (string manipulation, serial communication)

We use the CCS compiler (http://www.ccsinfo.com/) which don’t suck. All examples will use CCS code

Page 6: Centre for Instrumentation, Control and Automation (INCA)

PIC – Common Tasks with CCS

Program Template. Starting point for just about everything

#define <16F877.h> // Define the type of chip you’re using. // Makes it easier to switch chips

#use delay(clock=20000000) // 20Mhz oscillator

void main()

{

/* Initialization Code goes here */

while (TRUE)

{

/* Program Code goes here */

}

}

Page 7: Centre for Instrumentation, Control and Automation (INCA)

PIC – Common Tasks with CCS

Digital I/O Standard I/O vs. Fast I/O

Using (standard I/O):

// Output a high on PIN_D1, low on PIN_D2

// Wait 50 us and invert

output_high(PIN_D1);

output_low(PIN_D2);

delay_us(50);

output_low(PIN_D1);

output_high(PIN_D2);

Page 8: Centre for Instrumentation, Control and Automation (INCA)

PIC – Common Tasks with CCS

Analog Input Initialization:

setup_adc_ports(ALL_ANALOG);

setup_adc(ADC_CLOCK_DIV_2);

Picking a channel:

set_adc_channel(0); // Note: must wait between changing

// input channels (~ 10us)

Inputting Data:

unsigned int16 data; // Declare a 16-bit integer

data = read_adc(); // Read a 10-bit value from the // selected channel

Page 9: Centre for Instrumentation, Control and Automation (INCA)

PIC – Common Tasks with CCS

Using PWM Initialization:

setup_timer_2(T2_DIV_BY_1,249,1); // Setup the PWM period

setup_ccp1(CCP_PWM); // Set CCP1 for PWM

Setting the Duty Cycle:

set_pwm1_duty(500); // See the CCS examples for the formula // for setting the PWM period and duty // cycle

Page 10: Centre for Instrumentation, Control and Automation (INCA)

PIC – Tips for Software Design

Design the program as a state machine A main() loop, with:

A switch() statement that jumps to a function() which represents the actions that occur in that state

Each state function() has an output section and a transition section (which can change the current state variable)

Interrupts are very useful (for example: interrupt when data received on serial port), but can cause problems. I.e. if you change state during an interrupt (such as an E-stop), return from

the interrupt service routine, then change the state variable again (during the transition section) the interrupt change is lost.

Design with tuning and debugging in mind Programmer time is more important than machine time – the PIC16F877 is

plenty fast

Page 11: Centre for Instrumentation, Control and Automation (INCA)

PIC – Tips for Debugging

Use a protoboard with RS232 support and lots of print statements. Example:

program waits for a switch press

reads an analog voltage

changes the PWM cycle accordingly

Page 12: Centre for Instrumentation, Control and Automation (INCA)

PIC – Tips for Debugging

Some_function()

{

int1 pushed = FALSE, last_pushed = FALSE;

int16 analog_value;

float volts;

pushed = input(PIN_D3);

if (pushed && !last_pushed) {

puts(“Button Pushed!”);

analog_value = read_adc(); /* 10-bit analog input value is * between 0-1023 0-5V range */

volts = 5.0 * (analog_value / 1024.0);

printf(“Button pushed! Analog value is %f volts, PWM to %i\n, volts, analog_value);

set_pwm1_duty(analog_value);

/* We’ve pre-configured PWM channel 1 – the set_pwm1_duty cycle function accepts

a 10-bit number and adjusts the cycle accordingly */

}

Page 13: Centre for Instrumentation, Control and Automation (INCA)

PIC – Tips for Debugging

Can also use conditionals to print out different types of debugging messages. Say we have a type of message, INFO that we only want to be displayed when testing certain things. We could define a MACRO:

#ifdef SHOW_INFO

#define INFO(A) puts(A);

#else

#define INFO(A) /* A */

#endif

Then, at an appropriate point in the code:

INFO(“Button Pushed”);

Page 14: Centre for Instrumentation, Control and Automation (INCA)

PIC – In-Circuit Programming

The PIC16F877 has on-board FLASH memory

No burner needed to reprogram the PIC

No need to remove PIC from circuit

Using a bootloader on the PIC, and a bootload utility on the PC the PIC can be reprogrammed in seconds over a serial link.

Burn the bootloader code onto the PIC

When writing your program in C tell the compiler not to use the top 255 bytes of flash memory

Connect the PIC circuit to the PC via a serial link. Run the bootloader code from the PC and download your code to the circuit in seconds

This technique is VITAL to preserving sanity

Page 15: Centre for Instrumentation, Control and Automation (INCA)

PIC – In-Circuit Programming

The PIC16F877 has on-board FLASH memory

No burner needed to reprogram the PIC

No need to remove PIC from circuit

Using a bootloader on the PIC, and a bootload utility on the PC the PIC can be reprogrammed in seconds over a serial link.

Burn the bootloader code onto the PIC

When writing your program in C tell the compiler not to use the top 255 bytes of flash memory

Connect the PIC circuit to the PC via a serial link. Run the bootloader code from the PC and download your code to the circuit in seconds

This technique is VITAL to preserving sanity

Page 16: Centre for Instrumentation, Control and Automation (INCA)

PIC – Mad2/Pumpkin

PIC16F877-based Prototyping Board PIC16F877 microcontroller with PWR/GND connected, 20Mhz

oscillator

8 digital I/O points

8 LED’s (switchable to DI/O)

8 Analog Input ports (also usable as DI/O)

2 PWM channels

RS232 interface

Page 17: Centre for Instrumentation, Control and Automation (INCA)

Sample Application – Analog Sampling

PC Application will do the following: Present a graphical front end to the user

Have a “sample” button that will send a character to the PIC over the serial port

Will read back a number in hex format, reformat into decimal and display on the screen

PIC Application will do the following: Poll the serial port

If a character is received, sample analog channel 0 (A0), and print the value to the serial port as a hex number, followed by a newline/return (\r\n)

Use the value read from the analog input channel as the PWM duty cycle on channel 1

Page 18: Centre for Instrumentation, Control and Automation (INCA)

Mplab – Setting up for CCS

Project->New (call it main.prj) Development Mode: Editor/16F877

Language Tool Suite: CCS

Click on main.hex, Node Properties

Click on PCM

File->New

File->Save As, main.c

Add Node, main.c

Ready to start building the application

Page 19: Centre for Instrumentation, Control and Automation (INCA)

Step 1: Basic Template

Basic Template Code is:

Include the header file for the appropriate PIC Note: I typically use a custom 16F877.H header file with 10-bit data

acquisition turned on

Set the clock speed

Set the fuses

Set up serial communication

Reserve memory for the bootloader

Main function and debug/status message

Page 20: Centre for Instrumentation, Control and Automation (INCA)

Step 2: Initialize the PIC functions

Need to initialize (if using): Analog to Digital Conversion

Counters and Timers

PWM output / capture

Interrupts Serial

Timer

Global

Etc

I’ve included an LED test to show the card has reset

Page 21: Centre for Instrumentation, Control and Automation (INCA)

Step 2: Initialize the PIC functions

Need to initialize (if using): Analog to Digital Conversion

Counters and Timers

PWM output / capture

Interrupts Serial

Timer

Global

Etc

I’ve included an LED test to show the card has reset

Page 22: Centre for Instrumentation, Control and Automation (INCA)

Step 3: State Machine and Interrupts

Set up the state machine

Define the allowable states with enum’s

Define the state variables

ALWAYS INITIALIZE EVERY VARIABLE Enter the infinite loop and check for state

Set up the interrupt handler

Serial #INT_RDA

Timer #INT_TIMER1

Page 23: Centre for Instrumentation, Control and Automation (INCA)

Step 3: State Machine and Interrupts

Three States IDLE – do nothing RECV_DATA

Enter: when serial interrupt received

Exit: when serial data handled

READ_ANALOG Enter: when timer1 overflows

(every 100 ms) Exit: when analog data is

read and PWM updated

RECV_DATA

IDLE

READANALOG

TIMER

RE

AD

_AN

ALO

G

SER

IAL_

DA

TA

RE

AD

+DA

TA

Page 24: Centre for Instrumentation, Control and Automation (INCA)

Step 3: State Machine and Interrupts

The first state machine is composed with this master “on/off” state machine.

STOP: user sends a “stop” command

START: user sends a “start” command

STOPPED STARTED

START

STOP

Page 25: Centre for Instrumentation, Control and Automation (INCA)

Step 4: Handle ANALOG_DATA state

Declare variables to store analog input and PWM output

In the state handler:

Read in the analog voltage (remember it’s a 10-bit number, so we’ll need a 16-bit integer)

Convert to PWM rate (divide by 2, ceil to 500)

Convert to actual voltage (0-5V)

Print on the serial port

Return to IDLE state

Page 26: Centre for Instrumentation, Control and Automation (INCA)

Step 5: Handle Serial Input

Declare variables to store string data from the user

Copy in the get_string() function from input.c

In the state handler: Disable interrupts

Read in a string

Check to see if it matches “start” or “stop”

Change state if necessary

Re-enable interrupts

Change state to IDLE

Page 27: Centre for Instrumentation, Control and Automation (INCA)

References and Links

Presentation, Notes and Code Archive http://www.engr.mun.ca/~msimms/pic/

CCS PIC C Compiler http://www.ccsinfo.com/

CCS PIC C Compiler Manual http://www.ccsinfo.com/piccmanual3.zip

WorkingTex Web Site (lots of examples!) http://www.workingtex.com/htpic/

Bootloader Code (that resides on the PIC) http://www.workingtex.com/htpic/PIC16F87x_and_PIC16F7x_bootloader_v7-40.zip

Bootloader Program (that resides on the PC) http://www.ehl.cz/pic/