Código:
'Experimento-20'
'Micro a usar es atmega8
$regfile = "m8def.dat"
'Cristal interno de oscilacion
$crystal = 1000000
'PinD como salida y entrada
Config Portd.0 = Input
Config Portd.1 = Input
Config Portd.7 = Output
Portd.0 = 1
Portd.1 = 1
Portd.7 = 1
Dim Duracion As Byte
Declare Sub Blinqueo_led(byval Duracion As Byte)
Do
If Pind.0 = 0 And Pind.1 = 0 Then
Duracion = 5
Call Blinqueo_led(duracion)
Else
If Pind.0 = 0 And Pind.1 = 1 Then
Duracion = 250
Call Blinqueo_led(duracion)
Else
If Pind.0 = 1 And Pind.1 = 0 Then
Duracion = 125
Call Blinqueo_led(duracion)
Else
Duracion = 65
Call Blinqueo_led(duracion)
End If
End If
End If
Loop
Sub Blinqueo_led(duracion As Byte)
Toggle Portd.7
Wait Duracion
Toggle Portd.7
Wait Duracion
End Sub
End
Hola amigos
Aquí el programa que acaba de publicar el amigo Genaro, pero ahora usando la sentencia "Call"!
Ahora a los detalles del código.:
En cierto sentido la sentencia call es como crear una sentencia propia, en este caaso la sentencia Blinqueo_LED. Deje el código de Genaro casi que sin cambios, pero mas leible. Usando la sentencia "AND" hice el chequeo de los valores de los pines PIND.0 y PIND.1 de un golpe lo que asiste mucho en lo leible del programa. La sentencia "AND" usada aquí tiene la función de que la condición de la sentencia If ... then solo es verdadera (True) si ambos pines tienen el valor deseado.
Ahora a la sentencia Call:
El uso de esta sentencia empieza declarando la subrutina. Esto ocurre con la sentencia "Declare". La sentencia "Declare" tiene 2 posibles funciones. La primera es declarar una subrutina, lo que estamos haciendo en este programa. La segunda es declarando una función. Sea dicho que la función es una subrutina que al ser ejecutada resulta en un valor. Así este valor puede ser asignado a una variable. Pero sobre esto mas en otro momento.
Despues de declarar la subrutina Blinqueo_LED esta existe como nombre tal cual declarada y esta disponible para ser usada con la sentencia "Call".
Dentro de los paréntesis en la declaración de nuestra subrutina usé:
"byval Duracion As Byte"
Esto significa que el valor que pongo entre los paréntesis al llamar la subrutina con la sentencia "Call", es asignado a la variable "Duracion".
Lo simpático de esta forma de programar es que la sentencia:
"Call Blinqueo_led(duracion)", es que no cambia, es siempre la misma. Todo lo que hago es asignar un valor nuevo a "Duracion" y ya el resultado es otro. También sería posible usar la sentencia "Call" así:
"Call Blinqueo_led(5)"
Escribiendo el valor entre los paréntesis. El resultado sería identico a la forma anterior donde le asigno el valor a duración en el renglón anterior a la sentencia "Call". Ojalá que esto sea de utilidad para entender mejor este primer uso de la sentencia call.
Al final del código vemos la subrutina "Blinqueo_led". Como pueden ver es la subrutina de Genaro tal cual la escribio!
Subsumando lo dicho en este mensaje. Si comparan el código que publicó Genaro con el código modificado que publico ahora pueden ver lo siguiente:
1. El código es mucho mas facil de leer y entender.
2. Es mucho menos propenso a hacer errores durante el escribir del código.
3. Hemos creado un código reusable sensillísimamente.
Permítanme presentar el concepto, que acaba siendo clave para todo aquel que se decida en hacer el cursillo electrónico!
Siempre he recalcado que el objetivo del curso es capacitar el realizar cada cual sus propias soluciones, reusando los módulos que presenta el curso electrónico. esto no solo consiste en la hardware, que es lo que ya ha creado tantas emociones, sino que es ver todo como una caja de piezas de lego. Imagínense módulos de hardware y acompanando estos módulos de software como la subrutina "Blinqueo_LED". Tomen el caso de un variador electrónico. Junto con el o los módulos de hardware, en este caso un módulo de control y uno de potencia, acampanados por módulos de software. Estos módulos de software los escribiríamos de tal forma que le asignaríamos valores a los parámetros, así como lo hice con "Duracion" en este ejemplo, y ya seríamos capaces de adaptar la solución del variador a los más diversos variadores electrónicos. En cierto sentido encapsulamos los programas. Esto significa que el reusar de un módulo de software, solo tendríamos que declarar las subrutinas, copiar el código de las subrutinas a nuestro programa y asignar los valores deseados a los parámetros. El riesgo de cometer errores se, limita así a un mínimo.