Last active
August 29, 2015 13:59
-
-
Save synaptiko/10754510 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#picaxe 08m2 | |
' Odkaz https://gist.github.com/synaptiko/10754510 | |
' Tabulka názvů proměnných, které lze v 08M2 použít: | |
' b0:b1 b2:b3 b4:b5 b6:b7 b8:b9 b10:b11 b12:b13 b14:b15 b16:b17 b18:b19 b20:b21 b22:b23 b24:b25 b26:b27 | |
' w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 | |
' b* = 1 byte, tj. 256 různých hodnot | |
' w* = 2 byty, tj. 65 536 různých hodnot | |
' Kromě těchto dvou jde použít i bit* pro nastavení pouze 2 hodnot (true/false) | |
' Pozor bit0-bit7 se překrývá s b1. Stejně tak b1 a b2 se překrývá s w1. Analogicky je to i pro ostatní proměnné. | |
' Pojmenujeme si PINy čipu, které budeme používat | |
symbol LED_R = C.2 ' Red = červená noha LED diody | |
symbol LED_G = C.4 ' Green = zelená noha LED diody | |
symbol LED_B = C.1 ' Blue = modrá noha LED diody | |
symbol ON_OFF_SWITCH = C.3 ' Tlačítko | |
' Označíme si hodnoty pro jednotlivé barvy | |
symbol INDEX_R = 0 | |
symbol INDEX_G = 1 | |
symbol INDEX_B = 2 | |
' Protože nemůžeme použít příkaz pwm (v 08m2 lze použít pouze pro jeden pin), tak používáme příkaz servo, | |
' který dělá něco podobného jako pwm a lze ho použít na všech výstupních pinech. | |
' Má ale jednu nevýhodu, minimální a maximální hodnota nefungují, tak jak by se očekávalo. | |
' Hodnota 0 způsobí, že dioda svítí a to nechceme. Hodnota 255 zase, že zhasne. | |
symbol MIN_VALUE = 5 | |
symbol MAX_VALUE = 245 | |
' Counter neboli čítač koresponduje s tabulkou barev, která je úplně naspod tohoto souboru. | |
' Určuje kterou hodnotu/kombinaci barev právě používáme (více je uvedeno přímo u tabulky). | |
' Hodnota 85 je maximální index, na který se v tabulce přistoupí. Poté se počítá znovu od 0. | |
symbol COUNTER_MAX = 85 | |
symbol isOn = bit0 ' Určuje jestli LED diody svítí, pokud ne, je aktivovaný úsporný režim. | |
symbol isOffSuspend = bit1 ' Ulehčuje detekci vypnutí: pouze stiskem, který je kratší než 100ms můžeme LED diody vypnout. | |
symbol servoRActive = bit2 ' Je příkaz servo aktivovaný pro červenou diodu? | |
symbol servoGActive = bit3 ' Je příkaz servo aktivovaný pro zelenou diodu? | |
symbol servoBActive = bit4 ' Je příkaz servo aktivovaný pro modrou diodu? | |
symbol counter = b1 ' Čítač, který ukazuje na konkrétní kombinaci barev z tabulky dole. Posouvá se a cykluje mezi různými barvami. | |
symbol pin = b2 ' Ukládá hodnotu aktuálně nastavovaného pinu LED diody. Slouží jako parametr proceduře setColorComponent. | |
symbol value = b3 ' Ukládá hodnotu pro příkaz servo. Slouží jako parametr proceduře setColorComponent. | |
symbol colorIndex = b4 ' Pomocná proměnná pro nalezení konkrétní hodnoty pro pin LED diody z tabulky barev. | |
main: | |
' Inicializace | |
input ON_OFF_SWITCH ' Označíme pin pro tlačítko jako vstupní - budeme číst, jestli je stisknuté nebo ne. | |
counter = 0 ' Začínáme první barvou. | |
gosub switchOffLed ' Pro jistotu zavoláme vypnutí LED diod. | |
' Hlavní smyčka, ve které se odehrává celý program | |
do | |
' Je tlačítko zrovna teď stisknuté? | |
if pinC.3 = 1 then ; = ON_OFF_SWITCH | |
' Tlačítko je stisknuté. | |
' Jsou LED diody vypnuté? | |
if isOn = 0 then | |
' LED diody jsou vypnuté, takže je zapneme a nastavíme si pomocné proměnné. | |
gosub setLed | |
isOn = 1 | |
isOffSuspend = 1 | |
else | |
' LED diody jsou zapnuté, musíme zjistit, jestli je nemáme náhodou vypnout. | |
if isOffSuspend = 0 then | |
pause 100 | |
' Je po krátké pauze tlačítko stále stisknuté? | |
if pinC.3 = 0 then ; = ON_OFF_SWITCH | |
' Není, takže LED diody vypneme a nastavíme si pomocné proměnné. | |
gosub switchOffLed | |
isOn = 0 | |
isOffSuspend = 0 | |
else | |
' Tlačítko je stále stisknuté, takže se přesuneme na další barvu... | |
isOffSuspend = 1 | |
gosub toNextColor | |
' a přenastavíme jednotlivé LED diody. | |
gosub setLed | |
end if | |
else | |
' Pokud proběhla první kontrolní pauza pro detekci vypnutí, tak už se jen přesouváme na další barvu. | |
pause 10 | |
gosub toNextColor | |
gosub setLed | |
end if | |
end if | |
else if isOffSuspend = 1 then | |
' Tlačítko už není stisknuté, při příštím stisku zase budeme detekovat vypnutí. | |
isOffSuspend = 0 | |
end if | |
if isOn = 0 then | |
' Pokud jsou LED diody vypnuté, tak si nasimulujeme úsporný režim. | |
disablebod ' Odebere tzv. brown-out-detection během úsporného režimu (příkaz nap).: | |
' to pomůže snížit spotřebu energie zhruba 4x | |
nap 4 ' Dáme čipu na chvíli odpočinek, hodnota 4 se rovná 288ms. | |
enablebod ' Znovu zapneme brown-out-detection. | |
else | |
' Počkáme drobnou chvilku než budeme pokračovat zase na začátek cyklu. | |
pause 10 | |
end if | |
loop ' Loop nás hodí zase nazačátek, tj. na řádek č. 50 | |
switchOffLed: | |
servoRActive = 0 | |
servoGActive = 0 | |
servoBActive = 0 | |
' Deaktivujeme příkaz servo => vypnuté LED diody. | |
servo LED_R, off | |
servo LED_G, off | |
servo LED_B, off | |
return | |
toNextColor: | |
inc counter ' Zvýšíme si counter o hodnotu 1. | |
if counter >= COUNTER_MAX then | |
' Pokud jsme překročili maximální hodnotu, tak začneme od začátku. | |
counter = 0 | |
end if | |
return | |
setLed: | |
' Nastavíme červenou LED diodu. | |
pin = INDEX_R | |
gosub setColorComponent | |
' Nastavíme zelenou LED diodu. | |
pin = INDEX_G | |
gosub setColorComponent | |
' Nastavíme modrou LED diodu. | |
pin = INDEX_B | |
gosub setColorComponent | |
return | |
setColorComponent: | |
' Spočteme si index pro vyhledání hodnoty svítivosti LED diody. | |
let colorIndex = counter * 3 + pin | |
' Pomocí indexu si najdeme danou hodnotu v tabulce dole. | |
gosub lookupColorValue | |
' Je hodnota menší než minimální? | |
if value < MIN_VALUE then | |
' Pokud ano, tak vypneme konkrétní LED diodu. | |
if pin = INDEX_R then | |
servoRActive = 0 | |
servo LED_R, off | |
else if pin = INDEX_G then | |
servoGActive = 0 | |
servo LED_G, off | |
else | |
servoBActive = 0 | |
servo LED_B, off | |
end if | |
else | |
' Pokud ne, tak zkontrolujeme překročení maximální hodnoty. | |
if value >= MAX_VALUE then | |
' Hodnotu 255 nemůžeme použít, protože nefunguje spolehlivě. Použijeme o jedna menší. | |
value = 254 | |
end if | |
' Pro jednu z LED diod nastavíme hodnotu pomocí příkazu servo: | |
if pin = INDEX_R then | |
' Pokud nebyla dioda ještě aktivována... | |
if servoRActive = 0 then | |
' Aktivujeme příkaz servo. | |
servoRActive = 1 | |
servo LED_R, value | |
else | |
' Nebo pouze změníme hodnotu příkazem servopos. | |
servopos LED_R, value | |
end if | |
else if pin = INDEX_G then | |
if servoGActive = 0 then | |
servoGActive = 1 | |
servo LED_G, value | |
else | |
servopos LED_G, value | |
end if | |
else | |
if servoBActive = 0 then | |
servoBActive = 1 | |
servo LED_B, value | |
else | |
servopos LED_B, value | |
end if | |
end if | |
end if | |
return | |
lookupColorValue: | |
' Tato tabulka reprezentuje předpočítané hodnoty pro LED diody. | |
' Je to trojice hodnot R, G, B (červená, zelená, modrá). | |
' Pomocí colorIndexu najdeme zapamatujeme si vybranou hodnotu do value. | |
lookup colorIndex, (255, 0, 0, 255, 17, 0, 255, 35, 0, 255, 54, 0, 255, 72, 0, 255, 89, 0, 255, 108, 0, 255, 126, 0, 255, 144, 0, 255, 162, 0, 255, 179, 0, 255, 198, 0, 255, 216, 0, 255, 234, 0, 255, 252, 0, 240, 255, 0, 222, 255, 0, 203, 255, 0, 186, 255, 0, 167, 255, 0, 150, 255, 0, 131, 255, 0, 113, 255, 0, 96, 255, 0, 78, 255, 0, 60, 255, 0, 41, 255, 0, 24, 255, 0, 5, 255, 0, 0, 255, 11, 0, 255, 30, 0, 255, 47, 0, 255, 65, 0, 255, 84, 0, 255, 102, 0, 255, 120, 0, 255, 137, 0, 255, 156, 0, 255, 174, 0, 255, 192, 0, 255, 209, 0, 255, 227, 0, 255, 246, 0, 246, 255, 0, 227, 255, 0, 209, 255, 0, 192, 255, 0, 173, 255, 0, 156, 255, 0, 138, 255, 0, 120, 255, 0, 102, 255, 0, 83, 255, 0, 65, 255, 0, 48, 255, 0, 29, 255, 0, 11, 255, 5, 0, 255, 23, 0, 255, 41, 0, 255, 60, 0, 255, 77, 0, 255, 95, 0, 255, 114, 0, 255, 131, 0, 255, 149, 0, 255, 168, 0, 255, 186, 0, 255, 204, 0, 255, 222, 0, 255, 240, 0, 255, 255, 0, 252, 255, 0, 234, 255, 0, 216, 255, 0, 197, 255, 0, 180, 255, 0, 161, 255, 0, 143, 255, 0, 126, 255, 0, 108, 255, 0, 90, 255, 0, 72, 255, 0, 54, 255, 0, 36, 255, 0, 17), value | |
return |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment