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

identifier save it's value in power up but not in RESET

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



Joined: 17 Nov 2011
Posts: 187

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

identifier save it's value in power up but not in RESET
PostPosted: Fri Oct 19, 2012 8:17 am     Reply with quote

Hey,
I'm trying to get digital potentiometer to work so that in power up
it is zeroed and after controlling that digital pot in next reset it must be zero too...

So the problem is that signed int8 identifier must keep it's value
in reset but not in power up ! Is it possible to do so?
(I understand to save identifier to EPROM might be good answer...
but I don't want to use it)
brdgs

-arto-


Last edited by artohautala on Fri Oct 19, 2012 9:12 am; edited 1 time in total
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Fri Oct 19, 2012 8:23 am     Reply with quote

by 'zero' do you mean CENTER of pot - or one LIMIT of pot ??

and NOT store a fixed value in pot's eeprom?
Ttelmah



Joined: 11 Mar 2010
Posts: 19365

View user's profile Send private message

PostPosted: Fri Oct 19, 2012 8:25 am     Reply with quote

Make sure the value is a global variable, _not_ static (which are initialised on boot), and is not initialed by default. So declared as (for example)
Code:

int8 potval;
//must be declared outside all the code


Then at the start of your main code, have:
Code:

if (restart_cause == NORMAL_POWER_UP) {
   potval=0; //clear the pot
}


The variable will retain it's value (provided you have _not_ got #ZERO_RAM specified), for all boot up causes, except normal power on.

Best Wishes
artohautala



Joined: 17 Nov 2011
Posts: 187

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

PostPosted: Fri Oct 19, 2012 8:53 am     Reply with quote

asmboy wrote:
by 'zero' do you mean CENTER of pot - or one LIMIT of pot ??

and NOT store a fixed value in pot's eeprom?


Yes after powerup and after RESET must be zeroed but in my case it's zeroed only after powerup...
Code:


//************************************************************************************************

void ret_offset(void)                     //returns offset to 0 V after reset   
{
      signed int i;
     
      //if positive offset after reset:
     
      //offset_wiper = 40; works OK !
     
      if( offset_wiper < 0){                   //set offset to negative voltage:
           
            for(i = 0; i < offset_wiper; ++i){
            output_high(pot_up_down);          //dig.pot wiper down, makes offset V higher!
            delay_ms(1);
            output_high(pot_inc);              //pulse dig. pot
            delay_ms(1);           
            output_low(pot_cs);                //dig. pot selected
            delay_ms(1);           
            output_low(pot_inc);               //no store ... return to standby
            delay_ms(1);
            output_high(pot_cs);               //dig. pot NOT selected
            delay_ms(1);             
            }

      }
     
      if( offset_wiper > 0){                   //set offset to negative voltage:
           
            for(i = 0; i > offset_wiper; --i){
            output_high(pot_up_down);          //dig.pot wiper down, makes offset V lower!
            delay_ms(1);
            output_high(pot_inc);              //pulse dig. pot
            delay_ms(1);           
            output_low(pot_cs);                //dig. pot selected
            delay_ms(1);           
            output_low(pot_inc);               //no store ... return to standby
            delay_ms(1);
            output_high(pot_cs);               //dig. pot NOT selected
            delay_ms(1);             
            }

     }     

}
more code:

 //+ offset button pressed:
           
            if((x_place > 121) & (x_place < 139) & (y_place > 159) & (y_place < 185)){
           
            delay = 200;
            loop = 0;
           
            do{
           
              if(offset < 2.2 ){               
              offset = offset + 0.04582;
              wr_offset(offset);           
              }
           
            delay_ms(delay);
           
            //offset + button released
             putc(0x6F);         //cmd
             putc(0x04);         //wait until touch activity, 0 = no activity, 2= touch release   
           
            while(!kbhit(LCD))
            delay_us(1);
            x_coord_MSB = getc(LCD); //read character from UART               
            x_coord_LSB = getc(LCD); //read character from UART     
            y_coord_MSB = getc(LCD); //read character from UART               
            y_coord_LSB = getc(LCD); //read character from UART     
             
            if(loop > 5)
            delay = 20;
           
            //set offset towards positive voltage:
           
            output_low(pot_up_down);          //dig.pot wiper down, makes offset V higher!
            delay_ms(1);
            output_high(pot_inc);             //pulse dig. pot
            delay_ms(1);           
            output_low(pot_cs);               //dig. pot selected
            delay_ms(1);           
            output_low(pot_inc);               //no store ... return to standby
            delay_ms(1);
            output_high(pot_cs);               //dig. pot NOT selected
            delay_ms(1);             
             
            x_place = y_place = 0;
           
            ++loop;
            ++offset_wiper;           
            }while(x_coord_LSB!=2);      //result is in x_coord LSB
          }
           
            //- offset button pressed:
           
            if((x_place > 153) & (x_place < 169) & (y_place > 159) & (y_place < 185)){
           
            delay = 200;
            loop = 0;
           
            do{
           
              if(offset > -2.2 )                   
              { offset = offset - 0.04606;
              wr_offset(offset);           
              --offset_wiper;
              }
           
            delay_ms(delay);
           
            //offset - button released
             putc(0x6F);         //cmd
             putc(0x04);         //wait until touch activity, 0 = no activity, 2= touch release   
           
            while(!kbhit(LCD))
            delay_us(1);
            x_coord_MSB = getc(LCD); //read character from UART               
            x_coord_LSB = getc(LCD); //read character from UART     
            y_coord_MSB = getc(LCD); //read character from UART               
            y_coord_LSB = getc(LCD); //read character from UART     
             
            if(loop > 5)
            delay = 20;
           
            //set offset towards negative voltage:
           
            output_high(pot_up_down);          //dig.pot wiper down, makes offset V higher!           
            delay_ms(1);
            output_high(pot_inc);             //pulse dig. pot
            delay_ms(1);           
            output_low(pot_cs);               //dig. pot selected
            delay_ms(1);           
            output_low(pot_inc);               //no store ... return to standby
            delay_ms(1);
            output_high(pot_cs);               //dig. pot NOT selected
            delay_ms(1);             
             
             ++loop;
             --offset_wiper;             
            }while(x_coord_LSB!=2);      //result is in x_coord LSB
          }

and 0ffset_wiper is global identifier:
Code:

//global identifiers:

int8 ints;
int1 high_freq;   
signed int offset_wiper;


brdgs
-arto-
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Fri Oct 19, 2012 9:14 am     Reply with quote

actually you replied with the SAME lack of specificity !!

when you say 'zero- WHICH DO YOU MEAN ????

1- CENTER of POT or
2- ONE of the LIMIT positions ??

ZERO could IMPLY either based on your schematic
and intent

for most pots w/o eeprom ZERO means CENTER ( 50%) position
artohautala



Joined: 17 Nov 2011
Posts: 187

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

PostPosted: Fri Oct 19, 2012 9:31 am     Reply with quote

asmboy wrote:
actually you replied with the SAME lack of specificity !!

when you say 'zero- WHICH DO YOU MEAN ????

1- CENTER of POT or
2- ONE of the LIMIT positions ??

ZERO could IMPLY either based on your schematic
and intent

for most pots w/o eeprom ZERO means CENTER ( 50%) position


Yes thks for your good answer...

so I change that offset voltage in my program for many times ... but after RESET I want offset voltage to be zero Volt...

I'm using x9102p digital pot... it must be pulsed to make wiper low and up...

My idea is to make pulses to dig.pot many times to change offset voltage and after RESET offset voltage must be 0 V again...
but problem is that global identifier signed int offset_wiper ; don't keep it's value after reset ?

Quote:

when you say 'zero- WHICH DO YOU MEAN ????

1- CENTER of POT or

I mean CENTER

Sorry I'm not very wise ... and programming is not any business for me ... but it's very interesting !
I'll be very grateful for your help Smile
best regards

-arto-
artohautala



Joined: 17 Nov 2011
Posts: 187

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

PostPosted: Fri Oct 19, 2012 9:57 am     Reply with quote

Ttelmah wrote:
Make sure the value is a global variable, _not_ static (which are initialised on boot), and is not initialed by default. So declared as (for example)
Code:

int8 potval;
//must be declared outside all the code


Then at the start of your main code, have:
Code:

if (restart_cause == NORMAL_POWER_UP) {
   potval=0; //clear the pot
}


The variable will retain it's value (provided you have _not_ got #ZERO_RAM specified), for all boot up causes, except normal power on.

Best Wishes


Ok,

thanks for your answer Smile

but the problem is that I want to save global identifier after RESET not to zero it...

and after powerup I want to make that global identifier zero...

Is it possible to do so ?

You have helped me so many times ... and I'm very gratefull for that ... Smile

brgds
-arto-
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Fri Oct 19, 2012 10:41 am     Reply with quote

let me direct your attention to:
Quote:

The potentiometer has associated
with it a volatile Wiper Counter Register (WCR) and
four non-volatile Data Registers that can be directly
written to and read by the user. The contents of the
WCR controls the position of the wiper on the resistor
array though the switches. Powerup recalls the
contents of the default data register (DR0) to the WCR.


from the data sheet

a very nice flexible part - and the read back and non volatile storage functions could very likely be put to profitable use in your case .

what you want to accomplish can be done by utilizing features in the pot itself.
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