Assuming that each of the hours and minutes are bytes and PWM value is a word, the write command will fill up 6 bytes on each pass. So, the code would become
OR you could also do thisCode:address =$50 for counterd = 0 to 15 write (address + (counterD*6)),lightsetHR(counterD),lightsetMN(counterD),lighto ffHR(counterD),lightoffMN(counterD),fadeset(counte rD) next counterD
Code:address =$50 for counterd = 0 to 15 write (address),lightsetHR(counterD),lightsetMN(counterD),lighto ffHR(counterD),lightoffMN(counterD),fadeset(counte rD) address = address+6 ' account for the data already filled into the storage next counterD
You spoke in your original post of an "easier way", while this is not exactly what you asked, I find it easier and so offer...
Keeping track of hours and minutes separately is unnecessary. For me, over and again, I have determined that a word value representing the minutes since midnight (a value of 0 to 1440) is clearer and easier to manipulate. Switching to hours and minutes is as easy as /60 for hours and MOD 60 for minutes. All calculations loose the clumsiness of handling hours and minutes separately and determining if dates change when subtracting or adding periods is less complicated.
It doesn't save any actual eeprom space, but it could reduce the typing by changing "lightsetHR(counterD),lightsetMN(counterD)," to SetTime(counterD) and "lightoffHR(counterD),lightoffMN(counterD)," to OnOffTime(counterD)
... just a thought.
I agree and that's the way I do the matching of the if then statements. The code reads the RTC, and the end result is placed in two variables, TimeH and TimeM. Then the TimeH is multiplied by 60 and added to TimeM and placed in a variable Counter1. I then have a similar statement CH1_on_Time = (lightsetHR1*60)+lightsetMN1 to convert the values in the above statement which are then placed in a variable, and then it's a simple matter to do the actions required depending on if the two variables match or one is < or > than other.
Oh and just to update this thread, and for reference for anyone in the future who may stumble on this thread...
With the the matching WRITE command, works a treatCode:address =$50 for counterd = 0 to 15 read (address),lightsetHR(counterD),lightsetMN(counterD),lightoffHR(counterD),lightoffMN(counterD),fadeset.lowbyte(counterD),fadeset.highbyte(counterD) address = address+6 ' account for the data already filled into the storage next counterD- thanks Jerson ;-)
Guys, I need a little help in a similar vein.
I'm working on a slightly different program using similar variables only this time I save 48 word variables, which results in 96 lines of code for both WRITE and READ statements. The word variables are
CH1_Max, CH1_on_Time, CH1_off_Time, so I have
Rather than have 96 lines of code is there a simple way to do this with a FOR / NEXT loop similar to aboveCode:read 40,CH1_on_Time.lowbyte read 41,CH1_on_Time.highbyte read 42,CH2_on_Time.lowbyte read 43,Ch2_on_Time.highbyte
I did try
But this just threw up errors when I tried compiling (I'm using PBP 2.60c)Code:for n = 8 to 38 step 2 READ n, ch(n)_max.lowbyte next n for n = 9 to 39 step 2 READ n, ch(n)_max.highbyte next n
Any suggestions ?
the "EXT" modifier make this a breeze , see if you can follow this example
to saveCode:amps Var Word ext ;chg mA volts Var Word ext ;chg V kp var word ext kd var word ext ki var word ext f_0 var byte ext f_1 var byte ext f_2 var byte ext f_3 var byte ext setpoint var word ext ;out volts cl var word ext ;current limit flgs VAR byte ext drive var word ext ;current pwm value a_cal var word ext v_cal var word ext bat_r Var byte ext ;bits 0:3 is batt being charged , 4:7 batt connected flg data_blk var byte[26] asm volts = _data_blk ;01 amps = _data_blk+2 ;23 flgs = _data_blk+4 ;4 drive = _data_blk+5 ; 56 F_0 = _data_blk+7 F_1 = _data_blk+8 F_2 = _data_blk+9 F_3 = _data_blk+10 setpoint = _data_blk+11 ;1112 bat_r = _data_blk+13 ki = _data_blk+14 ;1415 cl = _data_blk+16 kp = _data_blk+18 kd = _data_blk+20 a_cal = _data_blk+22 v_cal = _data_blk+24 ;2425 endasm
to readCode:for n =0 to 25 write n, [data_blk[n]] next n
to just save vars f_0 to f_3Code:for n =0 to 25 read n, [data_blk[n]] next n
or even betterCode:for n =7 to 10 write n, [data_blk[n]] next n
Code:for n =0 to 3 write n, [f_0[n]] next n
Last edited by richard; - 7th March 2016 at 22:47.
Richard,
what is the difference in using EXT ant this one?
IoannisCode:data_blk var byte [25] f_0 var data_blk[7]
ioannis
data_blk var byte [25] this reserves 25 bytes for our data
f_0 var data_blk[7] would definitely point to the correct byte but if you add or delete or rearrange or modify any vars in the array you have to go back and make sure the index is corrected , its easy to make a mistake and forget
whereas :-
using
f_0 var byte ext the assembler does all the work and we still get an index-able byte sized pointer to use
Bookmarks