CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

PIC10F202 wake up on pin change

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
demcast
Guest







PIC10F202 wake up on pin change
PostPosted: Fri Sep 23, 2005 7:01 pm     Reply with quote

How would you 'word' in CCS PIC C a pin change interrupt if there are no available #INT directives for the PIC10F202? I was using the HTech PIC C before and all I had to do was:
Code:
while(1)             //loop forever
{   
   switch(GPIO & 0b00001010)
  {
     case 0b00000000:          //GP3 = LOW
     pulseIROutput();          //GP1 = LOW
     isLowBatt();
     break;
   
     case 0b00000010:          //GP3 = LOW
     pulseIROutput();            //GP1 = HIGH
     break;
   
     case 0b00001000:          //GP3 = HIGH
     isLowBatt();          //GP1 = LOW      
     break;
   
     case 0b00001010:          //GP3 = HIGH
                   //GP1 = HIGH
     //do nothing
   
     SLEEP();

   }//switch
}//while(1)

Everything was worked fine, and to think that was not even the full version. Now that I got the PCWH version of CCS PIC C Compiler, I found that the while(1) and the switch-case combination does not detect the pin change in GP3 (or PIN_B3). Any suggestions?
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Sep 23, 2005 8:20 pm     Reply with quote

Quote:
Everything was worked fine, and to think that was not even the full version

Right, but the compilers have differences in the way they handle
items that are not part of standard C.

You should post a test program because undoubtedly, the problem
will have to do with the pin configuration, or the TRIS, or the way in
which GPIO is declared. By a test program, I mean a program
that contains a main(), an #include <10F202.H>, any #use statements,
and is compilable without errors if dropped into an MPLAB project.

I don't have the PCB compiler, but because pin GP3 is muxed with
the MCLR function, it's likely that the 10F202.H file has a #fuses
setting of NOMCLR in it. If so, you need to add it to your #fuses
statement to configure GP3 as an i/o pin.

Also, in CCS, a SFR register such as GPIO is declared with a #byte
statement. Example:

#byte GPIO = 6
demcast



Joined: 23 Sep 2005
Posts: 2
Location: Southern CA

View user's profile Send private message

PostPosted: Sat Sep 24, 2005 10:37 am     Reply with quote

Thanks for the reply.
PCM programmer wrote:
You should post a test program because undoubtedly, the problem will have to do with the pin configuration, or the TRIS, or the way in which GPIO is declared.

I would if I could, unfortunately it's a proprietory program I'm working on.
Quote:
...because pin GP3 is muxed with the MCLR function, it's likely that the 10F202.H file has a #fuses setting of NOMCLR in it. If so, you need to add it to your #fuses statement to configure GP3 as an i/o pin.

I did, I had as the .h files enumerated:
Code:
#fuses NOMCLR,NOWDT,NOPROTECT
#byte GPIO = 0x06

I was also looking at the list files for both (HTECH and CCS), HTECH had some extra lines that looked like it was looping until the GPIO changed and as soon as it did, it went through the switch. On the CCS, it looked like it was going through the main while loop and somehow missing the changes in the GPIO.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sat Sep 24, 2005 11:56 am     Reply with quote

Quote:
I would if I could, unfortunately it's a proprietory program I'm working on.

Err... a test program with maybe 6 lines inside main() is not proprietary.

But in any case, I only have the PCM and PCH compilers. I don't have
PCW or PCWH (which have PCB), so I can't do any test compilations
so my main method of helping people won't work in your case.
Perhaps someone else can help.
Guest








PostPosted: Sat Sep 24, 2005 1:02 pm     Reply with quote

PCM programmer wrote:
Err... a test program with maybe 6 lines inside main() is not proprietary.

hmm.. I can do that, here's more than 6 lines:
Code:
#include<10F202.h>
#fuses NOMCLR,NOPROTECT,NOWDT
#use delay(clock=4000000)
#byte GPIO=0x06

void pulseIR(void){
   output_high(PIN_B0);
   output_high(PIN_B2);
   delay_ms(10);
   output_low(PIN_B2);
   delay_ms(30);
   delay_ms(100);
   output_low(PIN_B0);
}

void lowBatt(void){
   while(PIN_B1){
      output_high(PIN_B0);
      delay_ms(100);
      output_low(PIN_B0);
      delay_ms(300);
   }
}

void main() {
   SETUP_TIMER_0(RTCC_INTERNAL);
   SET_TRIS_B(0b00001010);    //PIN_B3 & PIN_B1 are input pins

   while(1){
      SLEEP();
      switch(GPIO&0b00001010){
         case 0b00000000:
            pulseIR();
            lowBatt();
            break;
         case 0b00000010:  //PIN_B3 is to pulse the IR
            pulseIR();
            break;
         case 0b00001000: //PIN_B2 is to monitor battery
            lowBatt();
            break;
         case 0b00001010:         
      }
   }
}


Quote:
... I only have the PCM and PCH compilers. I don't have PCW or PCWH (which have PCB)

And that's the problem, most of the examples used #INT directives to control the interrupts. The PIC10F2xx have a Wake-Up-On-Change capability and I'm not sure how to use that in the CCS compiler. Thanks for the reply though.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

Re: PIC10F202 wake up on pin change
PostPosted: Sat Sep 24, 2005 7:09 pm     Reply with quote

I don't know the PIC10 series chips but your problem was a nice challenge to start looking into them.

When executing your problem with the MPLAB simulator in CCS version 3.235 it looks like all registers are configured correctly for a wake-up-on-change:
- TRISIO bit 1 and 3 are set to '1'.
- GPWU = 0 (wake-up-on-pin-change = enabled)

Only the configuration word is totally wrong: Despite your #fuse settings the watchdog is enbled and the GP3 is used as MCLR.

Searching this forum I found the following thread: http://www.ccsinfo.com/forum/viewtopic.php?t=22709
Here is explained that CCS generates the wrong address for the config register.
From the end of my v2.235 hex file:
Code:
:021FFE00EB0FE7
you can see this has still a wrong address (0x1FFE) i.s.o. of the 0x0FFF as defined by Microchip.

Change this to:
Code:
:020FFF00EB0FF6

Or another workaround that I found was to read the *.hex file with the File/Import function in MPLAB, strangely this reads the config word correctly.

I've reported this bug to CCS.


One other remark on your program:
PIC12F20x datasheet chapter 9.9.2 wrote:
Caution: Right before entering Sleep,
read the input pins. When in Sleep, wakeup
occurs when the values at the pins
change from the state they were in at the
last reading. If a wake-up on change
occurs and the pins are not read before reentering
Sleep, a wake-up will occur
immediately even if no pins change while
in Sleep mode.
Assuming the state of your pins is 0b00001010 before entering sleep the first time your example program will fail by entering an infinite loop.
demcast



Joined: 23 Sep 2005
Posts: 2
Location: Southern CA

View user's profile Send private message

Re: PIC10F202 wake up on pin change
PostPosted: Mon Sep 26, 2005 10:14 am     Reply with quote

ckielstra wrote:
Searching this forum I found the following thread: http://www.ccsinfo.com/forum/viewtopic.php?t=22709
I'll check into this one, and by the version number, did you mean the CCS IDE or the MPLAB IDE?
Quote:
Right before entering Sleep, read the input pins. When in Sleep, wakeup occurs when the values at the pins change from the state they were in at the last reading.
I think that's it! That's the missing asm part in the CCS list file. In the HTech list file, there was this loop that kept running and kept comparing to the GPIO register. Everytime it did, it MOVWF to 0xa, see below:
Code:
MOVF 0x6, W
ANDLW 0xa
MOVWF 0xa
CLRF 0xb
MOVF 0xb, W
BTFSC 0x3, 0x2
GOTO 0x1c0       //start of the switch
GOTO 0x1ca       // start of this loop

Now, how would I be able to make CCS to do this loop? I could probably use a while loop before the switch. At any rate, thanks for the reply, it actually help me move another step forward. Smile
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group