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 support@ccsinfo.com

wake-up PIC12f615 don't Work
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

wake-up PIC12f615 don't Work
PostPosted: Sat Jan 14, 2017 6:10 am     Reply with quote

After putting the micro in sleep I would like to wake him up (Wake-up from Sleep on Pin Change), but I can not.
Is there someone who has already had this problem ?
temtronic



Joined: 01 Jul 2010
Posts: 9199
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Jan 14, 2017 11:17 am     Reply with quote

You need to show us your program ! We cannot say WHY it doesn't work, only guess as to the 30 or 40 things possibly wrong....
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

PostPosted: Sat Jan 14, 2017 2:17 pm     Reply with quote

Code:
#FUSES
#FUSES INTRC                    //Internal RC Osc
#FUSES PUT                      //Power Up Timer
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IOSC8                    //INTOSC speed 8MHz
#FUSES NOBROWNOUT               //No brownout reset
//#FUSES NOWRT                  //Program memory not write protected

#use delay(int=8000000,RESTART_WDT)

#use pwm(CCP1,TIMER=2,FREQUENCY=20000,DUTY=100)

#ZERO_RAM                       //   Allo Start_UP azzera la RAM
#CASE                           //   Case sensitive ( As s'à may )

#WORD OPTION_REG = 0x81
#bit GPPU =   OPTION_REG.7

#WORD WPU_REG = 0x95
#BIT WPU5 = WPU_REG.5



/**
 *  Legge il sensore di Hall
 *  antirimbalzo presente
 */

uint8 old_HALL=0;

uint8 stato=1;

void read_Puls(void)
{
   if(READ_HALL==0){
     if(old_HALL==1){
         if(stato==0){
           set_pwm1_duty(100);  // OFF
           output_high(PIN_A5);
           stato=1;
           delay_ms(100);
           enable_interrupts(GLOBAL);

           sleep();
           }
         else if(stato==1){
           set_pwm1_duty(0);      // 100%
           stato=2;
           delay_ms(100);
           }
         else if(stato==2){
           set_pwm1_duty(50);      // 50%
           stato=0;
           delay_ms(100);
           }
         old_HALL=0;
        }
      }
     else{
         old_HALL=1;
         }

}


void main()
{

GPPU=1;

WPU5=0;



Set_PORT();          //   Init delle porte

while(1)
  {
   //set_pwm1_duty(20);
  read_Puls();
  }

}

/**
 *  Inizializza tutte le periferiche PORTE di sistema
 *
 *   @param
 *   @return
 */
void Set_PORT(void)
{
  set_tris_a (0x00 // porta A (0 = outoput; 1 = input)
                |   0x01 // 0 - RA0 - SEL_2
                |   0x02 // 1 - RA1 - SEL_3
        //      |   0x04 // 2 - RA2 - PWM
                |   0x08 // 3 - RA3 -
                |   0x10 // 4 - RA4 -  SEL_1
                |   0x20 // 5 - RA5 -  HALL
        //      |   0x40 // 6 - RA6 -
        //      |   0x80 // 7 - RA7 -
                   );
  output_a (0x00// porta A  (Set=1 or 0)
        //       | 0x01 // 0 - RA0 -
        //       | 0x02 // 1 - RA1 -
        //        | 0x04 // 2 - RA2 -  YELLOW
        //       | 0x08 // 3 - RA3 -
        //        | 0x10 // 4 - RA4 -  GREEN
        //        | 0x20 // 5 - RA5 -  BLU
        //       | 0x40 // 6 - RA6 -
        //       | 0x80 // 7 - RA7 -
                   );

  port_a_pullups(0x37);

  enable_interrupts(INT_RA|INT_RA5);
  enable_interrupts(GLOBAL);


}
Ttelmah



Joined: 11 Mar 2010
Posts: 19441

View user's profile Send private message

PostPosted: Sat Jan 14, 2017 2:33 pm     Reply with quote

1) Learn to use the code buttons.
2) When debugging you should simplify down to just the part that does not work.
3) You are setting 'TRIS' to make all the pins outputs. Not going to get an interrupt on change with that.....
4) You don't want to 'enable_interrupts(GLOBAL)' for a wake up.

You must _never_ have both an interrupt enabled, and the global enable set without an interrupt handler.
To wake, disable_interrupts(GLOBAL); then enable the interrupt you want to wake (just INT_RA5). You don't need to have INT_RA as well. I don't see your 'main' anywhere.

So:
Code:

    int1 dummy;
    output_float(PIN_A5); //set A5 tris to 1
    disable_interrupts(GLOBAL); //so no handler is needed
    dummy=input(PIN_A5); //ensure this pin is read
    clear_interrupts(INT_RA); //This is where 'RA' without the mask is used
    enable_interrupts(INT_RA5); //now enable on the one pin
    sleep;
    delay_cycles(1); //The instruction after a sleep should be a NOP
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

thank Ttelmah
PostPosted: Sun Jan 15, 2017 3:48 am     Reply with quote

Thank you.
I plugged in my code your suggestion and now I can wake up the microcontroller correctly. I had made life much more difficult, and not being able to debug on a Micro so small was really hard to find a solution.
Thank you.

Code:
delay_ms(100);
clear_interrupt(INT_RA);         //This is where 'RA' without the mask is used
enable_interrupts(INT_RA5);       //now enable on the one pin
delay_ms(100);
sleep();
delay_cycles(1); //The instruction after a sleep should be a NOP
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

pic goes in sleep only the first time
PostPosted: Tue Jan 17, 2017 2:08 am     Reply with quote

Ok now I have another problem, the pic goes to sleep only the first time, probably something prevents him from setting the condition of subsequent sleep, but do not know what can be.
temtronic



Joined: 01 Jul 2010
Posts: 9199
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Jan 17, 2017 8:23 am     Reply with quote

please post your NEW program so we can debug for you..
Ttelmah



Joined: 11 Mar 2010
Posts: 19441

View user's profile Send private message

PostPosted: Tue Jan 17, 2017 9:50 am     Reply with quote

Obvious thing glaring in what he posted, is he removed the 'read' of the port.

The interrupt cannot be cleared, until the port is read. This is why I put a dummy read before I clear the interrupt, so the interrupt can be cleared.....
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

Sleep only when you first turn on
PostPosted: Tue Jan 17, 2017 11:39 am     Reply with quote

Last night I made several tests but unfortunately I'm not going into sleep wineskin the first time


Code:

void main()
{
Set_PORT();          //   Init delle porte

while(1)
  {
   if(Stato_Sleep==1){
    disable_interrupts(GLOBAL);  //so no handler is needed
    temp8=input(PIN_A5);         //ensure this pin is read
    clear_interrupt(INT_RA);     //This is where 'RA' without the mask is used
    enable_interrupts(INT_RA5);  //now enable on the one pin

    sleep();
    delay_cycles(1); //The instruction after a sleep should be a NOP
    Stato_Sleep=0;
   }
  read_Puls();
  }

}

/**
 *  Inizializza tutte le periferiche PORTE di sistema
 *
 *   @param
 *   @return
 */
void Set_PORT(void)
{


  set_tris_a (0x00 // porta A (0 = outoput; 1 = input)
        //      |   0x01 // 0 - RA0 - SEL_2
        //      |   0x02 // 1 - RA1 - SEL_3
        //      |   0x04 // 2 - RA2 - PWM
        //      |   0x08 // 3 - RA3 -
        //      |   0x10 // 4 - RA4 -  SEL_1
                |   0x20 // 5 - RA5 -  HALL
        //      |   0x40 // 6 - RA6 -
        //      |   0x80 // 7 - RA7 -
                   );
  output_a (0x00// porta A  (Set=1 or 0)
        //       | 0x01 // 0 - RA0 -
        //       | 0x02 // 1 - RA1 -
        //       | 0x04 // 2 - RA2 -
        //       | 0x08 // 3 - RA3 -
        //       | 0x10 // 4 - RA4 -
        //       | 0x20 // 5 - RA5 -
        //       | 0x40 // 6 - RA6 -
        //       | 0x80 // 7 - RA7 -
                   );


  output_float(PIN_A4); //set A5 tris to 1
  port_a_pullups(PIN_A4);
  port_a_pullups(PIN_A5);
}



uint8 Stato_Sleep=0;

/**
 *  Legge il sensore di Hall
 *  antirimbalzo presente
 */

uint8 old_HALL=0;

uint8 stato=1;

void read_Puls(void)
{
   if(READ_HALL==0){
     if(old_HALL==1){
         if(stato==0){
           set_pwm1_duty(100);  // SPENTO


           stato=1;
           delay_ms(200);
           Stato_Sleep=1;
/*
          disable_interrupts(GLOBAL); //so no handler is needed
          clear_interrupt(INT_RA); //This is where 'RA' without the mask is used
          enable_interrupts(INT_RA5); //now enable on the one pin

          sleep();
          delay_cycles(1); //The instruction after a sleep should be a NOP
*/
           }
         else if(stato==1){

           set_pwm1_duty(0);      // 100%
           stato=2;
           delay_ms(100);
           }
         else if(stato==2){
           set_pwm1_duty(50);      // 50%
           stato=0;
           delay_ms(100);
           }
         old_HALL=0;
        }
      }
     else{
         old_HALL=1;
         }

}
Ttelmah



Joined: 11 Mar 2010
Posts: 19441

View user's profile Send private message

PostPosted: Tue Jan 17, 2017 11:59 am     Reply with quote

We are back to Port A5 having it's TRIS set as an output again.....


output_float(PIN_A4); //set A5 tris to 1

Er. You are setting A4 not A5. Remark is wrong for what it does....
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

PostPosted: Tue Jan 17, 2017 2:25 pm     Reply with quote

I made the correction, but still is not working, I think he's escaping me something


output_float(PIN_A5); //set A5 tris to 1
port_a_pullups(PIN_A4);
port_a_pullups(PIN_A5);
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jan 17, 2017 3:56 pm     Reply with quote

Quote:
port_a_pullups(PIN_A4);
port_a_pullups(PIN_A5);

That's not the correct way to use that function. You have not read the
12F615 data sheet, and you have not read the CCS manual for
port_a_pullups(). You're just inventing parameters.

Read this section in the PIC data sheet:
Quote:
5.2.2 WEAK PULL-UPS

http://ww1.microchip.com/downloads/en/DeviceDoc/41302D.pdf


Read this section in the CCS manual:
Quote:
port_x_pullups ( )

http://www.ccsinfo.com/downloads/ccs_c_manual.pdf
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

PostPosted: Tue Jan 17, 2017 4:52 pm     Reply with quote

The first thing I did was read the data sheet of the pic12f615 and in fact in my first post I set the parameters as indicated by the text

#WORD OPTION_REG = 0x81
#bit GPPU = OPTION_REG.7

#WORD WPU_REG = 0x95
#BIT WPU5 = WPU_REG.5

and I set the two parameters, but without good results

Then I used the tools made available to the development tool
pcwwiz.exe

where I set the processor and set the pull-up and I simply copied the code, trusting the tools
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jan 17, 2017 5:32 pm     Reply with quote

You didn't read the CCS manual. There is a function to do this:
Code:
port_a_pullups(0x30);  // Enable pullups on pins GP4 and GP5


It produces this code in the .LST file:
Code:
........ port_a_pullups(0x30);
0010:  MOVLW  30
0011:  BSF    STATUS.RP0
0012:  MOVWF  WPU
0013:  BCF    OPTION_REG.GPPU


You have to read the CCS manual and the data sheet.
Roberto da Rivoli



Joined: 09 Feb 2004
Posts: 37
Location: TURIN -Italy-

View user's profile Send private message Send e-mail

last test sleep
PostPosted: Wed Jan 18, 2017 12:20 pm     Reply with quote

I'm sorry but they are very demoralized, even with the latter nothing definitive test. Unfortunately my compiler generates different code.


Code:
....................  // output_float(PIN_A5); //set A5 tris to 1
....................   port_a_pullups(0x20);  // Enable pullups on pins GP5
000A:  BSF    03.5
000B:  MOVWF  15
000C:  BCF    01.7
000D:  BCF    03.5
000E:  GOTO   079 (RETURN)
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2, 3  Next
Page 1 of 3

 
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