v jednom ze svých projektů potřebuji omezit hodnotu proměnné W0 (pontb) k vytváření hodnoty pro příkaz pwmduty na hodnoty od 1 do 1023, horní hranice bez problémů funguje a zvětšování se čísla se vždy zastaví na 1023, ale ta spodní nedělá absolutně nic a číslo vždy dojde až na nulu a poté na číslo 65527.
tady je kus kódu ve kterém je problém:
Kód: Vybrat vše
lustrop:
irin [3000,ovladac],ir,irb
select case irb
case 17
let pontb=pontb-10 min 1
case 16
let pontb=pontb+10 max 1023
case 73
pontb=1023
case 74
pontb=0
end select
let irb=0
pwmduty lustr,pontb
goto lustrop
Kód: Vybrat vše
;p - program
;b - promená
;out:
symbol lustr=B.1
symbol modra=C.3
symbol zluta=c.2
symbol dvV=B.5
symbol peV=B.4
symbol rep=B.3
symbol ledz=C.4
symbol ledc=C.0
;in:
symbol pont=B.6
symbol ir=B.0
symbol tl1=pinC.7
symbol tl2=pinC.6
symbol tl3=pinB.7
;proměnné:
symbol irb=B3
symbol pontb=W0
symbol ovl=B4 ;1=deska 2=ovladac tv 3=pic ovl (250=stisk)
init:
let ovl=1
pwmout C.2,150,100 ; inicializuj modul pwm
pwmout C.3,150,100
pwmout B.1,150,100
start:
select case ovl
case 1
gosub deska
case 2
gosub ovladac
end select
goto start
deska:
readadc10 pont, pontb
if tl3=1 then let ovl=250 gosub lustrp endif
if tl1=1 then let ovl=250 gosub modrap endif
if tl2=1 then let ovl=250 gosub zlutap endif
if ovl=250 then let ovl=1 goto deska end if
irin [200],ir,irb
if irb=21 then let ovl=2 low ledz high ledc sound rep,(50,50) endif
return
ovladac:
irin [50],ir,irb
select case irb
case 1
high dvV
sound rep,(100,10)
let irb=0
case 2
low dvV
sound rep,(100,50)
let irb=0
case 4
high peV
sound rep,(100,10)
let irb=0
case 5
low peV
sound rep,(100,50)
let irb=0
case 6
gosub modraop
case 7
gosub zlutaop
case 8
gosub lustrop
end select
if tl1=1 then let ovl=1 let irb=0 low ledc high ledz sound rep,(50,50) endif
return
lustrp:
pwmduty lustr,pontb ; nastav činitel plnění
return
modrap:
pwmduty modra,pontb ; nastav činitel plnění
return
zlutap:
pwmduty zluta,pontb ; nastav činitel plnění
return
modraop:
irin [3000,ovladac],ir,irb
debug
select case irb
case 17
let pontb=pontb-10 min 1
debug
case 16
let pontb=pontb+10 max 1023
case 73
pontb=1023
case 74
pontb=0
end select
let irb=0
pwmduty modra,pontb
goto modraop
zlutaop:
irin [3000,ovladac],ir,irb
select case irb
case 17
let pontb=pontb-10 min 1
case 16
let pontb=pontb+10 max 1023
case 73
pontb=1023
case 74
pontb=0
end select
let irb=0
pwmduty zluta,pontb
goto zlutaop
lustrop:
irin [3000,ovladac],ir,irb
select case irb
case 17
let pontb=pontb-10 min 1
case 16
let pontb=pontb+10 max 1023
case 73
pontb=1023
case 74
pontb=0
end select
let irb=0
pwmduty lustr,pontb
goto lustrop