Exemples de programació
De El raconet d'en Jordi
Contingut |
Introducció
Sempre he dit que la programació és un art, com els escacs. Per molt que a una persona li expliquis les normes dels escacs, no aprendrà a jugar fins que no vegi les estratègies, es a dir, partides d'altres jugadors, especialment de grans mestres. De la mateixa manera, una persona aprèn a programar veient programes d'altres programadors, com més optimitzats (i comentats), millor.
Exemple 1: Control d'un forn microones
Considerem un microones de joguina controlat per un PICAXE-08M amb les següents connexions:
- Una entrada digital (posada en marxa) a la pota 3
- Una entrada analògica (temporitzador) a la pota 1
- Una sortida digital (llum de funcionament) a la pota 4
- Una sortida d’àudio (avisador acústic fi) a la pota 2
Inicialment apaguem el forn
(low 4, és a dir la tensió
d’aquesta sortida es força a O
V) i esperem que el posin en
marxa (bucle d'espera per
pin3=1). Quan s'activa el
polsador connectat al pin3
llegim el temps de cocció i el
desem a b0. Aquest temps dependrà de la posició del potenciòmetre connectat
al pin1 i que actua com a divisor de tensió. Encenem el forn (high 4, és a dir,
aquesta sortida es força a l’estat alt, a 5 V) i contem amb el comptador b1 fins
coincidir amb el temps emmagatzemat a b0, esperant 1s (wait 1) en cada
increment. En acabar el compte activem el brunzidor piezoelèctric (sound 2,
(50,50)) i tornem al principi, amb la qual cosa s'apaga el forn.
El mateix editor ens pot convertir el diagrama de flux en codi BASIC:
' Forn microones
main:
label_6: low 4
label_44: if pin3=1 then label_D
goto label_44
label_D: readadc 1,b0
high 4
let b1= 0
label_37: if b1=b0 then label_29
wait 1
let b1=b1+ 1
goto label_37
label_29: sound 2,(50,50)
goto label_6
Exemple 2: Dau electrònic
Considerem un dau electrònic
controlat per un PICAXE-08M. Els
diferents LEDs estan connectats
segons la figura (sortides 0, 1, 2 i 4).
A l'entrada 3 tenim quatre polsadors
en paral·lel, qualsevol dels quals
genera un nou número aleatori.
Inicialment apaguem els LEDs (low 0, low 1, low 2, low 4) i generem un número
aleatori que desem a b0 (random b0), del qual obtenim el residu de dividir per 6
i el desem a b1 (b1 = b0//6). D'aquesta manera obtenim un nombre entre 0 i 5.
Segons aquest nombre emmagatzemat a b1, actuem: si és 0 activem el LED
central (high 0) que es visualitza com un 1, si es 1 activem una diagonal (high 1)
que es visualitza com un 2, si és 2 activem els LEDs central i una diagonal (high
0, high 1), si es 3 (número 4) activem les dues diagonals (high 1, high 2), si es 4
activem el central i les dues diagonals (high 0, high 1, high 2), en un altre cas es
tracta del nombre 6 i activem les diagonals i la parella central (high 1, high 2,
high 4). Una vegada visualitzat el nombre esperem que el jugador premi
qualsevol dels polsadors connectats en paral·lel al pin3 (bucle d'espera pin3=1) i
tornem a l'inici.
El mateix editor ens proporciona el següent codi en BASIC:
' Dau electrònic
'BASIC converted from flowchart:
'C:\DOCUMENTS AND SETTINGS\JORGE\MIS DOCUMENTOS\PICAXE\CODI\DAUSIM.CAD
'Converted on 07/08/2007 at 23:36:21
main:
label_6: low 0
low 1
low 2
low 4
'Note: it is recommended to change byte variable here to word variable!
'(see manual for details about 'random' command operation)
random b12
let b1=b12// 6
if b1= 0 then label_45
if b1= 1 then label_62
if b1= 2 then label_74
if b1= 3 then label_8D
if b1= 4 then label_A6
high 1
high 0
high 4
label_22: if pin3=1 then label_6
goto label_22
label_45: high 2
goto label_22
label_62: high 1
goto label_22
label_74: high 2
high 1
goto label_22
label_8D: high 1
high 4
goto label_22
label_A6: high 4
high 1
high 2
goto label_22
La programació en diagrama de flux té avantatges didàctics i d'ordenació del pensament, però no genera un codi òptim. Aquí teniu un forma alternativa de programació, amb les sortides adaptades a la placa AXE105:
' Dau electrònic
' Jordi Orts 2011
' AXE105
inici:
low 0, 1, 2, 4
random w1
let b1=w1// 6
inc b1
select case b1
case 1
high 2
case 2
high 1
case 3
high 1, 2
case 4
high 1, 4
case 5
high 1, 2, 4
case 6
high 0, 1, 4
end select
espera: if pin3=0 then espera
goto inici
Exemple 3: Porta corredora
A continuació estudiem el cas d'una porta corredora accionada per un motor connectat, mitjançant un L293D a les sortides 0 i 1 d'un PICAXE-08M. Disposem de sensors de presència (entrada 3) i de fi de cursa que ens indiquen quan la porta està totalment oberta (pin2) o tancada (pin4):
- Amb pin0=1 i pin1=0 el motor gira obrint la porta
- Amb pin0=0 i pin1=1 el motor gira tancant la porta
- Qualsevol altre combinació de pin0 i pin1 atura el motor.
- Pin3 rep el senyal del sensor de proximitat (=1 si hi ha algú)
- Pin2 està connectat a un sensor fi de cursa que indica que la porta està completament oberta (=1)
- Pin4 està connectat a un sensor fi de cursa que indica que la porta està completament tancada (=1).
La porta s'obre quan es detecta la presència d'alguna persona. Una vegada oberta, ha d'esperar 15 s sense que detecti ningú abans de començar a tancar- se. Si es detecta alguna persona durant el procés de tancament, la porta ha de tornar a obrir-se.
A continuació el codi BASIC generat:
' Porta corredora
'BASIC converted from flowchart:
'C:\DOCUMENTS AND SETTINGS\JORGE\MIS DOCUMENTOS\PICAXE\CODI\PORTA.CAD
'Converted on 07/08/2007 at 23:38:20
main:
low 0
label_D: low 1
label_14: if pin3=1 then label_20
goto label_14
label_20: high 0
let b0= 0
label_38: if pin2=1 then label_2E
goto label_38
label_2E:
low 0
label_44: if pin3=1 then label_4F
label_56: wait 1
let b0=b0+ 1
if b0= 15 then label_72
goto label_44
label_4F: let b0= 0
goto label_56
label_72: high 1
let b0= 0
label_79: if pin3=1 then label_84
if pin4=1 then label_A8
goto label_79
label_84: low 1
goto label_20
label_A8:
goto label_D
Recordeu que una bona font d'informació sobre les ordres dels PICAXE la trobareu al manual de BASIC, disponible en castellà a les darreres versions de l'editor.
Podem realitzar un muntatge senzill d'una porta corredora reciclant una lectora de CDs


