I have made a few tweaks and the code compiles ok, but when I run the simulator it stops at main:end (before the multi task threads run).
Picaxe Manual2, page 9: simtask directive
#simtask all/0/1/2/3 Programming Editor Only
The task to follow during simulation when using parallel multi-tasking M2 parts.
If no task is specified task 0 will be automatically traced.
Multiple tasks can also be traced at the same time by using ‘all’
Is main:end in the right place?
Also, I had assumed that the thread numbering needed to start with 0.
There is an implicit start0 at the start of any program, so in your case before :
let cycles = 10
You are right : the correct command to be used when multitasking is
suspend 0
, NOT END
The others tasks are infinites loops...
Also, I need the alarm code to run only once (when the fault is detected), not infinitely.
I guess I need to goto start1 to continue where the alarm was triggered?
So : replace
goto alarm
with
gosub /return
The GOTO command is always a source of problems...
Code:
[color=Navy]#PICAXE [/color][color=Black]08M2[/color]
[color=Navy]#simspeed 200
#simtask [/color][color=Blue]all[/color]
[color=Green];stage 4
;do
;if pin 4 = 1 then
;pause 100
;do loop until pin 4 = 0
;mode = mode + 1
;if mode > 3 then
;mode = 1
;endif
;select mode
;case 1: cycles per minute = 8
;case 2: cycles per minute = 10
;case 3: cycles per minute = 12
;end select
;endif
;loop[/color]
[color=Blue]start0:
symbol [/color][color=Purple]cycles [/color][color=DarkCyan]= [/color][color=Purple]w5[/color]
[color=Blue]symbol [/color][color=Purple]blinks [/color][color=DarkCyan]= [/color][color=Purple]w6[/color]
[color=Blue]symbol [/color][color=Purple]gon [/color][color=DarkCyan]= [/color][color=Purple]w7[/color]
[color=Blue]symbol [/color][color=Purple]onoff [/color][color=DarkCyan]= [/color][color=Purple]w8[/color]
[color=Blue]symbol [/color][color=Purple]counter [/color][color=DarkCyan]= [/color][color=Purple]b1 [/color][color=Green]; define the variable b1 as counter (count blinks)[/color]
[color=Blue]symbol [/color][color=Purple]counter2 [/color][color=DarkCyan]= [/color][color=Purple]b2 [/color][color=Green]; define the variable b2 as counter2 (count alarm on/offs)[/color]
[color=Blue]let [/color][color=Purple]cycles [/color][color=DarkCyan]= [/color][color=Navy]10 [/color][color=Green]; red/green cycles per minute [/color]
[color=Blue]let [/color][color=Purple]blinks [/color][color=DarkCyan]= [/color][color=Navy]4 [/color][color=Green]; red LED number on/off[/color]
[color=Blue]let [/color][color=Purple]gon [/color][color=DarkCyan]= [/color][color=Navy]1200 [/color][color=Green]; green LED on time (ms)
'let onoff = (60/cycles-(gon/1000))/(2*blinks+2)*1000 ;red LED on/off duration
;(60/10-1.2)/(2*4+2)*1000
;4.8/10*1000 = 480 (ms)[/color]
[color=Blue]let [/color][color=Purple]onoff[/color][color=DarkCyan]=[/color][color=Navy]480[/color]
[color=Blue]symbol rLED [/color][color=DarkCyan]= [/color][color=Blue]C.0 [/color][color=Green]; define pin 0 with the name rLED[/color]
[color=Blue]symbol gLED [/color][color=DarkCyan]= [/color][color=Blue]C.1 [/color][color=Green]; define pin 1 with the name gLED[/color]
[color=Blue]symbol buzzer [/color][color=DarkCyan]= [/color][color=Blue]C.2 [/color][color=Green]; define pin 2 with the name buzzer[/color]
[color=Blue]symbol sense [/color][color=DarkCyan]= [/color][color=Blue]C.3 [/color][color=Green]; define pin 3 with the name sense[/color]
[color=Blue]symbol selector [/color][color=DarkCyan]= [/color][color=Blue]C.4 [/color][color=Green]; define pin 4 with the name selector[/color]
[color=Black]main:[/color]
[color=Blue]suspend [/color][color=Navy]0[/color]
[color=Blue]start1:
do
low rLED
pause [/color][color=Navy]480 [/color][color=Green]; pause onoff milliseconds (assumes 10 cycles per minute)
[/color][color=Blue]for [/color][color=Purple]counter [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]4 [/color][color=Green]; for count = 1 to blinks
[/color][color=Blue]high rLED
pause [/color][color=Purple]onoff
[/color][color=Blue]low rLED
pause [/color][color=Purple]onoff
[/color][color=Blue]next [/color][color=Purple]counter
[/color][color=Blue]high gLED
pause [/color][color=Navy]1200
[/color][color=Blue]low gLED
loop
start2:
do
if [/color][color=Purple]pinC.0 [/color][color=DarkCyan]= [/color][color=Navy]0 [/color][color=DarkCyan]and [/color][color=Purple]pinC.1 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]then
gosub [/color][color=Black]alarm [/color][color=Green]; jump to alarm if green LED is off and sense is on
[/color][color=Blue]endif
loop[/color]
[color=Black]alarm:
[/color][color=Blue]for [/color][color=Purple]counter2 [/color][color=DarkCyan]= [/color][color=Navy]1 [/color][color=Blue]to [/color][color=Navy]2
[/color][color=Blue]high buzzer
high rLED
pause [/color][color=Navy]150
[/color][color=Blue]low buzzer
low rLED
pause [/color][color=Navy]150
[/color][color=Blue]high buzzer
high gLED
pause [/color][color=Navy]150
[/color][color=Blue]low buzzer
low gLED
pause [/color][color=Navy]150
[/color][color=Blue]next [/color][color=Purple]counter2[/color]
[color=Blue]return[/color]
Note that all tasks will start at the same time.
Actually :
- first line from start0
- first line from start1
- first line from start2
- second line from start0
- second line from start1
- second line from start2
- third line from start0
- and so on
If you want do initialze some things before starting 1 and 2
you have to suspend them at the very beginning of start0, and resume them at the end of start0.