Buenos,continuamos mis tarea pero no puedo publicar mi codigo va. esto es para que aprenda tu mismo como los estoy haciendo yo ahorita pero no soy envidioso ni egoista eh ya veras que facil es programar.
El video que vez es la sentencia Dim T As Byte y For Next bueno a continuacion se presenta una nuevas instrucion,esta compone por un comando que permite repetir un numero predeterminado de ciclos y al terminar se sale de esta rutina y continua.
" onclick="window.open(this.href);return false;
Continuamos........
Última edición por Genaro Miranda el Mié Dic 22, 2010 8:41 pm, editado 1 vez en total.
Buenos, Y para otra sentencia de Dim A as Integer....Do loop Until.
Empieza inicializando la variable A que se usa como contador de ciclos cuando la variable A sea igual ahi se para.....mira el video.
Te felicito viendo que avances has hecho en la programación. Pero ahora si a conectar la pantalla, que te permitira hacer un extenso uso de las sentencias aprendidas. Veo la tareo como resuelta de forma sobresaliente. Feiz Navidad de mi parte a tí y a todos los foreros y sus familias.
Hola hellmult.
Igualmente, pero todavia me falta un pocito como la sentencia que estoy estudiando While...Wend y Call y despues seguimo con las pantalla......paciencia.
je, je,je. Me paree bien que quieras completar las sentencias primero! Realmente la gran diferencia entre la sentenia while y Wend es que primero se omprueba la condición yluego se ejecuta el programa. La sentenia Do y until como lo dice las palabras en inglés, haz ... hasta que, ejecuta el programa una vez y recién entonces decide si lo hace una segunda vez.
La sentencia Call es realmente importante y lo que aprendas allí también te servirá para entender el funcionamiento de las rutinas de servicio de interrupciones.
La sentencia "Call" es muy,pero muy potente! Te recomiendo empesar despasito. El primer aspecto a considerar es saber que en el texto del código donde vayas a utilizar las sentencia Call, antes de usar Call hay que declarar la subrutina! Aquí el ejemplo sacado del archivo de ayuda de BASCOM:
$regfile = "m48def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Dim A As Byte , B As Byte 'dimension some variables
Declare Sub Test(b1 As Byte , Byval B2 As Byte) 'declare the SUB program
A = 65 'assign a value to variable A
Call Test(a , 5)'call test with parameter A and constant
Test A , 5 'alternative call
Print A 'now print the new value
End
Sub Test(b1 As Byte , Byval B2 As Byte) 'use the same variable names as 'the declared one
Print B1 'print it
Print Bcd(b2)
B1 = 10 'reassign the variable
B2 = 15 'reassign the variable
End Sub
Analizemos el ejemplo! El primer bloque hasta el renglón con el "$framesize = 40" son datosde importancia para el compilador. El tipo de controlador usado, la frecuencia del reloj, aquí define la velocidad de la interfaz serial. Las siguientes 4 líneas son nuevas! A ver una explicación!
Cuando "llamas" una "subrutina" llama en inglés es call, el controlador requiere de espacio donde poner los datos que le quiere dar a la subrutina y requiere salvar el contenido de los registros en algún lugar. Imaginense esa memoria que reside en el SRAM del controlador, como un tubo físico vertical. El controlador toma cada dato, imagínatelo como un paquete y lo mete en el tubo. El primer paquete puesto en el tubo por lo tanto tiene que ser empujado hacia arriba por el segundo paquete y así hasta haber puesto todos los datos en el tubo. Digamos que en el caso de nuestra subrutina le estés pasando dos variables, A y B, entonces el programa empuja la variable A en el tubo y después la variable B. En la subrutina esta toma accesso a estas variables sacando los dos paquetes de este tubo. Así la variable que sale primero es la variable B y luega la C. Por eso es de importancia mantener el orden de las variables al llamar (Call) una subrutina con el orden definido en la declaración de la subrutina.
Ese "tubo" es lo que en inglés y en términos de programación de controladores se llama "stack". Definiendo el tamano de los stacks permite asegurar que el compilador haga los tubos del tamano que los vamos a necesitar. Si aquí hay un problema, es cuando resulta muy dificil encontrar la causa. El tamano indicado aquí es adecuado para la gran mayoría de programas. Si se trabaja mucho con subrutinas y/o funciones y con rutinas de servicio a interrupciones, entonces puede ser necesario definir un tamano mayor. Pero limitémosnos aquí asumiendo que el tamano reservado aquí es adecuado.
Te refiero buscar el término "Memory Usage" en la ayuda de BASCOM. A lo que dice allí me refiero ahora:
El compilador BASCOM por lo general no usa el SRAM para otro propósito que para poner de forma temporal el software stack y el frame. El software stack es el "tubo", la memoria, usada para pasar las variables del programa a la subrutina. En la ayuda de BASOM sobre "Memory usage" aparece cuanta memoria requieren los diferentes tipos de datos:
Cada 8 bits usan un byte
Cada variable del tipo byte usa un byte
Cada variable del tipo integer o word usa dos bytes
Cada variable del tipo Long o Single usa 4 bytes
Cada variable del tipo double usa 8 bytes
Cada ariable del tipo string usa mínimo 2 bytes.
Un string, o texto, de un largo de 10 por ejemplo usa 11 bytes. El décimoprimer byte indica el fin del string.
Existen aso especiales que requieren bastante mas memoria, allí os recomiendo estudiar la ayuda de BASCOM cuando sea necesario. En genereal es de recomendar tratar de pasar datos a subrutinas de un tipo que requiera poca memoria.
El tubo o memoria Frame es usado para guardar variables locales.
Gracias, e igualmente los mejores deseoa para eo 2011. Cuando acabes aprendiendo la sentencia "Call" tendras que publicar lo aprendido, pues a fondo no se todos los detalles, es especial como son en BASCOM. Lo not´r cuando trabaje en mi última respuesta.
En conceptos generales tengo la noción que subrutinas pueden existir en 2 variantes, la una siendo una subrutina con la opción de pasar datos a ella o no, y los datos siendo válidos loales o globales. La otra forma es como "función".. Como función la subrutina devuelve un resultado. Mas o menos así:
variable1 = funcionX(parámetro1, parámetro2)
Por eso tanto la función como la variable tienen que ser del mismo tipo de datos, por ejemplo "Byte", "Integer" u otro.
Aquí estoy varado por falta de medios económicos. Clientes que no pagan, el estado que busca y busca razones para demorar el tener que pagar los subsidios y finalmente nuestra irreponsabilidad por querer darle a los crios una navida y un ano nuevo que recuerden como evento familiar. así nos estamos manteniendo a flote reduciendo los consumos al máximo, lo que me hace mucho bien por permitirme bajar de peso.
Estoy por hacer los últimos pasos para terminar las luces de la iluminación indirecta de la cubierta, que ahora también incluye un sensor de humedad y temperatura digital en un empaque de 3x3mm con 6 pines! Para la programación no hago mas que adaptar los programas ejemplo del curso. ya verán cuando finalmente se recupere la situación económica hasta fin de mes.
Al amigoo genar lo quiero felicitar por lo dedicado que se dedica a aprender la programación. Es como en el colegio. Para poder gozar los libros de Cervantes primero hay que aprender a leer. Que no publique sus códigos es triste, pero no importa ya los pondré yo a su debido tiempo si se encuentra otro que quiera aprender usando este curso.
La materia de los XBees es un ejemplo muy especial de lo que es posible teniendo unos mínimos conocimientos de electrónica. Los módulos están estandardisados y así resulta que operarlos está dentro de lo permitido por la ley, haciendo así posible algo fantástico para nuestro hobby. Aquí deseo resaltar que el uso de los Arduinos u Amicos que el amigo josechu fomenta, hacen par especialmente bien con los módulos XBee. Estas soluciones son tan diminutas y tan bien adaptadas que la pareja de un Arduino/Amico y un XBee resultan fenomenales.
Así como mi velero recién estará navegable en el 2012, mi radio control demorará hasta que lo tenga disponible. En especial el anuncio de Microsoft de hacer disponible el sistema operacional Windows 8 en la plataforma ARM, adicionalmente a los procesadores de Intel, es una revolución con muchísimos beneficios para nosotros. Así el tiempo trabaja en mi favor, pues no empesaré con el radio control antes de tener navegable mi velero, o sea en 2013. Me imagino que para entonces pode beneficiarme de las experiencias de aquellos que ya se montan en la aventura con los XBee.
Para los cautelosos. A diferencia del curso de electrónica donde soy muy conservador poniendo énfasis en aprender las bases, los radio controles con el XBee se pueden realizar usando partes disponibles y beneficiandose de la inmensa cantidad de aficionados que presentaran y presentan sus soluciones en el internet. Adelante pues, que el éxito se puede alcanzar muy rápido.
Hola, gracias por el comentario hellmult, pero el codigo Call sigo sin compreder no hay informacion ni ejemplo es mas es un codigo muy potente y muy avanzado.
Lo que quiero saber es como funciona el codigo un ejemplo de programacion.
Segun la ayuda que posee el bascom, me dice pero no los entiendo bien.
como siempre. Pregunta en detalle e iré contestando y así paso a paso te facilitaré el entendimiento completo de la sentencia call. esta realmenté es muy potente. Una vez entendido tiene una gram implicación a como programar.
En la programación, como en la tarjeta experimental, el foco que tengo es facilitar los conocimientos pra generar módulos que podamos combinar y adaptar para lo smas diversos objetivos. Pero queda siendo el adquirir una caja de módulos que como las piesas de Lego se combinan para armar muchísimas cosas.
Lo primero que te recomiendo es reemplazar las sentencias "Goto" por Call. Lo que haces en dos pasos lo siguiente:
1. Paso:
Define una subrutina, por ejemplo para definir el ritmo de blinqueo del LED. Pero en vez de definir el ritmo en la rutina de forma fija, usa variables. Entonces al "llamar" la rutina por "Call" le pasas las variables. Asi con una solo rutina, pero modificando el valor de los parámetros que pasas el blinqueo es diferente!
En el caso de la tarea que has demostrado tan prodigiosamente en los videos, el programa resultará mucho mas corto, pues solo habrá una subrutina que llamas de diferentes partes con "Call" y con variables diferentes.
Cuando logres esto habras logrado dos pasos muy importantes.
1. Habras creado tu primer módulo universal, que rsulta en efectos diferentes segun el valor de los parámetros que pases a la subrutina al llamarla.
2. Habras logrado el primer paso en pensar de forma diferente en como programar. No estrás escribiendo rutinas dedicadas a lograr un solo objetivo, sino una rutina genérica Para cada tipo de objetivo.
Empiesa lo mas sencillo posible. Llama una subrutina sin pasar variables. Pero en la rutina define las variables y asignales un valor. Así el programa que ya tienes consistirá de subrutinas idénticas pero con asignaciones de valors diferentes a una variable.
El resultado es que sabras utilizar la sentencia "Call" de la forma mas sencilla.
Eöl segundo paso será usar la misma sentencia "Call", pero pasar las variables.
Cuando llegues a ese punto continuamos.
Muchos éxitos y aquí estoy para responder a cuanta pregunta tengas.
Hola hellmult!!
después de varios dias me marca los errores,error,error y un dolor de cabeza y espero que usted me podría ayudar tal vez goto por call , por desgracia yo no soy experto de programacion sino novato electronico. .......Aquí están los codigo original pero sin call.....
'Experimento-20'
'Micro a usar es atmega8
$regfile = "m8def.dat"
'Cristal interno de oscilacion
$crystal = 1000000
'PinD como salida y entrada
Portd.0 = 1
Portd.1 = 1
Portd.7 = 1
Do
Do
Do
Do
Do
If Pind.0 = 0 Then
If Pind.1 = 0 Then
Goto Funcion0
Else
Goto Funcion1
End If
Else
If Pind.1 = 0 Then
Goto Funcion2
Else
Goto Funcion3
End If
End If
End
Loop
Sería muy valioso que me mandaras los códigos que te dan el dolor de cabeza! mejor aún el publicarlos aquí! eso me permitiría entender por donde reside tu problema y darte las indicaciones de como sobreponerlo.
Realmente lo repito aquí:
El sentarse en su taller y buscarle la solución solo no es método eficaz ni para el que tiene el problema, ni para los otros foreros que desean aprender. Es algo típico en la programación que uno se vuelve ciego por volver y volver a darle a algo de una forma similar. También he visto que con frecuencia el problema reside en no haber adquirido la forma de pensar de programador.
En el caso de Genaro y eso le honra y no lo deja mal parado, es por allí que supongo esta el problema. La sentencia "Call" es una sentencia muy poderosa, pero hay que sacarle la forma de pensar adecuada usándola en un programa. Esa forma es lo que quiero comunicar con estos ejercicios.
Definitivamente me voy a sentar manana y mostrar un buen uso de la sentencia "Call" para el programa que Genaro esta escribiendo. Pero el no es el único que aparentemente tiene este problema. Otro forero muy capaz esta tratando de realizar algo con la placa Amicus, o tratando de copiarla. Que pena que no nos deje participar en el proceso de aprendisaje, todos podriamos aprender mucho. No se como pasar el mensaje a mis amigos foreros de habla cristiana. Déjen de buscar las soluciones como lobo solitario y compartan el proceso de aprendisaje. El salir después de eternidades habiendo solucionado el problema solo es de beneficio para la persona, pero no para los otros foreros tratnado de aprender lo mismo. Además existe siempre mas que un camino a Roma y presentando los problemas en el foro da la oportunidad a terceros de realizar y comunicar otro camino a Roma. Deanse el esfuerzo y sean cooperativos. Es para bien de todos y de cada uno de nosotros.