Select...Case question

giuseppe

Member
So if any of you guys read the thread I recently made here --> http://www.picaxeforum.co.uk/showthread.php?20787-linear-function-with-decimals&p=199690&posted=1#post199690 I said that I used Select...Case to make a sort of table to acquire a value 0-99. Now the reason why I didn't go beyond was because I had a problem with Select...Case. Here is my code I used:

Code:
'running @ 32MHz
Sample_VSS_Signal:
count freqin,1000,freqdata	'sample VSS signal for eighth of second
let freqdata = freqdata * 8 	'multiply by eight to get the frequency

Lookup_Car_Speed:
select case freqdata
	case 0 to 10
	 let speed = 0
	case 11 to 58 
	 let speed = 1
	case 59 to 107
	 let speed = 2
	case 108 to 155
	 let speed = 3
	case 156 to 204
	 let speed = 4 
	case 205 to 253
	 let speed = 5
	case 254 to 301
	 let speed = 6
	case 302 to 350
	 let speed = 7
	case 351 to 398
	 let speed = 8
	case 399 to 447
	 let speed = 9
	case 448 to 495
	 let speed = 10
	case 496 to 544
	 let speed = 11
	case 545 to 592
	 let speed = 12
	case 593 to 641 
	 let speed = 13
	case 642 to 689
	 let speed = 14
	case 690 to 738
	 let speed = 15
	case 739 to 787
	 let speed = 16 
	case 788 to 835
	 let speed = 17
	case 836 to 884
	 let speed = 18
	case 885 to 932
	 let speed = 19
	case 933 to 981
	 let speed = 20
	case 982 to 1029
	 let speed = 21
	case 1030 to 1078
	 let speed = 22
	case 1079 to 1126
	 let speed = 23
	case 1127 to 1175 
	 let speed = 24
	case 1176 to 1223
	 let speed = 25
	case 1224 to 1272
	 let speed = 26
	case 1273 to 1321
	 let speed = 27
	case 1322 to 1369
	 let speed = 28
	case 1370 to 1418
	 let speed = 29
	case 1419 to 1466
	 let speed = 30
	case 1467 to 1515
	 let speed = 31
	case 1516 to 1563
	 let speed = 32
	case 1564 to 1612
	 let speed = 33
	case 1613 to 1660
	 let speed = 34
	case 1661 to 1709
	 let speed = 35
	case 1710 to 1757 
	 let speed = 36
	case 1758 to 1806
	 let speed = 37
	case 1807 to 1855
	 let speed = 38
	case 1856 to 1903
	 let speed = 39
	case 1904 to 1952
	 let speed = 40
	case 1953 to 2000
	 let speed = 41
	case 2001 to 2049
	 let speed = 42
	case 2050 to 2097
	 let speed = 43
	case 2098 to 2146
	 let speed = 44
	case 2147 to 2194
	 let speed = 45
	case 2195 to 2243
	 let speed = 46
	case 2244 to 2291
	 let speed = 47
	case 2292 to 2340
	 let speed = 48
	case 2341 to 2388
	 let speed = 49
	case 2388 to 2437
	 let speed = 50
	case 2438 to 2486
	 let speed = 51
	case 2487 to 2534
	 let speed = 52
	case 2535 to 2583
	 let speed = 53
	case 2584 to 2631
	 let speed = 54
	case 2632 to 2680
	 let speed = 55
	case 2681 to 2728
	 let speed = 56
	case 2729 to 2777
	 let speed = 57
	case 2778 to 2825
	 let speed = 58
	case 2826 to 2874
	 let speed = 59
	case 2875 to 2922
	 let speed = 60 
	case 2923 to 2971
  	 let speed = 61
	case 2972 to 3020
 	 let speed = 62
	case 3021 to 3068	
	 let speed = 63
	case 3069 to 3117	
	 let speed = 64
	case 3118 to 3165	
	 let speed = 65
	case 3166 to 3214	
	 let speed = 66
	case 3215 to 3262	
	 let speed = 67
	case 3263 to 3311	
	 let speed = 68
	case 3312 to 3359	
	 let speed = 69
	case 3360 to 3408	
	 let speed = 70
	case 3409 to 3456	
	 let speed = 71		
	case 3457 to 3505	
 	 let speed = 72
	case 3506 to 3554	
	 let speed = 73
	case 3555 to 3602	
	 let speed = 74
	case 3603 to 3651	
	 let speed = 75
	case 3652 to 3699	
	 let speed = 76
	case 3700 to 3748	
	 let speed = 77
	case 3749 to 3796	
	 let speed = 78
	case 3797 to 3845	
	 let speed = 79
	case 3846 to 3893	
	 let speed = 80
	case 3894 to 3942	
	 let speed = 81
	case 3943 to 3990	
	 let speed = 82
	case 3991 to 4039	
	 let speed = 83
	case 4040 to 4088	
	 let speed = 84
	case 4089 to 4136	
	 let speed = 85
	case 4137 to 4185	
	 let speed = 86
	case 4186 to 4233
 	 let speed = 87
	case 4234 to 4282
 	 let speed = 88
	case 4283 to 4330
 	 let speed = 89
	case 4331 to 4379
 	 let speed = 90		
	case 4380 to 4427
	 let speed = 91
	case 4428 to 4476
	 let speed = 92
	case 4477 to 4524
	 let speed = 93
	case 4525 to 4573
	 let speed = 94
	case 4574 to 4622
	 let speed = 95
	case 4623 to 4670
	 let speed = 96
	case 4671 to 4719
	 let speed = 97
	case 4720 to 4767
	 let speed = 98
	case 4720 to 4767
	 let speed = 99
endselect
goto Sample_VSS_Signal
I have here are 100 cases (200 lines of code between the "select case freqin" and "endselect" lines).

However when I tried to further add on to this code block by putting one more case:
Code:
case 4817 to 4864
 let speed = 100
I get the syntax error:
endselect
^

Error: Endselect without Case
It seems as if the editor does not "see" any of the cases. The manual does not say there is a limit to the number of cases you can have so I don't think this is the problem. Is this a glitch? or am I missing something?
 
Last edited:

eclectic

Moderator
Remove the duplicate 99 line,
than add the new one.

Code:
 case 4671 to 4719
  let speed = 97
 case 4720 to 4767
  let speed = 98
 ;case 4720 to 4767 *************
  ;let speed = 99  ****
  
 
  
  case 4817 to 4864
  let speed = 100
 endselect
 
goto Sample_VSS_Signal
e
 

giuseppe

Member
Remove the duplicate 99 line,
than add the new one.

Code:
 case 4671 to 4719
  let speed = 97
 case 4720 to 4767
  let speed = 98
 ;case 4720 to 4767 *************
  ;let speed = 99  ****
  
 
  
  case 4817 to 4864
  let speed = 100
 endselect
 
goto Sample_VSS_Signal
e
Ah yes, sorry, I copied it from editor wrong, I now have (towards the end):
Code:
case 4768 to 4816
 let speed = 99
case 4817 to 4864
 let speed = 100
... but even with no duplicates I still get the error.
 

giuseppe

Member
Still fails on my end. I copied and pasted relevant parts of the program into a blank editor. Here it is:
Code:
#picaxe 18m2

symbol speed 	=	w0
symbol freqdata	=	w1
symbol freqin	=	b.5	'pin that samples the frequency of the VSS signal

'running @ 32MHz
Sample_VSS_Signal:
count freqin,1000,freqdata	'sample VSS signal for eight of second
let freqdata = freqdata * 8 	'multiply by eighth to get the frequency

Lookup_Car_Speed:
select case freqdata
	case 0 to 10
	 let speed = 0
	case 11 to 58 
	 let speed = 1
	case 59 to 107
	 let speed = 2
	case 108 to 155
	 let speed = 3
	case 156 to 204
	 let speed = 4 
	case 205 to 253
	 let speed = 5
	case 254 to 301
	 let speed = 6
	case 302 to 350
	 let speed = 7
	case 351 to 398
	 let speed = 8
	case 399 to 447
	 let speed = 9
	case 448 to 495
	 let speed = 10
	case 496 to 544
	 let speed = 11
	case 545 to 592
	 let speed = 12
	case 593 to 641 
	 let speed = 13
	case 642 to 689
	 let speed = 14
	case 690 to 738
	 let speed = 15
	case 739 to 787
	 let speed = 16 
	case 788 to 835
	 let speed = 17
	case 836 to 884
	 let speed = 18
	case 885 to 932
	 let speed = 19
	case 933 to 981
	 let speed = 20
	case 982 to 1029
	 let speed = 21
	case 1030 to 1078
	 let speed = 22
	case 1079 to 1126
	 let speed = 23
	case 1127 to 1175 
	 let speed = 24
	case 1176 to 1223
	 let speed = 25
	case 1224 to 1272
	 let speed = 26
	case 1273 to 1321
	 let speed = 27
	case 1322 to 1369
	 let speed = 28
	case 1370 to 1418
	 let speed = 29
	case 1419 to 1466
	 let speed = 30
	case 1467 to 1515
	 let speed = 31
	case 1516 to 1563
	 let speed = 32
	case 1564 to 1612
	 let speed = 33
	case 1613 to 1660
	 let speed = 34
	case 1661 to 1709
	 let speed = 35
	case 1710 to 1757 
	 let speed = 36
	case 1758 to 1806
	 let speed = 37
	case 1807 to 1855
	 let speed = 38
	case 1856 to 1903
	 let speed = 39
	case 1904 to 1952
	 let speed = 40
	case 1953 to 2000
	 let speed = 41
	case 2001 to 2049
	 let speed = 42
	case 2050 to 2097
	 let speed = 43
	case 2098 to 2146
	 let speed = 44
	case 2147 to 2194
	 let speed = 45
	case 2195 to 2243
	 let speed = 46
	case 2244 to 2291
	 let speed = 47
	case 2292 to 2340
	 let speed = 48
	case 2341 to 2388
	 let speed = 49
	case 2388 to 2437
	 let speed = 50
	case 2438 to 2486
	 let speed = 51
	case 2487 to 2534
	 let speed = 52
	case 2535 to 2583
	 let speed = 53
	case 2584 to 2631
	 let speed = 54
	case 2632 to 2680
	 let speed = 55
	case 2681 to 2728
	 let speed = 56
	case 2729 to 2777
	 let speed = 57
	case 2778 to 2825
	 let speed = 58
	case 2826 to 2874
	 let speed = 59
	case 2875 to 2922
	 let speed = 60 
	case 2923 to 2971
  	 let speed = 61
	case 2972 to 3020
 	 let speed = 62
	case 3021 to 3068	
	 let speed = 63
	case 3069 to 3117	
	 let speed = 64
	case 3118 to 3165	
	 let speed = 65
	case 3166 to 3214	
	 let speed = 66
	case 3215 to 3262	
	 let speed = 67
	case 3263 to 3311	
	 let speed = 68
	case 3312 to 3359	
	 let speed = 69
	case 3360 to 3408	
	 let speed = 70
	case 3409 to 3456	
	 let speed = 71		
	case 3457 to 3505	
 	 let speed = 72
	case 3506 to 3554	
	 let speed = 73
	case 3555 to 3602	
	 let speed = 74
	case 3603 to 3651	
	 let speed = 75
	case 3652 to 3699	
	 let speed = 76
	case 3700 to 3748	
	 let speed = 77
	case 3749 to 3796	
	 let speed = 78
	case 3797 to 3845	
	 let speed = 79
	case 3846 to 3893	
	 let speed = 80
	case 3894 to 3942	
	 let speed = 81
	case 3943 to 3990	
	 let speed = 82
	case 3991 to 4039	
	 let speed = 83
	case 4040 to 4088	
	 let speed = 84
	case 4089 to 4136	
	 let speed = 85
	case 4137 to 4185	
	 let speed = 86
	case 4186 to 4233
 	 let speed = 87
	case 4234 to 4282
 	 let speed = 88
	case 4283 to 4330
 	 let speed = 89
	case 4331 to 4379
 	 let speed = 90		
	case 4380 to 4427
	 let speed = 91
	case 4428 to 4476
	 let speed = 92
	case 4477 to 4524
	 let speed = 93
	case 4525 to 4573
	 let speed = 94
	case 4574 to 4622
	 let speed = 95
	case 4623 to 4670
	 let speed = 96
	case 4671 to 4719
	 let speed = 97
	case 4720 to 4767
	 let speed = 98
	case 4768 to 4816
	 let speed = 99
	case 4817 to 4864
	 let speed = 100
endselect
goto Sample_VSS_Signal
This is all that I have being checked. Want to give this block a go?
 

giuseppe

Member
Sorry, I was called away.

It does not pass syntax if the full 100 are used.

e
Sooooo doesn't this seem odd to you? I mean, I guess it must be something with the select...case command. Lol I surely can't be the first person to try so many cases...?
 

eclectic

Moderator
Re post #8.

Syntax check = "Endselect without case"

Removing any single Case - Let pair

passes.

I await greater knowledge.

e
 

hippy

Ex-Staff (retired)
I guess it must be something with the select...case command. Lol I surely can't be the first person to try so many cases...?
You could be, or that particular combination of case selections.

Add before the ENDSELECT ...

case > 4864
let speed = 100

And in my test version of your code I get a "memory location already used" so the compiler is possibly choking on something in that situation.

We will investigate that but if you are over the code size ( and I get the same "memory location already used" error for 20X2 ) you are out of luck without a code change.

The "CASE x To y" options have quite a lot of code hidden underneath them but you can save a lot of that by moving to "CASE <= y" as it's in ascending order. Haven't tested that to see if it is small enough to compile.
 

giuseppe

Member
This might be a worthwhile observation... When I split up the select...case list into two pieces, as such:

Code:
Lookup_Car_Speed:
select case freqdata
	case 0 to 10
	 let speed = 0
	case 11 to 58 
	 let speed = 1
	case 59 to 107
	 let speed = 2
	case 108 to 155
	 let speed = 3
	case 156 to 204
	 let speed = 4 
	case 205 to 253
	 let speed = 5
	case 254 to 301
	 let speed = 6
	case 302 to 350
	 let speed = 7
	case 351 to 398
	 let speed = 8
	case 399 to 447
	 let speed = 9
	case 448 to 495
	 let speed = 10
	case 496 to 544
	 let speed = 11
	case 545 to 592
	 let speed = 12
	case 593 to 641 
	 let speed = 13
	case 642 to 689
	 let speed = 14
	case 690 to 738
	 let speed = 15
	case 739 to 787
	 let speed = 16 
	case 788 to 835
	 let speed = 17
	case 836 to 884
	 let speed = 18
	case 885 to 932
	 let speed = 19
	case 933 to 981
	 let speed = 20
	case 982 to 1029
	 let speed = 21
	case 1030 to 1078
	 let speed = 22
	case 1079 to 1126
	 let speed = 23
	case 1127 to 1175 
	 let speed = 24
	case 1176 to 1223
	 let speed = 25
	case 1224 to 1272
	 let speed = 26
	case 1273 to 1321
	 let speed = 27
	case 1322 to 1369
	 let speed = 28
	case 1370 to 1418
	 let speed = 29
	case 1419 to 1466
	 let speed = 30
	case 1467 to 1515
	 let speed = 31
	case 1516 to 1563
	 let speed = 32
	case 1564 to 1612
	 let speed = 33
	case 1613 to 1660
	 let speed = 34
	case 1661 to 1709
	 let speed = 35
	case 1710 to 1757 
	 let speed = 36
	case 1758 to 1806
	 let speed = 37
	case 1807 to 1855
	 let speed = 38
	case 1856 to 1903
	 let speed = 39
	case 1904 to 1952
	 let speed = 40
	case 1953 to 2000
	 let speed = 41
	case 2001 to 2049
	 let speed = 42
	case 2050 to 2097
	 let speed = 43
	case 2098 to 2146
	 let speed = 44
	case 2147 to 2194
	 let speed = 45
	case 2195 to 2243
	 let speed = 46
	case 2244 to 2291
	 let speed = 47
	case 2292 to 2340
	 let speed = 48
	case 2341 to 2388
	 let speed = 49
endselect

select case freqdata
	case 2388 to 2437
	 let speed = 50
	case 2438 to 2486
	 let speed = 51
	case 2487 to 2534
	 let speed = 52
	case 2535 to 2583
	 let speed = 53
	case 2584 to 2631
	 let speed = 54
	case 2632 to 2680
	 let speed = 55
	case 2681 to 2728
	 let speed = 56
	case 2729 to 2777
	 let speed = 57
	case 2778 to 2825
	 let speed = 58
	case 2826 to 2874
	 let speed = 59
	case 2875 to 2922
	 let speed = 60 
	case 2923 to 2971
  	 let speed = 61
	case 2972 to 3020
 	 let speed = 62
	case 3021 to 3068	
	 let speed = 63
	case 3069 to 3117	
	 let speed = 64
	case 3118 to 3165	
	 let speed = 65
	case 3166 to 3214	
	 let speed = 66
	case 3215 to 3262	
	 let speed = 67
	case 3263 to 3311	
	 let speed = 68
	case 3312 to 3359	
	 let speed = 69
	case 3360 to 3408	
	 let speed = 70
	case 3409 to 3456	
	 let speed = 71		
	case 3457 to 3505	
 	 let speed = 72
	case 3506 to 3554	
	 let speed = 73
	case 3555 to 3602	
	 let speed = 74
	case 3603 to 3651	
	 let speed = 75
	case 3652 to 3699	
	 let speed = 76
	case 3700 to 3748	
	 let speed = 77
	case 3749 to 3796	
	 let speed = 78
	case 3797 to 3845	
	 let speed = 79
	case 3846 to 3893	
	 let speed = 80
	case 3894 to 3942	
	 let speed = 81
	case 3943 to 3990	
	 let speed = 82
	case 3991 to 4039	
	 let speed = 83
	case 4040 to 4088	
	 let speed = 84
	case 4089 to 4136	
	 let speed = 85
	case 4137 to 4185	
	 let speed = 86
	case 4186 to 4233
 	 let speed = 87
	case 4234 to 4282
 	 let speed = 88
	case 4283 to 4330
 	 let speed = 89
	case 4331 to 4379
 	 let speed = 90		
	case 4380 to 4427
	 let speed = 91
	case 4428 to 4476
	 let speed = 92
	case 4477 to 4524
	 let speed = 93
	case 4525 to 4573
	 let speed = 94
	case 4574 to 4622
	 let speed = 95
	case 4623 to 4670
	 let speed = 96
	case 4671 to 4719
	 let speed = 97
	case 4720 to 4767
	 let speed = 98
	case 4768 to 4816
	 let speed = 99
	case 4817 to 4864
	 let speed = 100
endselect
It will actually compile fine. This is one way around the problem.
 

inglewoodpete

Senior Member
Using a Select Case strucure in this way is far from ideal. I would not have thought of doing something like that. For a start, the execution (loop) speed when operating at higher speeds could be quite slow.

I imagine that your code is trying to simulate some form of curve function to describe the relationship between pulse frequency and speed.

I suggest you plot the curve (relationship between pulse frequency and speed) in a spreadsheet like Excel. Then create a formula that creates a second curve plot matching the first one. I used this method when I created a variable low-pass audio filter that was controlled by a PICAXE. The resulting formula was used to indicate the filter's cut off frequency (in Hz) quite accurately. The whole calculation was done in 2 lines of code.
 

giuseppe

Member
Using a Select Case strucure in this way is far from ideal. I would not have thought of doing something like that. For a start, the execution (loop) speed when operating at higher speeds could be quite slow.

I imagine that your code is trying to simulate some form of curve function to describe the relationship between pulse frequency and speed.

I suggest you plot the curve (relationship between pulse frequency and speed) in a spreadsheet like Excel. Then create a formula that creates a second curve plot matching the first one. I used this method when I created a variable low-pass audio filter that was controlled by a PICAXE. The resulting formula was used to indicate the filter's cut off frequency (in Hz) quite accurately. The whole calculation was done in 2 lines of code.

Actually, what you just advised was something I already did. If you look at this thread here --> http://www.picaxeforum.co.uk/showthread.php?20787-linear-function-with-decimals , the curve fit function is stated in the first post. I was using select...case because I was under the impression that I needed the second term 0.2867. But, I simply overlooked that it is really not a big deal since my reading may be off by 1 mph; I can live with that. I also used select...case because I really just wanted to see the darn thing work in the car (I get impatient sometimes:rolleyes:). Plus, now we know there is a limitation in select...case in this structure! Just like how the lookup command has a limit of 256 entries. Here is my whole code if anyone was simply curious on how it turned out thus far.

Code:
#rem
================================================================================

    File........... Frequency and Speed Meter.bas
    Purpose........ Test code to debug VSS wire information with an LCD
    Author......... Joseph Corleto
    E-mail......... jc269@njit.edu
    Started........ 03/09/2012
    Finished....... 03/14/2012
    Updated........ --/--/----
 
================================================================================
   Notes
================================================================================

================================================================================
  Updates
================================================================================

#endrem
'===============================================================================
'  EEPROM Data
'===============================================================================

'===============================================================================
'  Constants
'===============================================================================
symbol sampleT	=	1000	'duration on the sampling period

'===============================================================================
'  Variables
'===============================================================================
symbol vssdata 	=	w0	'holds the frequency of VSS signal when sampled
symbol speedmph	=	w1	'holds converted speed to mph from frequency
symbol speedkmh	=	w2	'holds converted speed to km/h from frequency

'===============================================================================
'  Pin Declarations
'===============================================================================
'Inputs:
symbol freqin	=	b.5	'pin that samples the frequency of the VSS signal

'Outputs:
symbol lcdrx	=	b.6	'pin that debugs to 20x4 serial lcd

'===============================================================================
'  Initialization
'===============================================================================
#picaxe 18m2		'place directive here
setfreq m32			'run at 32 MHz
pause 200			'pause a little
serout lcdrx,1,("?f")	'clear lcd and return cursor to home
serout lcdrx,1,("?c0")  'turn off blinking cursor

'===============================================================================
'  Main
'===============================================================================
Sample_VSS_Signal:
count freqin,sampleT,vssdata	'sample VSS signal for eighth of second
let vssdata = vssdata * 8 	'multiply by eight to get the frequency

Calculate_Approx_Car_Speed:
speedmph = vssdata * 10 / 483 'empirical speed formula for a 2003 Acura TL (mph)
speedkmh = speedmph * 16 / 10 'conversion from mph to km/h

Display_Data:
serout lcdrx,1,("Frequency: ",#vssdata," Hz  ")  'display frequency data
pause 100							 'pause a little
serout lcdrx,1,("?a?j")					 'move to second row
pause 100							 'pause a litte
serout lcdrx,1,("Speed: ",#speedmph," mi/h    ") 'display speed in mph
pause 100							 'pause a little
serout lcdrx,1,("?a?j?j")				 'move to third row
pause 100							 'pause a litte
serout lcdrx,1,("       ",#speedkmh," km/h    ") 'display speed in km/h
pause 100							 'pause a little
serout lcdrx,1,("?a")					 'send cursor to home position

goto Sample_VSS_Signal		'go back and sample the VSS again

'===============================================================================
'  Sub-Routines
'===============================================================================
 
Top