1 / 27

Term 8 Electrical and Computer Engineering Project Course January 2002

Term 8 Electrical and Computer Engineering Project Course January 2002. PIC Development, The Easy Way. Mark Simms Steven Taylor. 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.

azra
Download Presentation

Term 8 Electrical and Computer Engineering Project Course January 2002

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Term 8 Electrical and Computer Engineering Project CourseJanuary 2002 PIC Development, The Easy Way Mark Simms Steven Taylor

  2. 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

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

  4. 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)

  5. 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

  6. 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 */ } }

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

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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 */ }

  13. 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”);

  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 – 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

  16. 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

  17. 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

  18. 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

  19. 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

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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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/

More Related