Skip to content

Instantly share code, notes, and snippets.

@synaptiko
Last active August 29, 2015 13:59
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save synaptiko/10754510 to your computer and use it in GitHub Desktop.
Save synaptiko/10754510 to your computer and use it in GitHub Desktop.
#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