Exemples de programació

De El raconet d'en Jordi

Dreceres ràpides: navegació, cerca

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

Aquest codi BASIC es pot millorar molt en flexibilitat, llegibilitat i eficiència. En aquest cas només tocant la pota assignada a la part SYMBOL pel potenciòmetre i el led hem adaptat el programa a la placa AXE092, que podrem simular perfectament i a la que podem substituir externament la LDR pel potenciòmetre:

' Forn microones
SYMBOL led = 1
SYMBOL timbre = 2
SYMBOL potenciometre = 4
SYMBOL polsador = pinC.3

SYMBOL temps = b3
SYMBOL contador = b2 

inici:
	low led
espera:
	if polsador = 0 then espera
	readadc potenciometre, temps
	high led
	for contador = 1 to temps
		wait 1
		next contador
	sound timbre, (50,50)
	goto inici

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



Tornar a l'índex