Presentation is loading. Please wait.

Presentation is loading. Please wait.

Overview Basic PIC Circuits Development in C using CCS

Similar presentations


Presentation on theme: "Overview Basic PIC Circuits Development in C using CCS"— Presentation transcript:

1 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

2 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

3 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)

4 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 ( which don’t suck. All examples will use CCS code

5 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= ) // 20Mhz oscillator void main() { /* Initialization Code goes here */ while (TRUE) /* Program Code goes here */ }

6 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);

7 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

8 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

9 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

10 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

11 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 V range */ volts = 5.0 * (analog_value / ); 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 */ }

12 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”);

13 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

14 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

15 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

16 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

17 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

18 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

19 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

20 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

21 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

22 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

23 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

24 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

25 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

26 References and Links Presentation, Notes and Code Archive
CCS PIC C Compiler CCS PIC C Compiler Manual WorkingTex Web Site (lots of examples!) Bootloader Code (that resides on the PIC) Bootloader Program (that resides on the PC)


Download ppt "Overview Basic PIC Circuits Development in C using CCS"

Similar presentations


Ads by Google