Posts Tagged “PIC24”

This fix refers to the library version release 12 April 2011. When using an Explorer 16 board and setting the Macro definition of EXPLORER16_100P in MPLab, parts of the library do not pick it up correctly rendering the heartbeat LED and the UART to not work. No compilor error is noticed.

In the file lib\include\pic24_libconfig.h at line 76, change the following section of code:

/** Select one of the hardware platform above to compile for. */
#ifndef HARDWARE_PLATFORM
#define HARDWARE_PLATFORM DEFAULT_DESIGN
#endif
// Verify that a valid hardware platform is selectd
#if (HARDWARE_PLATFORM != EXPLORER16_100P)   && \
    (HARDWARE_PLATFORM != DANGEROUS_WEB)     && \
    (HARDWARE_PLATFORM != STARTER_BOARD_28P) && \
    (HARDWARE_PLATFORM != DEFAULT_DESIGN)
#error Invalid hardware platform selected.
#endif
//@}

Replacing the above code with this code:

/** Select one of the hardware platform above to compile for. */
/* The automated method expects the board is defined in MPLAB
   using Use Project->Build Options-> Project, click on
   the MPLAB C30 tab, and in Macro Definitions click 'Add',
   and add:
      - For the Explorer 16 board - EXPLORER16_100P
      - For the Dangerous Prototypes web server - DANGEROUS_WEB
      - For the Microchip 16-bit 28-pin Starter Board - STARTER_BOARD_28P
   If the above is not set, the code will compile with the default
   of DEFAULT_DESIGN
*/
#ifndef HARDWARE_PLATFORM
#ifdef EXPLORER16_100P
#define HARDWARE_PLATFORM EXPLORER16_100P
#elif STARTER_BOARD_28P
#define HARDWARE_PLATFORM STARTER_BOARD_28P
#elif DANGEROUS_WEB
#define HARDWARE_PLATFORM DANGEROUS_WEB
#else
#define HARDWARE_PLATFORM DEFAULT_DESIGN
#endif
#endif
// Verify that a valid hardware platform is selectd
#if (HARDWARE_PLATFORM != EXPLORER16_100P)   && \
    (HARDWARE_PLATFORM != DANGEROUS_WEB)     && \
    (HARDWARE_PLATFORM != STARTER_BOARD_28P) && \
    (HARDWARE_PLATFORM != DEFAULT_DESIGN)
#error Invalid hardware platform selected.
#endif
//@}

This will now pick up the Macro definition set in MPLab and compile the components of the library needed for the Explorer 16 to function.

So far have tested the above with the Explorer 16, PIC24HJ256GP610A PIM, and the reset.c example from chapter 8 in the Microcontrollers: From Assembly Language to C Using the PIC24 Family.

Comments No Comments »

For those that use the Explorer 16 board and have in the last 12 or so months purchased the PIC24HJ256GP610 PIM from Microchip (part number MA240012) may have noticed it’s got a different chip on it. It now uses the PIC24HJ256GP610A which has some issues when using the library included with the book Microcontrollers: From Assembly Language to C Using the PIC24 Family.

This article shows how I modified the library (12 Apr 2011 version) from http://www.ece.msstate.edu/courses/ece3724/main_pic24/labs/files/pic24_code_examples.zip

In lib\common\pic24_configbits.c at about line 261 fine the line that contains

#if defined(EXPLORER16_100P) && defined(__PIC24HJ256GP610__)

and change it to

#if defined(EXPLORER16_100P) && (defined(__PIC24HJ256GP610__) || defined(__PIC24HJ256GP610A__))

In lib\include\pic24_ports.h at about line 700 you will find the following:

00700 #elif defined(__PIC24HJ256GP610__)
00701
00702 #include "devices/pic24hj256gp610_ports.h"

Change line 700 to:

#elif defined((__PIC24HJ256GP610__) || defined(__PIC24HJ256GP610A__))

The above uses the same .h file for the 610A as for the 610 on the assumption the two are pin compatible in every way. I have not yet found they are not, or any other reason to use a seperate ports file for the chip.

In lib\include\pic24_chip.h at aprox line 336 you will find the following little block of code:

#ifdef __PIC24HJ256GP610__
#define DEV_ID 0x00007B
#define DEV_ID_STR "PIC24HJ256GP610"
#endif

#if (defined(__PIC24HJ64GP206__) || defined(__PIC24HJ64GP210__) || defined(__PIC24HJ64GP506__)
|| defined(__PIC24HJ64GP510__)\
|| defined(__PIC24HJ128GP206__) || defined(__PIC24HJ128GP210__) || defined(__PIC24HJ128GP306__)\
|| defined(__PIC24HJ128GP310__) || defined(__PIC24HJ128GP506__)|| defined(__PIC24HJ128GP510__)\
|| defined(__PIC24HJ256GP206__) || defined(__PIC24HJ256GP210__)|| defined(__PIC24HJ256GP610__))

#define EXPECTED_REVISION1 0x003002
#define EXPECTED_REVISION1_STR "A2"
#define EXPECTED_REVISION2 0x003004
#define EXPECTED_REVISION2_STR "A3"
#define EXPECTED_REVISION3 0x003040
#define EXPECTED_REVISION3_STR "A4"
#endif

Replace this block of code above with:

#ifdef __PIC24HJ256GP610__
#define DEV_ID 0x00007B
#define DEV_ID_STR "PIC24HJ256GP610"
#endif

#ifdef __PIC24HJ256GP610A__
#define DEV_ID 0x0000077B
#define DEV_ID_STR "PIC24HJ256GP610A"
#endif

#if (defined(__PIC24HJ64GP206__) || defined(__PIC24HJ64GP210__) || defined(__PIC24HJ64GP506__)\
|| defined(__PIC24HJ64GP510__)\
|| defined(__PIC24HJ128GP206__) || defined(__PIC24HJ128GP210__) || defined(__PIC24HJ128GP306__)\
|| defined(__PIC24HJ128GP310__) || defined(__PIC24HJ128GP506__)|| defined(__PIC24HJ128GP510__)\
|| defined(__PIC24HJ256GP206__) || defined(__PIC24HJ256GP210__)|| defined(__PIC24HJ256GP610__))
#define EXPECTED_REVISION1 0x003002
#define EXPECTED_REVISION1_STR "A2"
#define EXPECTED_REVISION2 0x003004
#define EXPECTED_REVISION2_STR "A3"
#define EXPECTED_REVISION3 0x003040
#define EXPECTED_REVISION3_STR "A4"
#endif

#if defined(__PIC24HJ256GP610A__)
#define EXPECTED_REVISION1 0x003003
#define EXPECTED_REVISION1_STR "A1"
#endif

I’m not sure what the second last line #define EXPECTED_REVISION1_STR “A1″ should be and have not been able to find it, but the above has been tested using the reset.c example from chapter 8 of the book on the Explorer 16 and is working (provided you have also performed the mod described in this article).

This will update the library to accommodate for the new version of the PIC24HJ256GP610 PIM which now uses a PIC24HJ256GP610A.

Comments No Comments »

Hi again. Onto the next example, this time on page 295 (figure 8.28). The code for this one is called ‘ledtoggle_nofsm’ and it’s in the chap8 folder.

Now that we’ve defined EXPLORER16_100P in the pic24_all.h file, here is a new checklist to use:

  1. Double click on the project file for the exercise your wanting to do. (Make sure you don’t already have MPLAB open or it will complain)
  2. Set the processor type in the menu item Configure – Select Device. The default PIC24 that comes with the Explorer16 is PIC24FJ128GA010.
  3. Remove the linker script from the workspace files viewer under “Linker Scripts” (don’t add anything, MPLAB will manage it for you)
  4. Change from DEBUG to RELEASE in the drop down at top of MPLAB screen
  5. Select your programmer (Programmer – Select Programmer). I use the ICD2
  6. Make required changes to the code (see below for this exercise)
  7. CTRL-F10 to build all
  8. When you get the BUILD SUCCEDED message, program the chip (Programmer – Program)
  9. Click ok the the ICDWarn0046 warning (unless you’ve got sick of this message and clicked the “don’t show me again” like I did)
  10. disconnect the ICD2 when the programmer has completed.

Here is the modification needed for this one to work. Shown here is the code between the #include directive and the start of the main() function.

You should see the very left LED blinking. When you press the right of the 4 buttons, the second from left LED should toggle (light up if it’s the first press). Keep pressing and releasing and observe what happens. You will notice the LED state doesn’t change until the button is released.

#include "pic24_all.h"

/** \file
A program that toggles an LED whenever a pushbutton switch is pressed
and released. Does not use a finite statement approach.
*/

#if defined(EXPLORER16_100P)

/// LED1
#define CONFIG_LED1() CONFIG_RA6_AS_DIG_OUTPUT()
#define LED1  _LATA6    //_LATA6 is port register for RA6
#warning Were using the explorer16 version of the code
/// Switch1 configuration
inline void CONFIG_SW1()  {
  CONFIG_RD13_AS_DIG_INPUT();     //use RD13 for switch input
  ENABLE_RD13_PULLUP();           //enable the pullup 
}
#define SW1              _RD13       //switch state

#else  // not Explorer16

/// LED1
#define CONFIG_LED1() CONFIG_RB14_AS_DIG_OUTPUT()
#define LED1  _LATB14     //led1 state
#warning If your using an Explorer16, this program wont work
/// Switch1 configuration
inline void CONFIG_SW1()  {
  CONFIG_RB13_AS_DIG_INPUT();     //use RB13 for switch input
  ENABLE_RB13_PULLUP();           //enable the pullup 
}
#define SW1              _RB13       //switch state

#endif  // if defined EXPLORER16_100P

#define SW1_PRESSED()   SW1==0  //switch test
#define SW1_RELEASED()  SW1==1  //switch test

int main (void) {
.....

Example 7 which is Figure 8.30 on page 298 is called ledtoggle and is in the chap8 folder. It’s the same changes as example 6 above except the original code has some extra bits that example 6 didn’t have.

#include "pic24_all.h"

/** \file
A program that uses a finite state machine approach for
toggling an LED whenever a pushbutton switch is pressed
and released. Demonstrates the use of debounce delays when
polling a switch input.
*/

#if defined(EXPLORER16_100P)

/// LED1
#define CONFIG_LED1() CONFIG_RA6_AS_DIG_OUTPUT()
#define LED1  _LATA6    //_LATA6 is port register for RA6
#warning Were using the explorer16 version of the code

/// Switch1 configuration
inline void CONFIG_SW1()  {
  CONFIG_RD13_AS_DIG_INPUT();     //use RD13 for switch input
  ENABLE_RD13_PULLUP();           //enable the pullup
}
#define SW1              _RD13       //switch state

#else  // not Explorer16

/// LED1
#define CONFIG_LED1() CONFIG_RB14_AS_DIG_OUTPUT()
#define LED1  _LATB14     //led1 state
#warning If your using an Explorer16, this program wont work

/// Switch1 configuration
inline void CONFIG_SW1()  {
  CONFIG_RB13_AS_DIG_INPUT();     //use RB13 for switch input
  ENABLE_RB13_PULLUP();           //enable the pullup
}
#define SW1              _RB13       //switch state

#endif  // if defined EXPLORER16_100P

#define SW1_PRESSED()   SW1==0  //switch test
#define SW1_RELEASED()  SW1==1  //switch test

typedef enum  {
.....

Comments No Comments »

Well I’m going to run with the PIC24 for the time being and use the Microcontrollers – From Assembly Language to C Using the PIC24 Family book, but jumping to chapter 8 as the assembly language is not what I want at the moment. It’s learning about C and the PIC24. Anyway, as I’m using the Explorer 16 board, I’m going to share the differences in the sample code that should apply. This is the first installment for chapter 8.

My first observation is the author hasn’t identified the file names of the examples in his book and as his book doesn’t include the full text of the samples, it’s a bit of guess work to find them. So I’ll help you along your way. The first example on page 258 is called “ledflash_nomacros” and it’s in the chap8 folder.

One thing you need to do with all the examples when using the Explorer16 board is define the macro EXPLORER16_100P either in the include/pic24_all.h file or it must be added to the MPLAB project (Use Project->Build Options-> Project, click on the MPLAB C30 tab, and in Macro Definitions click ‘Add’, and add EXPLORER16_100P). Where it makes sense, I’m going to use the macro definition to keep the original code in tact while adding specific changes for the Explorer 16 board.

Note: the PIM I’m using is the PIC24FJ128GA010 100pin PIM (Microchip part number MA240011).

So here is the source for main() for this exercise. The rest of the file should remain the same.

void a_delay(void) {
  uint16 u16_i,u16_k;
  // change count values to alter delay
  for (u16_k=1800; --u16_k;) {
    for (u16_i = 1200 ; --u16_i ; );
  }
}
int main(void) {
  configClock();    //clock configuration
  /********** GPIO config **********/
#if defined(EXPLORER16_100P)
// For the explorer 16, we're not going to use the open drain as the LED is
// wired from ground through a current limit resistor direct to pin 91 of
// the PIC24FJ128GA010
  _TRISA6 = 0;         //Config RB15 as output
  _LATA6 = 0;          //RB15 initially low
  while (1) {           //infinite while loop
    a_delay();          //call delay function
    _LATA6 = !_LATA6;  //Toggle LED attached to RB15
  } // end while (1)
#warning using Explorer16 code
#else // not EXPLORER16_100P
#ifdef _ODB15          //PIC24F CPU header files define this instead of ODCB15
  _ODB15 = 1;          //enable open drain
#else
  _ODCB15 = 1;          //enable open drain
#endif
  _TRISB15 = 0;         //Config RB15 as output
  _LATB15 = 0;          //RB15 initially low
  while (1) {           //infinite while loop
    a_delay();          //call delay function
    _LATB15 = !_LATB15;  //Toggle LED attached to RB15
  } // end while (1)
#warning NOT using Explorer16 code
#endif  //#if defined(EXPLORER16_100P)
}

When you open the project file (.mcp) for this exercise you will notice the linker script in the linker scripts section of the files explorer. You need to delete this one. No need to add another one as MPLAB will pick up the right one automatically if you have used the default install.

You will notice in this code segment I’ve added a couple of warning messages for the compiler to see what parts of the code it compiles. You can have them in or take them out. They are there just to make sure the compiler is doing what is expected.

Now if you try and use DEBUG as per the default project, you will see a number of failures and the program wont run. The first will be a pop up message:

  • ICDWarn0046:  Because clock switching is enabled, MPLAB ICD 2 requires the user to cycle target power after a program operation.

And then a message in the output window:

  • ICD0083: Debug:  Unable to enter debug mode.  Please double click this message for more information.

I chose to ignore and change to a RELEASE build to see it working. Do this by following these steps:

  1. Change the DEBUG drop down to RELEASE
  2. Select a programmer (Programmer – Select Programmer). I’m using the MPLAB ICD2 so the rest talks about what happens with the ICD2.
  3. Rebuild all (Ctrl+F10)
  4. When you get the BUILD SUCCEEDED message, program the device (Programmer – Program). You will get the ICDWarn0046 message, just click OK.
  5. When you get the “MPLAB ICD 2 ready for next operation”, disconnect the ICD2 and watch your program run. The LED second from left will flash at about once per second.

Comments No Comments »

I’m on a journey of learning and need to make a decision on which way I go first. When I ordered my Explorer16 board, I also ordered the PIC32MX460F512L PIM, a 32-bit USB capable 100pin chip for the Explorer 16. I also ordered a couple of books from Amazon but they look to be still quite a way off. Anyway I went looking through Books24x7.com to see what they had and came across a book Programming 32-bit Microcontrollers in C: Exploring the PIC32 by Lucio Di Jasio which I’ve started going through. It’s written for people like me who have some understanding of C and of the PIC although very limited. Its broken into days, well so called days. I got to day 10 over this weekend. So very quickly, I think I’m being swayed to the faster 32-bit world at the moment.

So entries here are not as much this weekend as I’ve learnt how to control the LCD using the PMP port (Parallel Master Port), how to use interupts, timers and a few other bits and pieces. Also starting to develop a bit of a library of goodies along the way.

It’s late, and tomorrow is a work day so till later….

Comments No Comments »

This is my Explorer 16 Development Board.

My Explorer 16 Development Board with the 2nd PicTail Plus connector already soldered to the board.

My Explorer 16 development board arrived yesterday so have been playing with it. Initially the example code that came with the PIC24FJ128GA010, doing some basic things like modifying the looping LCD text, then writing my first program to test the LED’s on the board. Had to make sure it all worked. And as usual stuff from Microchip just worked. For those that might have just bought one because they are on the same journey I’m on, begining with the PIC24, here is the source so you can make sure your LED’s are working.

Very basic, just flashes all 8 LED’s on then off about once per second.

#include <p24FJ128GA010.h>

int main()
{
  AD1PCFG = 0xffff; // configure PortA as digital
  TRISA = 0×0000; // configure PortA as output

  while(1)
  {
    // Turn on the LED’s
    LATAbits.LATA0 = 1;
    LATAbits.LATA1 = 1;
    LATAbits.LATA2 = 1;
    LATAbits.LATA3 = 1;
    LATAbits.LATA4 = 1;
    LATAbits.LATA5 = 1;
    LATAbits.LATA6 = 1;
    LATAbits.LATA7 = 1;

 // delay for about 500mSecs
    msDelay(500); 

 // turn of the LED’s
    LATAbits.LATA0 = 0;
    LATAbits.LATA1 = 0;
    LATAbits.LATA2 = 0;
    LATAbits.LATA3 = 0;
    LATAbits.LATA4 = 0;
    LATAbits.LATA5 = 0;
    LATAbits.LATA6 = 0;
    LATAbits.LATA7 = 0;

 // delay for aprox 500mSec
    msDelay(500);
  }
}

int x=0;

void msDelay(int d) // The delay routine
{
  while (d>0)
  {
    for (x=0; x<500; x++)
    {
    }
  d–;
  }
}

Assuming you know how to create a project in MPLab, build it and then program the chip you shouldn’t have any problems.

Next will be re-write this to use a timer and interupt to do the timing releasing the main loop for other things.

 (Note: I’m going to leave this code as is as it reminds me of progress. While it works, there are far more elegant ways of writing this.)

Comments No Comments »

First a little about this blog. It’s a log of my various electronics exploits. It includes a raft of things from simple 555 timer projects to rudder pedal controller using USB to fly Flight Simulator to weather instruments to other “just playing” embedded systems that I build.

Most will include detailed instructions on how to go about building and programming.

Other things I’ll include are full C source code and assembler source code if I use it. My main area of interests in embedded (at the moment) is the Microchip PIC family, mainly the PIC24, dsPIC33 and PIC32 but have done quite a bit in the past with the PIC18 especially the PIC18F4550 and PIC18F2550.

I should point out, I’m not a professional in these fields. It’s a hobby and I continue to learn every day.

Comments No Comments »