TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Chaly29 en 31 de Diciembre de 2014, 03:07:35

Título: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 31 de Diciembre de 2014, 03:07:35
Hola a todos, pues mi pregunta es ¿Que lenguaje me recomiendan aprender?

Si, la cosa viene de esta manera. Ya programo en asembler micros de hasta 16F de una manera decente, pero mi interés es empezar a programar micros de una gama mayor hasta llegar a la linea 32, poseo una base de basic, pero siempre e leído que C es bastante superior, el tema es que el C e tratado de aprenderlo y como que no le agarro la onda, tal ves sea que nunca e iniciado de la manera correcta, no lo se...

Y por esto es mi pregunta. Hoy por hoy y ya sabiendo que el C es mejor compilador, ¿Vale la pena que queme neuronas tratando de aprender el C? ¿O bien desarrollo mi base de basic y esto me valdrá para toda la gama?

Desde ya estaré agradecido de las respuestas que puedan darme gente con experiencia es el temas.

Gracias.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Nocturno en 31 de Diciembre de 2014, 04:27:18
Sin duda creo que deberías intentarlo con C. No sólo por lo extendido y lo portable, sino porque es la puerta para entender lenguajes como Javascript, C++, Arduino y muchos otros que son derivados del C.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 31 de Diciembre de 2014, 04:40:53
Yo tambien odie salir del ASM, pero C tiene su encanto y los lenguajes de programacion me resultan faciles al menos son todos parecidos en algun punto (acostumbrado a php y javascript).

Por la extension diria que C es lo mejor, al menos donde miro por otros integrados la mayoria usa C en sus compiladores.

STM32, IAR, KEIL , CCS y e2studio (ambos en Eclipse), Energia, microchip con sus XC

Citar
¿Vale la pena que queme neuronas tratando de aprender el C? ¿O bien desarrollo mi base de basic y esto me valdrá para toda la gama?

Dedicarse a C seria lo mas sensato asi se aprende una sola ves y no tener que dedicarse a basic y luego a C, no vi compilador basic para un pic32 por ejemplo y quedan reservados para micros de no tan alta gama.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: RedPic en 31 de Diciembre de 2014, 05:14:49
Si, Chaly, yo también te aconsejo que te sumerjas profundamente en el C, el idioma C es el padre putativo de toda una familia de idiomas que entenderías mucho mejor si has trabajando antes con C, con cualquier versión de él.

Como dicen Manolo Nocturno y KillerJC, si has trabajado en C después el Java, el Javascript, el C# o el C++, incluso los distintos Pascales y Delphises los lees y comprendes muy bien, algunos de ellos incluso sin que haya diferencias importantes. Las estructuras son las mismas o similares y al final terminas mas bien buscando las diferencias entre ellos que las similitudes ya que éstas son tantas que tienes tres cuartos del camino recorrido para entenderlas.

Y sobre todo viniendo del ASM verás cómo de golpe el mundo es más fácil, cómo de momento puedes ponerte a pensar más o únicamente en qué quieres hacer que en cómo quieres hacerlo, C te facilita enormemente la labor de escribir programas, sus flujos de control y sus estructuras de datos te liberan, con respecto al ASM, de un montón de trabajo inútil que gastas en ASM para hacer cualquier nimiedad.

Eso si, lo pagas con programas compilados un poco mayores y un poco más lentos que los que acostumbrabas a hacer, pero si avanzas lo suficiente y terminas por entender qué hace tu compilador en concreto puedes llegar a hacerlos exactamente igual de eficientes que los que hacías en ASM, y afortunadamente "siempre nos quedará París", quiero decir que siempre tendrás la oportunidad de escribir #asm y #endasm y poner en medio tu trozo de código ASM para esa rutina que no acaba de convencerte en cómo la ha "traducido" tu compilador.

Y por último. Yo he hecho muchas rutinas o incluso programas completos para un 16F, lo he migrado para un 18F y éste otra vez migrado a un 24FJ sin más cambios que los settings iniciales del micro y la asignación de pines ya que utilizando el mismo compilador el 95% del código escrito en C era exactamente el mismo sin cambiarle ni una sola coma.

Y por si todo esto fuera poco una cosa importante: todo Micro tiene su C o varios de ellos. Y quien programa en uno los programa todos.  :mrgreen:
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 31 de Diciembre de 2014, 14:43:46
Hola, yo también pienso que C te va a abrir las puertas para programar cualquier cosa. Desde un PIC12 para prender un relé, hasta recompilar el Kernel de Linux para modificar algo a tu gusto. Saludos.  :mrgreen:
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: PalitroqueZ en 31 de Diciembre de 2014, 16:13:32
hola carlos

me sumo a la lista de sugerencias sobre el lenguaje C

desde que me mudé al C, las cosas se simplificaron bastantes respecto al ensamblador. Tengo rutinas (o funciones) que uso una y otra vez en diferentes microcontroladores, incluso he realizado adaptaciones de codigos que fueron hechos para otros micros (no microchip) dejando casi intacto el código original.

recientemente estoy manejando arduino y la programación es casi identica a la que uso con compiladores de C para micros.

el basic también compite en el mundo de la programación para micros, pero no se, ya le agarré gusto al C  :D
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: planeta9999 en 31 de Diciembre de 2014, 16:46:39


El C es el lenguaje más universal y portable que existe.
Con respecto a otros lenguajes de alto nivel, solo tiene como particularidades los PUNTEROS y las CLASES (en C++), en el resto es comparable a cualquier otro lenguaje de alto nivel, practicamente te encuentras en todos el mismo tipo de instrucciones.

Los punteros, no son dificiles de entender, el tema de las clases (en C++) ya es bastante más complejo, yo ahí me perdí un poco cuando me metí con Visual Studio, la verdad es que al final te produce una empanada mental tremenda, que si los containers, las herencias, el constructor, el destructor y todas esas gaitas, es un jaleo curioso.

Además si aprendes C, cuando tengas que tocar Java, te resultará muy familiar en muchos aspectos. Sin duda alguna ,el C es un lenguaje imprescindible, tanto para programar micros, como para desarrollos para PC.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 31 de Diciembre de 2014, 17:30:51
Creo que no se puede agregar mas nada, vas a tener que ir por el C!!!!!

te pongo un ejemplo de lo que todos dicen de laportabilidad. En este post (http://www.todopic.com.ar/foros/index.php?topic=42254.msg353000#msg353000) estaba trabajando con un micro ARM y necesitaba una funcion para graficar puntos y lineas en un buffer de memoria y cito lo del post para resumir:

"Luefo para imprimir una línea uso exactemente la misma funcion de Ariel, creo que no toque nada, solo la definicion de variables... de hecho aún no estudie como funciona  Shocked:

Código: [Seleccionar]
//-----------------------------------------------------------------------
// Dibuja una linea desde (x1,y1) a (x2,y2) de color (0 o 1)
//-----------------------------------------------------------------------
void OSD_linea(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, char color)
{
   //Declaro variables-------------------
   signed short  x, y, incremento_x, incremento_y, distancia_x, distancia_y;
   signed short P;
   short i;

   //Calculo las diferencias entre las coordenadas de origen y destino
   distancia_x = fabs((signed short)(x2 - x1));
   distancia_y = fabs((signed short)(y2 - y1));

   //Inicializo x e y con las coordenadas de origen
   x = x1;
   y = y1;

   //Calculo el sentido de los incrementos (positivos o negativos)
   //en funcion de la posicion del origen y el destino
   if(x1 > x2) incremento_x = -1; else incremento_x = 1;
   if(y1 > y2) incremento_y = -1; else incremento_y = 1;

   //Si la distancia horizontal es mayor a la vertical...
   if(distancia_x >= distancia_y)
   { P = 2 * distancia_y - distancia_x;
      for(i=0; i<=distancia_x; ++i)
      {
      OSD_punto(x, y, color);

         if(P < 0)
         { P += 2 * distancia_y;
            x += incremento_x; }
         else
         { P += 2*distancia_y - 2*distancia_x;
            x += incremento_x;
            y += incremento_y;}
      }
   }

   //Si la distancia vertical es mayor a la horizontal...
   else
   { P = 2 * distancia_x - distancia_y;
      for(i=0; i<=distancia_y; ++i)
      { OSD_punto(x, y, color);
         if(P < 0)
         {  P += 2 * distancia_x;
            y += incremento_y; }
         else
         {  P += 2 * distancia_x - 2 * distancia_y;
            x += incremento_x;
            y += incremento_y; }
      }
   }
}
//-----------------------------------------------------------------------

Ese código, que aún sigo sin estudiar y ver como funciona, esta escrito para un micro de 8 bit de microchip, yo lo copié y pegue en el compilador del ARM y voila! anda de una sin tocar nada de nada incluso entre 2 tipos de uC totalmente distintos...

Saludos y buen año!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 31 de Diciembre de 2014, 18:01:35
Hola ElGarbe, quisiera agregar un pequeño tip sobre tu comentario. La función que publicas puede no ser tan portable como parece. Los tipos de variables y su peso cambia entre compiladores. Es importante seguir de cerca los tamaños de las variables.

Eso se soluciona muy rápidamente definiendo tipos comunes como el uint8_t o el uint64_t. Se declaran como typedefs o defines en cada arquitectura o compilador. El código deberá usar sólo esos tipos, nunca hay que usar int, long, short, etc. ya que sus tamaños dependen del compilador. Ya ves que hay int de 8 bits (CCS), int de 16 bits (XC8) o int de 32 bits (XC32). Pero si se usa un uint32_t y su typedef está correctamente ligado al tamaño real del compilador destino, entonces tu código sí que será portable al 100%.

Saludos.  :)
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 31 de Diciembre de 2014, 18:52:17
Hola ElGarbe, quisiera agregar un pequeño tip sobre tu comentario. La función que publicas puede no ser tan portable como parece. Los tipos de variables y su peso cambia entre compiladores. Es importante seguir de cerca los tamaños de las variables.

Eso se soluciona muy rápidamente definiendo tipos comunes como el uint8_t o el uint64_t. Se declaran como typedefs o defines en cada arquitectura o compilador. El código deberá usar sólo esos tipos, nunca hay que usar int, long, short, etc. ya que sus tamaños dependen del compilador. Ya ves que hay int de 8 bits (CCS), int de 16 bits (XC8) o int de 32 bits (XC32). Pero si se usa un uint32_t y su typedef está correctamente ligado al tamaño real del compilador destino, entonces tu código sí que será portable al 100%.

Saludos.  :)

+1 no hace mucho que aprendi lo que comentas y aun me cuesta acostumbrarme.
No estaría mal un post con "buenas practicas de programacion", no?

Saludos!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 31 de Diciembre de 2014, 19:09:31
yo siempre utilize los uint32_t int32_t  como sea por que era lo unico que me quedaba claro a la hora de saber cuantos bits tenian... con eso de int que variaba en cada procesador era una locura saber para un micro de 8/16/32 bits cada uno de los valores. entonces utilize siempre esos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 31 de Diciembre de 2014, 19:53:33
Hola a todos y muchas gracias por su tan pronta respuesta, no me esperaba tantas respuesta en tan corto tiempo y menos de gente tan capaz como son todos ustedes, pues bueno, veo que el voto unánime es el C, y por ese lenguaje deberé ir....

Veo que tienen amplia experiencia en el tema y por supuesto, en algún momento han debido aprenderlo. Que consejos me dais para ver si puedo agarrarle la mano? Teniendo en cuenta que no se nada de nada, mis pocos intentos fueron en CCS y la parte de configuración la e entendido, pero pasando de esto, no logro comprender la/las funciones de cada instrucción, e leído ese pdf. que anda por la web sobre la definición de las instrucciones para CCS, pero parece para mí que estuviera escrito en chino...

Será que estoy muy acostumbrado al .asm que tal instrucción hace tal cosa, modifica tales registros y se tienen tales resultados? Todo bien simple y conciso.

Muchas gracias, un saludo a todos. Y FELICES FIESTAS!!! Que la pasen muy lindo con los suyos y de la mejor manera posible.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 31 de Diciembre de 2014, 22:23:19
Carlos, para mi, lo mejor es el xc8. El ccs lo deje por que me costaba entender las funciones enlatadas que trae. No digo que sea malo ni mucho menos, solo que a mi me resulto mucho mas fácil el xc8.
Creo que lo primero seria que definas el compilador, luego solo buscar algún tutoriales paso a paso, incluso algún videotutorial en youtube. Ahora estoy en el celu, pero después busco alguno y te pongo el link. Igual seguro que el resto debe tener alguna sugerencia mas

Lo que me gusta del xc8 es que trae como definición de datos los puertos y todos los registros con nombre igual al datasheet, entonces tenés un registro llamado portb de 8 bits y tenés PORTBbits.RB0 para modificar solo ese bit. Tmb renes, por ejemplo, INTCONbits.RBIF que coincide en definición con el bit Rbif del registro intcon, con nombre igual al que aparece en el datasheet.

Saludos y buen año!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 31 de Diciembre de 2014, 23:34:43
Si es para PIC yo tambien recomendaria XC, puede tener algunas desventajas con respecto a CCS ( por ejemplo veo que en CCS hacer una UART por soft te lleva una linea ), pero XC es de microchip, eso quiere decir que los micros vas a ser soportados por el compilador si o si ( o esperando un poco de tiempo ). La principal diferencia con ASM es que ahora en ves de tener una hoja con las instrucciones / registros a tu lado , tendrias una hoja con las funciones de las API que uses ( si es que usas - peripherical library ) por ahi incluso liberandote de saber que registros se deben modificar.

Consejos para agarrarle la mano? es empezar de a poco xD e ir agregando conocimientos
En si lo que voy a pasar es C, el tutorial esta hecho para PC, pero aplica exactamente a un micro. Incluso podes crear un archivo en modelo que trae el MPLAB asi el armado resulta un poco mas facil.

Primero conocer los operadores ( la diferencia entre un = y un == , entre otras )
http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

Aprender sobre las funciones/prototipos ( empezando por algo simple que no retornen nigun valor, luego pasandole valores y que retornen un valor, luego despues que aprendas punteros podes pasarlo por ahi)
Variables locales/globales, diferencias.
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Uso_de_funciones

Loops ( for, while, do-while(diferencia con while), switch-case, if-else )
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Instrucciones_de_control

Eso es lo mas simple, luego agregas Vectores (n dimensiones,comenzas con 1, tambien aprender sobre los indices que el primer elemento es el 0):
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Vectores
Con eso ya te podes meter a que son los "strings" o cadena de caracteres
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Cadenas_de_caracteres

Luego podes empezar a ver el usar archivos cabeceras y otros archivos para poder hacer tus propios funciones y luego llamarlas desde tu programa principal.

Y recien ahi me meteria con punteros o estructuras. Punteros te va a resultar facil si entendes el uso de los registros FSR e INDF del micro (Acceso indirecto)
Creo que es el hilo por el cual iria para aprender C, no nombre variables por que en los post anteriores ya dijeron que mejor acostumbrarse usando uint8_t ( Unsigned y de 8 bit ) u otros (uint16_t e int16_t y tabmien para 32 bits). Es mas intuitivo que saber cuantos bits tiene un int.

Eso es C, realmente no recuerdo si me olvido algo, pero como todo cuando empezas todos sabemos que comenzamos prendiendo un led con un delay y luego vamos agregando.
Y entre eso y mirando otros codigos le vas a agarrar la mano rapidamente, una dirferencia con basic es que no comenzas con un IF y ENDIF sino que todo esta delimitado por llaves  if(condicion){ }
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: RALF2 en 01 de Enero de 2015, 13:55:39
Para iniciarte a mi me gusta el ccs ayuda muchiiisimo!  :D
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: jansuini en 01 de Enero de 2015, 15:19:20
Charly:
Hay un par de PDFs de cursos para iniciarse con el C de CCS ,uno en castellano y otro del mismo CCS para implementarlo con una plaquita de desarrollo vendida por ellos.-
Si los encuentro te los envio.-
Lo que te sugiero también ,que es bastante práctico el ICD de CCS ,venía uno por puerto serie y era interesante para seguir el desarrollo pasao a paso de un programa.-
Imagino que en google algo debe aparecer.-

Sds.-
Jorge
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 01 de Enero de 2015, 16:09:06
Chaly, yo te recomiendo empezar con XC8 de Microchip. Verás que lo que hacías en ASM lo deberás seguir usando en XC8... pero ahora en C. Podrás ver equivalencias entre lo que hacías en ensamblador y lo que ahora tendrás que hacer en C.

Ya lo he mencionado antes, CCS es como Arduino, te ayuda a desarrollar funcionalidades muy rápidamente, pero no te ayuda a aprender qué hace el microcontrolador directamente. ElGarbe lo describe como funciones enlatadas de CCS. XC sí te permite ver qué hace el micro.

Sabiendo que eres bueno en ASM, moverte a un compilador en donde haces todo desde cero no te costará trabajo y sólo deberás enfocarte en aprender C.

Como primera práctica te sugiero que prendas un LED. Vas a tener que configurar los registros de configuración del PIC, aprender a usar la función main en C, aprender a escribir registros, etc. Te llevará un ratito, pero habrás aprendido mucho.

Y si se te complica algo, pues para eso estamos... para complicártelo más jajaj no es cierto... ya sabes para qué estamos.

Saludos.  8)
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 01 de Enero de 2015, 16:14:50
+1 no hace mucho que aprendi lo que comentas y aun me cuesta acostumbrarme.
No estaría mal un post con "buenas practicas de programacion", no?

Saludos!

Hola ElGarbe, normalmente esas prácticas se pueden encapsular como estándares de programación. Cómo escribir nombres de variables, dónde usar typedefs, estilos de estructuración del código, estilos de funciones y dónde usarlas, sabiendo usar static, espacios en el código, etc.

Aquí un ejemplo...

http://users.ece.cmu.edu/~eno/coding/CCodingStandard.html

Facilitan mucho la vida... no sólo para hacer el código portable, sino también para hacerlo legible.  ;-)
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 01 de Enero de 2015, 16:55:02
+1 no hace mucho que aprendi lo que comentas y aun me cuesta acostumbrarme.
No estaría mal un post con "buenas practicas de programacion", no?

Saludos!

Hola ElGarbe, normalmente esas prácticas se pueden encapsular como estándares de programación. Cómo escribir nombres de variables, dónde usar typedefs, estilos de estructuración del código, estilos de funciones y dónde usarlas, sabiendo usar static, espacios en el código, etc.

Aquí un ejemplo...

http://users.ece.cmu.edu/~eno/coding/CCodingStandard.html

Facilitan mucho la vida... no sólo para hacer el código portable, sino también para hacerlo legible.  ;-)
Uffff, cuantas cosas me faltan! Que lindo sería saber todo eso, estoy con unos desarrollos que serían mas que interesante aplicar todas esas pautas!
Tendrás algo como para ampliar en cuanto a layers?

Saludos!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: PalitroqueZ en 01 de Enero de 2015, 17:40:13
Carlos y esa sería tu segunda búsqueda una vez elegido el lenguaje. ¿qué compilador escoger? ¿cuál es más fácil? ¿cuál es mas potente?  :D

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 01 de Enero de 2015, 18:35:42
Uffff, cuantas cosas me faltan! Que lindo sería saber todo eso, estoy con unos desarrollos que serían mas que interesante aplicar todas esas pautas!
Tendrás algo como para ampliar en cuanto a layers?

Saludos!

Mmmhh... ¿a qué te refieres con layers?
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 01 de Enero de 2015, 19:01:29
Uffff, cuantas cosas me faltan! Que lindo sería saber todo eso, estoy con unos desarrollos que serían mas que interesante aplicar todas esas pautas!
Tendrás algo como para ampliar en cuanto a layers?

Saludos!

Mmmhh... ¿a qué te refieres con layers?

http://users.ece.cmu.edu/~eno/coding/CCodingStandard.html#layering

entiendo que en muchos sistemas complejos suele utilizarzo algo llamado HAL (hardware abstraction layer) y luego la capa del Sistema propiamente dicho, lo que facilita la portabilidad del sistema a otro hardware/uC...

Pero quizá esto de para otro post, no quiero desvirtuarle el post a Carlos.

Saludos y gracias!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 01 de Enero de 2015, 20:07:28

entiendo que en muchos sistemas complejos suele utilizarzo algo llamado HAL (hardware abstraction layer) y luego la capa del Sistema propiamente dicho, lo que facilita la portabilidad del sistema a otro hardware/uC...

Pero quizá esto de para otro post, no quiero desvirtuarle el post a Carlos.

Saludos y gracias!

El post creo que ya tuvo su resultado, solo le queda decidirse por un compilador pero eso va a depender de el.

El HAL pensalo como una API de perifericos. Un ejemplo seria no pensar en los registros, sino que directametne pongas UART(baudios,bits de datos,bit de stop, paridad, pines) y listo ya tenes configurado tu UART sin siquiera saber como funciona el hardware o los bits de interrupcion, etc.

Primer capa - funciones para la modificacion de los registros seria un ejemplo, puede ser en ASM o C como quieras. Estas retornan valores para la segunda capa, esos valores deberian tener un estándar, y para cualquier micro cumplirse el mismo ( asi no cambias la segunda capa para nada)
Segunda capa - Que haga algo mas elaborado, siguiendo el ejemplo de la UART, calcular los baudios, setear registros usando las funciones SOLO de la primer capa. Crear una funcion para enviar un byte, tambien un standar para comunicarse con la tercer capa.
Tercer capa - El uso del printf para enviar una cadena + variables usando lo de la segunda capa nomas.

A su ves podria tener otra tercer capa de otro modulo que me permita debuggear por ejemplo por el UART y usar el printf, ya que ambas son de 3er capa y se deberia poder comunicar

La abstraccion del hardware cada ves es mayor ( menos te interesan los registros, los bits, como configurarlos, etc ). La portabilidad es de las capas superiorres pero si o si deberias de modificar la primer capa que seria la distintiva del micro.
Entonces modificando la primera deberias tener funcionando todo lo demas. O teniendo la primera podes definirla para varios micro con IFDEF

Esta mas que claro que esto seria para un proyecto donde no exista ninguna API ni nada por el estilo y se comenzara de 0.

Ejemplos donde ocurre esto hay varios pero por ejemplo las librerias Fatfs de chan, tenes todas sus funciones pero tenes que definir la conexcion, la inicializacion del hard(SPI), el timer en otro archivo entre otros.
Otro tambien muy simple de ver es una comunicacion http, http usa TCP ( pero TCP es tambien usado por FTP,POP, entre otros ) , TCP usa IP ( pero tambien UDP usa IP ) y asi bajando hasta lo que es el hw como ethernet,token ring, entre otros
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: migsantiago en 01 de Enero de 2015, 20:36:52
Ohh ya entendí. Si gustas abre un tema nuevo y por allá lo platicamos. Las HAL son muy prácticas. Yo acostumbro hacer APIs con callbacks.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 02 de Enero de 2015, 00:50:28
Hola y gracias a todos nuevamente, que calidad de respuestas están posteando, realmente muy buenas y muy claras.

Pues bueno, creo que lo más conveniente para mi caso y porque varios han acertado en el mismo diría que elegiré el XC8, como ya e intentado con el CCS y no e conseguido mucho, y los que saben dicen que en muchas definiciones es similar al .asm, se cae de maduro que lo lógico sería el XC8.

KILLERJC, muy buenos tus datos, creo y por la mirada rápida que e echado a cada link que me será más fácil de entender con estos datos que aportaste. Ahora tendré que ponerme a estudiar un poco.  ;-)

Ya estoy descargando (calculo es la versión FREE) de la página de microchip, imagino que sabiendo programar en XC8 luego en XC16 y XC32 debe de ser muy similar. ¿Es esto así?

Nuevamente, muchas gracias por sus prontas respuestas.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 02 de Enero de 2015, 07:46:44
Hola Carlos. Imagíno que sabes que el compilador convierte el código C a ensamblador y a código máquina.
La mayoría de compiladores te dan la opción de ver este código ensamblador junto al código C que lo ha generado.
De esta manera puedes hacer mejor la transición al C.



El compilador que conozco que genera código ASM más limpio es el CCX5:
http://www.bknd.com/cc5x

Es gratuíto y bastante bueno. Si vienes del ASM, te resultará mucho más facil entender su código generado.
La parte negativa es que no se adapta exactamente al estandar C y que más tarde o temprano tendrás que pasar a otro como el XC8.
En todo caso es muy muy semejante a otros compiladores. Lo único que cambian son detalles como el nombre de las rutinas de interrupción o la forma de declarar los bits.


Ejemplo en código C:
Código: [Seleccionar]
#include "16F883.H"      // Define el microcontrolador que se va a utilizar

#pragma origin = 0x10    // Dirección de origen del código
 
void main(void) {        // Función principal (Siempre se llama main)
   unsigned char i;      // Declaro una variable llamada i como un byte (un caracter char) sin signo
  
   TRISB.7 = 0;          // Puerto B7 es una salida
  
   i = 100;              // La variable i es igual a 100
   do {
      PORTB.7 = 1;       // El puerto B7 vale 1
      PORTB.7 = 0;        
   } while (--i != 0);   // Decrementa la variable i.
                         // Repite el bucle mientras i no valga cero
}

Código ensamblador generado:
Código: [Seleccionar]
; CC5X Version 3.5, Copyright (c) B Knudsen Data
; C compiler for the PICmicro family
; ************   2. Jan 2015  11:45  *************

processor  16F883
radix  DEC

PORTB       EQU   0x06
TRISB       EQU   0x86
RP0         EQU   5
RP1         EQU   6
i           EQU   0x20

GOTO main

  ; FILE mini.c
;#include "16F883.H"      // Define el microcontrolador que se va a utilizar
;
;#pragma origin = 0x10    // Dirección de origen del código
ORG 0x0010
;
;void main(void) {        // Función principal (Siempre se llama main)
main
;   unsigned char i;      // Declaro una variable llamada i como un byte (un caracter char) sin signo
;  
;   TRISB.7 = 0;          // Puerto B7 es una salida
BSF   0x03,RP0
BCF   0x03,RP1
BCF   TRISB,7
;  
;   i = 100;              // La variable i es igual a 100
MOVLW 100
BCF   0x03,RP0
MOVWF i
;   do {
;      PORTB.7 = 1;       // El puerto B7 vale 1
m001 BCF   0x03,RP0
BCF   0x03,RP1
BSF   PORTB,7
;      PORTB.7 = 0;        
BCF   PORTB,7
;   } while (--i != 0);   // Decrementa la variable i.
DECFSZ i,1
GOTO  m001
;                         // Repite el bucle mientras i no valga cero
;}
SLEEP
GOTO main

END


; *** KEY INFO ***

; 0x0010 P0   14 word(s)  0 % : main

; RAM usage: 1 bytes (1 local), 255 bytes free
; Maximum call level: 0
;  Codepage 0 has   15 word(s) :   0 %
;  Codepage 1 has    0 word(s) :   0 %
; Total of 15 code words (0 %)


Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 02 de Enero de 2015, 09:27:47
Hola Picuino. Que madrugón para empezar a contestar  ((:-))  ((:-))

Si, ya sabía que es posible ver el código .asm ya sea usando compiladores C o BASIC, por supuesto eso es una ventaja. Pero creo que prefiero directamente iniciar en XC8 para no hacerme tanto matete en la cabeza y arrancar de una con el programa definitivo que voy a usar.
Por supuesto es de suponer que por ahí cueste un poco más que usando el CCX5, pero e estado mirando ejemplos en XC8 y creo que los e entendido mejor que por ejemplo en CCS, por supuesto estos eran programas ejemplos muy básicos, pero como que me fue más intuitivo ya que XC8 usa definiciones más parecidas al .asm, tal cual como me lo a comentado elgarbe y migsantiago

Veremos que pasa, igual muchas gracias por el aporte.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 03 de Enero de 2015, 00:46:39
Hola a todos, este post solo es para aclarar la siguiente linea que e escrito:

Hola Picuino. Que madrugón para empezar a contestar  ((:-))  ((:-))

Madrugón sería levantarse temprano por la mañana, y resulta que cuando veo la hora de la última respuesta de Picuino serían las 7:30 hora local para mí, y me causo gracia y admiración que alguien este tan temprano respondiendo por el foro. Pero claro, después caí en la cuenta que don Picuino es de España y para el serían las 12:30.

Como hubo una mal interpretación del mensaje, que por supuesto fue solo en tono humorístico, es que en estas líneas aclaro este punto, para que nadie tome a mal lo por mí escrito.

De más esta decir que el foro está "abierto" las 24 Hs y cada cual es libre ya sea de preguntar o responder a la hora que le plazca o le quede más cómodo, este horario lo rige el participante y por supuesto nadie debe sentirse contrariado por esto.

Pido perdón por la mala interpretación que haya podido generar mi mensaje, tal como ya lo dije no a sido para ofender o molestar a nadie.

Por supuesto y desde ya estoy muy agradecido a todos los que han respondido a mis preguntas por invertir su tan valioso tiempo, y por ser parte de este foro.

Sin más pido disculpas nuevamente.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 03 de Enero de 2015, 14:34:55
Hola Carlos, disculpa por el malentendido.

Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 03 de Enero de 2015, 15:05:53
Te comento sobre el XC8 con el que ahora estoy programando.

El programar en C te da la facilidad de manejar datos complejos con facilidad.
Tengo una estructura de datos que contiene 4 bytes, cada uno con su significado.
Por otro lado tengo un array que contiene 6 estructuras iguales (una especie de base de datos)
He programado una operación en la que se copia la estructura en una posición del array:

    keyb_database[ i ] = keyb;

Con esto guardo los 4 bytes de la estructura keyb en la posición i del array. El código generado por XC8 para hacer esto es de 20 instrucciones:

Código: [Seleccionar]
0149  0872     MOVF i, W
014A  00F1     MOVWF 0x71
014B  3001     MOVLW 0x1
014C  35F1     LSLF 0x71, F
014D  3EFF     ADDLW 0xFF
014E  1D03     BTFSS STATUS, 0x2
014F  294C     GOTO 0x14C
0150  3571     LSLF 0x71, W
0151  3E20     ADDLW 0x20
0152  0086     MOVWF FSR1
0153  0187     CLRF FSR1H
0154  0020     MOVLB 0x0
0155  0840     MOVF keyb, W
0156  3FC0     MOVWI [0]FSR1
0157  0841     MOVF 0x41, W
0158  3FC1     MOVWI [1]FSR1
0159  0842     MOVF 0x42, W
015A  3FC2     MOVWI [2]FSR1
015B  0843     MOVF 0x43, W
015C  3FC3     MOVWI [3]FSR1

Cuando manejas datos en coma flotante, pasa lo mismo. Una sola instrucción en C, te ahorra escribir muchas instrucciones en código máquina y reescribirlas cuando cambias de microcontrolador.

P.D.: Utilizo el compilador free, sin optimizaciones, por eso puede que haya más instrucciones ASM que en el compilador Full.


Un saludo y mucho ánimo con el nuevo lenguaje.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 03 de Enero de 2015, 17:49:36
Hola Picuino, claro, es eso exactamente lo que estoy buscando, si bien puedo y lo e echo a la programación en .asm de un 18F, calcula que es un lío importante de instrucciones cuando estás queriendo realizar algún programa bastante complejo.

Ahora que estamos en fin de semana me voy a poner a full a ver lo que pasa!!

Al XC8 lo descargue de la misma página de microchip y tal como mencionas es la versión free, e leído que no optimiza tanto como la versión de pago, pero para aprender me va de maravillas. Y aunque todavía ni se como abrir un nuevo proyecto, pues ya lo investigaré esta noche con más tranquilidad y tiempo.

Nuevamente muchas gracias a todos por la ayuda.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 04 de Enero de 2015, 15:45:26
Charly, también necesitas un IDE

Yo he usado el MPLAB IDE V8 y ahora uso el MPLAB X IDE
Yo prefiero el MPLAB v8 por ser mucho más intuitivo y rápido, pero está obsoleto y no soporta el PIC16F1719 con el que estoy trabajando.

Aprovecho para comentar las ventajas del PIC16F1719:
tiene Peripheral Pin Select y puedes conectar cualquier periférico a casi cualquier salida del micro. Esto facilita mucho la vida para hacer el PCB de un micro con 44 pines.
Tiene 3 módulos CLC (parecidos a un CPLD).
Oscilador NCO de precisión,
4 PWM,
5 Timers,
2 DAC,
ADC de 10bit,
detección de cruce por cero,
amplificadores operacionales,
interrupciones por cambio de estado de cualquier entrada,
nivel lógico seleccionable TTL/CMOS independiente para cada entrada,
trabaja a 32MHz internos,
memoria de 16kwords Flash para programa y 2kbytes de RAM,
Y un precio de 1.76 Euros para 10 unidades (http://www.mouser.es/ProductDetail/Microchip-Technology/PIC16F1719-I-PT/?qs=sGAEpiMZZMvqv2n3s2xjsZgUB1jPAEqBP9PrLuWOhpXtotz6TvrcXQ%3d%3d)


Es un micro lleno de periféricos muy interesantes a un precio económico. Imagino que los nuevos desarrollos de Microchip irán por ese camino, de manera que nos quitarán las ganas de usar micros antiguos.
Esto requiere usar el MPLAB X:
http://www.microchip.com/pagehandler/en-us/family/mplabx

Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 04 de Enero de 2015, 17:17:51
Hola Picuino, hasta ahora al XC8 me parece que lo llevo bastante bien, obviamente falta muchísimo camino por recorrer, pero me resulta mucho más fácil que el CCS, incluso hay muchas instrucciones que son intuitivas gracias al previo conocimiento de .asm que poseo.

Yo siempre uso en .asm una pequeña rutina para manejar los LCD's, la e realizado en XC8 y si bien es más fácil y rápida de comprender, incluso de programar, la contra es que en .asm me ocupaba solo 180 posiciones de memoria de programa y en XC8 me ocupa 290, una diferencia importante.
Pero bueno, es un precio bajo a pagar (si logro llegar a manejar bien el C) por la comodidad y velocidad de programación.

Lo que no e podido hacer es el manejo de un solo bit dentro de una variable, ya sea setearlo, borrarlo o comprobarlo, pero bueno, seguiré intentando.

Gracias por la data. Un saludo.

Atte. CARLOS.

Pda. Todavía estamos muy lejos de poder conseguir un micro de esos acá en Argentina, van a tener que pasar unos cuantos años. Pero es bueno saberlo que están en camino.  ;-)

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 04 de Enero de 2015, 17:42:53
En el post anterior me refería al IDE, al entorno gráfico con el que manejas XC8. Hay varios, el actual es el MPLAB X, creo que el mejor para empezar.


En cuanto a poder manejar bits dentro de una variable, tienes dos formas.

Setear y resetear el bit 5 de un byte (el bit 0 es el de la derecha y el 7 el de la izquierda) con operaciones lógicas:

Código: [Seleccionar]

   unsigned char b;       // b es una variable de 8 bits sin signo
  
   b = 0b11001100;       // Ahora b  vale 11001100 (en binario)

   b |= 0b00100000;     // Ahora he hecho un OR con el bit 5 a uno y la variable vale 0b11101100
   b |= (1<<5);           // Lo mismo que antes. El número 0b00100000 lo he creado desplazando un uno hacia la izquierda 5 veces


   b &= 0b11011111;   // Ahora he hecho un AND con el bit 5 a cero y la variable vale otra vez 0b11001100
   b &= ~(1<<5);         // Lo mismo que antes, desplazando un uno cinco veces a la izquierda, y por último se invierte el numero (operación ~)


//
// Lo mismo de antes un poco más fácil:
//

   b = 0b11001100;       // Ahora b  vale 11001100 (en binario)

   b = b | 0b00100000;     // Ahora he hecho un OR con el bit 5 a uno y la variable vale 0b11101100
   b = b | (1<<5);           // Lo mismo que antes. El número 0b00100000 lo he creado desplazando un uno hacia la izquierda 5 veces


   b = b & 0b11011111;   // Ahora he hecho un AND con el bit 5 a cero y la variable vale otra vez 0b11001100
   b = b & ~(1<<5);         // Lo mismo que antes, desplazando un uno cinco veces a la izquierda, y por último se invierte el numero (operación ~)


Hay más formas, por ahora esta te puede valer.


Saludos.




P.D.: hay una forma más bonita para la vista de hacer un not binario sin utilizar el operador '~', con la operación XOR:

   b = b ^ 0b11111111;     // La variable b cambia todos sus bits de valor (NOT binario)

El símbolo ~ sale del teclado español pulsando [ALT]+126

Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 04 de Enero de 2015, 19:14:31
A mi me daria miedo hacer esto:

Citar
b &= ~(1<<5);

Por que no se como lo va a toma el compilador, si va a hacer esas rotaciones o no, no deberia PERO no me confio, y para mi es mas claro

el toggle:
var ^= 0x01
Puesta a 0
var &=~(0x01)  o var &= 0xFE
Y puesta a uno con el OR |=
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 04 de Enero de 2015, 19:29:05
En C no se pueden hacer rotaciones, solo desplazamientos.
Cuando desplazas siempre se rellena con ceros, (creo que la excepción es al desplazar un número negativo a la derecha, que se rellena con unos)
El compilador se asegura de eso poniendo el carry a cero (o a uno en el caso de negativos) antes del desplazamiento.

En este caso, como es una constante, no hay problema. (1<<5)  es siempre igual a 0b00100000 = 32d
A mi me gusta utilizar este método porque queda más claro cual es el bit que pones a uno.


Puedes utilizar también una macro con este sistema:

#define SET_BIT(var, bit)       var |= (1<<bit)
#define RESET_BIT(var, bit)   var &= ~(1<<bit)


SET_BIT(b, 5);        // Esta instrucción pone a uno el bit 5 de la variable b
RESET_BIT(b, 5);    // Esta instrucción pone a cero el bit 5 de la variable b



Con respecto al microcontrolador 16F1719, ya he leído anteriormente que en Argentina hay problemas con las importaciones.
He encontrado el micro en Mouser Argentina:
http://ar.mouser.com/ProductDetail/Microchip-Technology/PIC16F1719-I-PT/?qs=sGAEpiMZZMvqv2n3s2xjsZgUB1jPAEqBP9PrLuWOhpXtotz6TvrcXQ%3d%3d
¿También en este caso hay problemas de suministro?


Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 04 de Enero de 2015, 22:10:30

Lo que no e podido hacer es el manejo de un solo bit dentro de una variable, ya sea setearlo, borrarlo o comprobarlo, pero bueno, seguiré intentando.


Carlos, generalizo a lo que dice picuino y killer, eso lo enontras como Bit masking:
http://en.wikipedia.org/wiki/Mask_%28computing%29

hay otra técnica pero no puedo acordarme el nombre, seguro los muchachos lo van a agregar.

Saludos y exito con el C!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 04 de Enero de 2015, 22:14:15

Con respecto al microcontrolador 16F1719, ya he leído anteriormente que en Argentina hay problemas con las importaciones.
He encontrado el micro en Mouser Argentina:
http://ar.mouser.com/ProductDetail/Microchip-Technology/PIC16F1719-I-PT/?qs=sGAEpiMZZMvqv2n3s2xjsZgUB1jPAEqBP9PrLuWOhpXtotz6TvrcXQ%3d%3d
¿También en este caso hay problemas de suministro?

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...

Saludos!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 04 de Enero de 2015, 22:34:30

hay otra técnica pero no puedo acordarme el nombre, seguro los muchachos lo van a agregar.


Lo que creo que decis es el bit banding ( lo vi en los ARM ). Quoteo de wikipedia:

Citar
Bit-banding: Maps a complete word of memory onto a single bit in the bit-band region. For example, writing to an alias word will set or clear the corresponding bit in the bitband region. This allows every individual bit in the bit-banding region to be directly accessible from a word-aligned address, and individual bits to be toggled from C/C++ without performing a read-modify-write sequence of instructions

Es decir hay una region de memoria destinada a conservar la direccion y la posicion de bit, normalmente modificar un bit llevaria 3 instrucciones ( carga , modificacion(or/and) y guardado ) , aunque en realidad lleva unos 5 si no esta bien optimizado xD. En fin. con el otro directamente escribis en esa posicion de memoria y estarias escribiendo el bit directamente.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 05 de Enero de 2015, 05:56:10
Hay otra técnica que consiste en poner nombre a los bits:

Código: [Seleccionar]

struct {
      unsigned flag0:1;
      unsigned flag1:1;
      unsigned flag2:1;
      unsigned flag3:1;
      unsigned flag4:1;
      unsigned flag5:1;
      unsigned flag6:1;
      unsigned flag7:1;
} variable;

void main(void) {

   variable.flag5 = 0;

}

Si quieres acceder a la vez a todos los bits, tienes que declarar una unión de bits + byte:

Código: [Seleccionar]

union {
   unsigned char byte;
   struct {
      unsigned flag0:1;
      unsigned flag1:1;
      unsigned flag2:1;
      unsigned flag3:1;
      unsigned flag4:1;
      unsigned flag5:1;
      unsigned flag6:1;
      unsigned flag7:1;
   };
} variable;

void main(void) {
   variable.byte = 0b11001100;
   variable.flag5 = 0;
}


Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 05 de Enero de 2015, 08:42:22

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...


He visto que en la web de Elemon hay varios micros modernos de la serie PIC16 (PIC16F17xx,  PIC16F18xx,  etc)

La mayoría de esos micros necesitan para programarlos el compilador XC8 y el IDE MPLAB X, de manera que estas son las mejores opciones para comenzar, puesto que tienen más futuro y dan soporte a más micros.


Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 05 de Enero de 2015, 09:06:25

Entiendo que no existe mouser en Argentina, es solo un sitio web (el .ar), pero físicamente no tienen almacenes en Argentina.
El representante odicial de Microchip es Elemon y la unica forma de que traigan algo como eso es comprarles un reel entero...


He visto que en la web de Elemon hay varios micros modernos de la serie PIC16 (PIC16F17xx,  PIC16F18xx,  etc)

La mayoría de esos micros necesitan para programarlos el compilador XC8 y el IDE MPLAB X, de manera que estas son las mejores opciones para comenzar, puesto que tienen más futuro y dan soporte a más micros.


Un saludo.

Este es el stock de elemon de esos micros:

Descripción   Cant. Ofre.   Precio Unitario   Stock
PIC16F1713-I/SP 28SPDIP 7KB Flash, 512B RAM PWM, COG, NCO, ZCD, CLC, PP   50   3,630   
PIC16F1786-I/SP 28SPDIP 14KB Flash, 1KB RAM, 256B EEPROM, ADC, DAC, PSMC, OPAmp   1   4,640   
PIC16F1789-I/P 40PDIP 28KB Flash, 2KB RAM, 256B EEPROM PSMC, OPAmp, FastComp, CCP   34   5,500   
PIC16F1823T-I/ML 3.5KB Flash, 128 bytes RAM, 14MLCC   0   2,680   
PIC16F1823-I/P 3.5KB Flash, 128 bytes RAM, 14PDIP   0   3,250   
PIC16F1823-I/SL 3.5KB Flash, 128 bytes RAM, 14SOIC   0   2,380   
PIC16F1825-I/P 14KB Flash, 1K bytes RAM 14PDIP   0   3,740   
PIC16F1825-E/P 14KB Flash, 1K bytes RAM 14PDIP   0   4,720   
PIC16F1825-E/SL 14KB Flash, 1K bytes RAM 14SOIC   0   4,290   
PIC16F1826-I/P 3.5KB Flash, 256 bytes RAM, 18PDIP   0   2,900   
PIC16F1826-E/P 3.5KB Flash, 256 bytes RAM, 18PDIP   0   3,750   
PIC16F1826T-I/SO 3.5KB Flash, 256 bytes RAM 18SOIC..T/R   0   3,020   
PIC16F1826-I/SO 3.5KB Flash, 256 bytes RAM, 18SOIC   100   2,070   
PIC16F1827-I/SO 7KB Flash, 384 bytes RAM 18SOIC   50   4,390   
PIC16F1829-I/P 14KB Flash, 1K bytes RAM 20PDIP   34   4,780   
PIC16F1829-I/ML 14KB Flash, 1K bytes RAM 28QFN   0   3,740   
PIC16F1847-I/P 14KB Flash, 1K bytes RAM, 18PDIP   18   4,660   

solo 3 de ellos hay stock "confiable"... igual, algo es algo!

sds.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 05 de Enero de 2015, 13:12:03
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Buen dato elgarbe, si bien conocía la empresa Elemon, no me había dado cuenta que tenía en stock esos micros, gracias por el dato.

Picuino, es así, acá en Argentina y en estos momentos tenemos muchísimos problemas con la importación y las tarifas de la misma, y aparte, como el modelo cambiario con el dolar no nos ayuda, pues los costos para importar se nos van por las nubes. Para que te des una idea, para traer algo desde Mouser de México/EEUU nos está costando alrededor de 100 dolares solo el costo del envío. Y al costo de lo que compres tienes que sumarle otro tanto en costo de aduana e impuestos. Una locura... todo esto con la excusa de querer "fomentar la industria nacional", como si en Argentina fuéramos a fabricar un PIC !!!

Sin más y ya con la calentura encima (por lo de las importaciones) agradezco enormemente los aportes que son de tanta utilidad para mí en estos momentos.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 05 de Enero de 2015, 13:30:48
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Ahora si nos entendemos, estoy con que esto deberia funcionar. Aunque uno espera un resultado booleano 1 (true) o 0 (false), creo que se basa unicamente en la deteccion del 0, por lo tanto no varia si es 1,8 o 15 para tomarlo como true.

Código: [Seleccionar]
if ( var & 0x08 ) {
 Si el resultado de la operacion "var & 0x08" es 0 no va a entrar aca
 Si esta en un 1 ese bit va a entrar aca
}

Aclaracion, si eso no funciona, podria ser ((var & 0x08) == 0) o != 0, pero creo que deberia funcionar sin el condicional.
Que esto se reemplaze en un simple BTFSS/BTFSC ahi lo veo complejo.
Podes usar un #define FLAG_ALGO 0x08, asi queda mas claro y entendible el codigo. quedandote ( var & FLAG_ALGO )

Igual eso es para una variable, en los registros tenes definidos los bits y quedaria por ejemplo

if ( INTCONbit.TXIF ) { }

Y si quisieras que sea una logica negada es decir que entre cuando este en 0 al if, le antepones el ! , quedando if ( !INTCONbits.TXIF ) , lo mismo podes hacer con la variable, este si creo que se reemplazaria correctamente en ASM, pero bueno, son las contras del C.

EDIT:

Buscando por el tema del true/false:
To be more precise, false is zero and true is any non-zero.
Esto vale tambien para numeros negativos. Tambien un null puede ser un false
http://www.cplusplus.com/forum/articles/3483/
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 05 de Enero de 2015, 14:02:27
Hola elgarbe, Picuino y KILLERJC, gracias por los aportes, son todos de mucha utilidad (por lo menos para mí), pero temo que me e expresado mal cuando me e referido a "manejo de bit's", en realidad, lo que yo quería decir es a comprobar un bit dentro de un byte, algo así a la funciónes btfsc/btfss del .asm, pero por supuesto en el C y para con el dato en cuestión poder usar la función "if" del C.

Ahora si nos entendemos xD, estoy con que esto deberia funcionar. Aunque uno espera una resultado booleano 1 (true ) o 0 (false), creo que se basa unicamente en la deteccion del 0, por lo tanto no varia si es 1,8 o 15 para tomarlo como true.

Código: [Seleccionar]
if ( var & 0x08 ) {
 Si el resultado de la operacion "var & 0x08" es 0 no va a entrar aca
 Si esta en un 1 ese bit va a entrar aca
}

Aclaracion, si eso no funciona, podria ser ((var & 0x08) == 0) o != 0, pero creo que deberia funcionar sin el condicional.
Que esto se reemplaze en un simple BTFSS/BTFSC ahi lo veo complejo.
Podes usar un #define FLAG_ALGO 0x08, asi queda mas claro y entendible el codigo. quedandote ( var & FLAG_ALGO )

Igual eso es para una variable, en los registros tenes definidos los bits y quedaria por ejemplo

if ( INTCONbit.TXIF ) { }

Y si quisieras que sea una logica negada es decir que entre cuando este en 0 al if, le antepones el ! , quedando if ( !INTCONbits.TXIF ) , lo mismo podes hacer con la variable, este si creo que se reemplazaria correctamente en ASM, pero bueno, son las contras del C.

Complemento un poquito esto.
Ya que estas empezando y si el tiempo te lo permite, podrías buscar (ando corto de tiempo hoy, sino te pasaría algunos links) cuestiones de estandarizacion y de buenas prácticas (como esto http://users.ece.cmu.edu/~eno/coding/CCodingStandard.html) asi ya que aprendes lo haces bien desde el principio.

Entre las buenas practicas, para el ejemplo de killer sería:


#define LED_pin    (1<<5)      //Esto si el LED esta conectado al Bit 5 dentro del puerto

#define LED_pin2   PORTBbits.RB5    //Acá apuntas directamente al bit en memoria correspondiente al pin en cuestion

y luego sí poner

if ( var & LED_pin){}

if (LED_pin2) {}

Saludos!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 05 de Enero de 2015, 21:36:54

Código: [Seleccionar]
if ( var & 0x08 ) {
 Si el resultado de la operacion "var & 0x08" es 0 no va a entrar aca
 Si esta en un 1 ese bit va a entrar aca
}

Aclaracion, si eso no funciona, podria ser ((var & 0x08) == 0) o != 0, pero creo que deberia funcionar sin el condicional.
Que esto se reemplaze en un simple BTFSS/BTFSC ahi lo veo complejo.

Todos los códigos que has puesto funcionan perfectamente y el compilador (si es bueno como el XC8) lo traduce directamente a un BTFSS/BTFSC

Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 06 de Enero de 2015, 00:44:48
Hola gente, así da gusto aprender. Picuino, por supuesto que no andaba buscando el reemplazo exacto de esas funciones del .asm, pero si tu dices que llegan a ese nivel, pues mejor todavía.

elgarbe, muy bueno ese link, ya lo e agendado para tenerlo a mano. Gracias

if ( condición ) { true    ;
} else { false               ;
}                                ;

A ver si entendí correctamente la función "if", si condición es 1 o superior realiza la operación en TRUE, y si es cero realiza lo ubicado en FALSE. ¿Esto es así?

Por lo tanto si lo anterior es correcto, dentro de "condición" no es obligatorio usar una función matemática, con que tenga una variable es suficiente. ¿Es esto correcto o me equivoco?

Muchas gracias a todos por la enseñanza y sobre todo por la paciencia. Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 06 de Enero de 2015, 08:24:36
Condición puede ser cualquier cosa que devuelva un valor de cualquier tipo.

Si el valor es cero, la condición es falsa. En cualquier otro caso, es verdadera.

   if (0)                Falso
   if (23)              Verdadero
   if ('m')             Verdadero
   if (4>3)            Verdadero
   if (0b1100 & 0b0011)     Falso porque el and binario vale 0b0000
   if (0b1100 && 0b0011)   Verdadero porque 0b1100 es verdadero y 0b0011 es verdadero. El and lógico es por lo tanto verdadero.
   a = 3;
   if (a == 4)    Falso porque a no es igual a 4
   if (a = 4)      Verdadero, porque el resultado de la asignación es cuatro.
                      Mucho cuidado con esta última instrucción. Es muy común equivocarse y ponerla por error al no escribir más que un igual.


La instrucción if sería igual a hacer una operación y comprobar el bit Zero del registro de estado.
Si el bit Zero está activado, salta al else.



Picuino, por supuesto que no andaba buscando el reemplazo exacto de esas funciones del .asm, pero si tu dices que llegan a ese nivel, pues mejor todavía.

En realidad cuando conozcas bien el XC8 y si utilizas la versión Full, puedes escribir en C todos los programas que antes escribías en asm, con la misma eficiencia.
Tendrás la opción de programar en C computed gotos (con switch case), tablas de datos con retlw y todo lo demás.
Lo bueno del C es que es muy cercano a la máquina, casi ensamblador.


Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: elgarbe en 06 de Enero de 2015, 08:38:38
Hola gente, así da gusto aprender. Picuino, por supuesto que no andaba buscando el reemplazo exacto de esas funciones del .asm, pero si tu dices que llegan a ese nivel, pues mejor todavía.

elgarbe, muy bueno ese link, ya lo e agendado para tenerlo a mano. Gracias

if ( condición ) { true    ;
} else { false               ;
}                                ;

A ver si entendí correctamente la función "if", si condición es 1 o superior realiza la operación en TRUE, y si es cero realiza lo ubicado en FALSE. ¿Esto es así?

Por lo tanto si lo anterior es correcto, dentro de "condición" no es obligatorio usar una función matemática, con que tenga una variable es suficiente. ¿Es esto correcto o me equivoco?

Muchas gracias a todos por la enseñanza y sobre todo por la paciencia. Un saludo.

Atte. CARLOS.



Así es, y como eso de que con algo mayor a 1 tambien es conciderado TRUE es un arma de doble ya que con algún error o descuido podemos entrar como condicion verdadera algo que no lo es, se suele hacer:

#DEFINE TRUE 1
#DEFINE FALSE 0
#DEFINE PIN_LED (1<<5)

if ( (PORTB & PIN_LED) == TRUE) { }


Si bien son más "caracteres" escritos, se evitan algun posible error. No sé si es buena práctica lo que pongo acá, simplemente comentar que lo he visto en muchos programas "grandes"

Saludos!
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 06 de Enero de 2015, 10:03:02
Así es, y como eso de que con algo mayor a 1 tambien es conciderado TRUE es un arma de doble ya que con algún error o descuido podemos entrar como condicion verdadera algo que no lo es, se suele hacer:

#DEFINE TRUE 1
#DEFINE FALSE 0
#DEFINE PIN_LED (1<<5)

if ( (PORTB & PIN_LED) == TRUE) { }


Si bien son más "caracteres" escritos, se evitan algun posible error. No sé si es buena práctica lo que pongo acá, simplemente comentar que lo he visto en muchos programas "grandes"

Saludos!

Yo creo que no tendria sentido realizarlo, si me parece mas intuitivo para alguien que no sabe C el poner la condicion, pero sabiendo como funciona el if(), con los ejemplos que dio Picuino no deberia haber ningun problema. Algunos lenguajes True y False son palabras reservadas, asi que lo considero como una practica muy comun, ademas de poder designar a TRUE con cualquier valor que va a funcionar igual no importa que sea 1. Me explico el por que no se me ocurre que sea necesario.

EDIT: Me di cuenta de mi error en la explicacion que esta en el quote siguiente, pido perdon y espero que no cause confusiones (de todas formas dejo la explicacion que di para que se de cuenta del error), tome el operador == como si fuera un AND logico ( && ) lo cual fue mi error. Pero abajo del quote respondo por cual es el error realmente.

Citar
En la condicion del if, lo que realmente vale la pena mirar es PORTB & PIN_LED, Si vos te equivocas en eso o metes un error en eso el "== TRUE" no te va a salvar para nada. Miremos las 2 posibilidades

True == True -> True
False == True -> False

si la condicion que dije es True, el resultado es True. Si la condicion es False, el resultado tambien es False. No evitaria ningun error o un descuido por que pusiste mal el valor PIN o el PORT.


Ahora si pongo el error, en el caso que se presento if ( (PORTB & PIN_LED) == TRUE) { } , la condicion (PORTB & PIN_LED) puede que no de 1,
si suponemos que queremos saber el bit4 entonces PIN_LED seria 0x10 y de estar activo el PIN, devolviera 0x10 lo cual se compararia con un 0x01.
A no ser que hagas if ( (PORTB & PIN_LED) == PIN_LED) { } , veo complejo que funcione como se quiere. Y termina siendo mas engorroso.

No se me ocurre algo que implique una arma de doble filo a no ser que uses operadores de pre-incremento/decremento y multiples condiciones:

i=0,j=0;
if ( ++i<10 || ++j<10 )
{
 Mostra los valores de i y de j
}

Pero hacer algo asi deberias tener un poco mas de conocimientos de C.
O tratar de resumirlo a ASM donde se ejecuta la primer condicion y si se cumple entonces no hay necesidad de hacer la otra. lo cual j no incrementaria hasta que i sea igual o mayor a 10.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 07 de Enero de 2015, 19:08:23
Yo siempre uso en .asm una pequeña rutina para manejar los LCD's, la e realizado en XC8 y si bien es más fácil y rápida de comprender, incluso de programar, la contra es que en .asm me ocupaba solo 180 posiciones de memoria de programa y en XC8 me ocupa 290, una diferencia importante.
Pero bueno, es un precio bajo a pagar (si logro llegar a manejar bien el C) por la comodidad y velocidad de programación.

¿Se puede ver la rutina en c?
Probablemente se puede mejorar y así vas aprendiendo trucos.

Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 08 de Enero de 2015, 15:22:14
Hola Picuino, en este momento que te estoy respondiendo estoy complicado con el tiempo. Mas luego la subiré y me comentas. En una de esas asta le sirve a alguien.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 13 de Enero de 2015, 12:21:51
Hola a todos, acá posteo el pequeño programa en C que e creado para el manejo de LCD's:

Código: C
  1. /*
  2.  * File:   main.c
  3.  * Author: Carlos
  4.  *
  5.  * Created on 4 de enero de 2015, 01:48
  6.  */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <xc.h>
  11.  
  12. #pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
  13. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  14. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
  15. #pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
  16. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  17. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
  18. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
  19. //#pragma config FOSC = XT_OSC // Oscillator Selection bits (INTRC oscillator; CLKO function on RA6/OSC2/CLKO pin and port I/O function on RA7/OSC1/CLKI pin)
  20.  
  21. #define     _XTAL_FREQ      4000000
  22. #define     LCD_RS          PORTBbits.RB0
  23. #define     LCD_E           PORTBbits.RB1
  24. #define     LCD_D4          PORTBbits.RB2
  25. #define     LCD_D5          PORTBbits.RB3
  26. #define     LCD_D6          PORTBbits.RB4
  27. #define     LCD_D7          PORTBbits.RB5
  28.  
  29. extern void LCD_INICIALIZAR(void);
  30. extern void LCD_IN(unsigned char);
  31. extern void LCD_INST(unsigned char);
  32. extern void SACAR(unsigned char);
  33. extern void LCD_DATO(unsigned char);
  34.  
  35. void LCD_INICIALIZAR(void) {
  36.     LCD_E = 0;
  37.     LCD_RS = 0;
  38.     __delay_ms(15);
  39.     LCD_IN(0b00110010); //Setea 4 BITS
  40.     LCD_IN(0b00101000); //Setea 2 lineas, matris de 5x7
  41.     LCD_INST(0b00000110); //Activa el display, desactiva el cursor y desactiva el destello del cursor
  42.     LCD_INST(0b00001100);
  43.     LCD_INST(0b00000001); //BORRA DISPLAY
  44.     return;
  45. }
  46.  
  47. void LCD_IN(unsigned char DATO) {
  48.     SACAR(DATO);
  49.     LCD_E = 1;
  50.     __delay_ms(4);
  51.     LCD_E = 0;
  52.     DATO = DATO << 4;
  53.     SACAR(DATO);
  54.     LCD_E = 1;
  55.     __delay_ms(4);
  56.     LCD_E = 0;
  57.     return;
  58. }
  59.  
  60. void LCD_INST(unsigned char DATO) {
  61.     SACAR(DATO);
  62.     LCD_E = 1;
  63.     __delay_ms(2);
  64.     LCD_E = 0;
  65.     DATO = DATO << 4;
  66.     SACAR(DATO);
  67.     LCD_E = 1;
  68.     __delay_ms(2);
  69.     LCD_E = 0;
  70.     return;
  71. }
  72.  
  73. void LCD_DATO(unsigned char DATO) {
  74.     SACAR(DATO);
  75.     LCD_RS = 1;
  76.     LCD_E = 1;
  77.     __delay_us(20);
  78.     LCD_E = 0;
  79.     LCD_RS = 0;
  80.     DATO = DATO << 4;
  81.     SACAR(DATO);
  82.     LCD_RS = 1;
  83.     LCD_E = 1;
  84.     __delay_us(20);
  85.     LCD_E = 0;
  86.     LCD_RS = 0;
  87.     return;
  88. }
  89.  
  90. void SACAR(unsigned char DATO) {
  91.     DATO = DATO << 1;
  92.     LCD_D7 = 0;
  93.     if (STATUSbits.CARRY == 0x01) (LCD_D7 = 1);
  94.     DATO = DATO << 1;
  95.     LCD_D6 = 0;
  96.     if (STATUSbits.CARRY == 0x01) (LCD_D6 = 1);
  97.     DATO = DATO << 1;
  98.     LCD_D5 = 0;
  99.     if (STATUSbits.CARRY == 0x01) (LCD_D5 = 1);
  100.     DATO = DATO << 1;
  101.     LCD_D4 = 0;
  102.     if (STATUSbits.CARRY == 0x01) (LCD_D4 = 1);
  103.     return;
  104. }
  105.  
  106. void main(void) {
  107.     TRISB = 0b11000000;    // Configuro el puerto
  108.     PORTB = 0;
  109.     LCD_INICIALIZAR();     // Inicializo el display
  110.  
  111.     LCD_INST(0X80);        // Indico escribir en la primera posición de la primera linea
  112.     LCD_DATO(32);
  113.     LCD_DATO(32);
  114.     LCD_DATO(32);
  115.     LCD_DATO(72);
  116.     LCD_DATO(111);
  117.     LCD_DATO(108);
  118.     LCD_DATO(97);
  119.     LCD_DATO(32);
  120.     LCD_DATO(77);
  121.     LCD_DATO(117);
  122.     LCD_DATO(110);
  123.     LCD_DATO(100);
  124.     LCD_DATO(111);
  125.     LCD_DATO(32);
  126.     LCD_DATO(32);
  127.     LCD_DATO(32);
  128.  
  129.     LCD_INST(0XC0);        // Indico escribir en la primera posición de la segunda linea
  130.     LCD_DATO(32);
  131.     LCD_DATO(32);
  132.     LCD_DATO(32);
  133.     LCD_DATO(32);
  134.     LCD_DATO(67);
  135.     LCD_DATO(104);
  136.     LCD_DATO(97);
  137.     LCD_DATO(108);
  138.     LCD_DATO(121);
  139.     LCD_DATO(50);
  140.     LCD_DATO(57);
  141.     LCD_DATO(32);
  142.     LCD_DATO(32);
  143.     LCD_DATO(32);
  144.     LCD_DATO(32);
  145.     LCD_DATO(32);
  146.  
  147.     asm("nop");            // Esto hace que el micro quede en un bucle cerrado solo para simular el programa
  148.     asm("goto $-1");
  149.     return;
  150. }

Tal y como ya e comentado anteriormente, este programa lo realice en .asm y lo e usado mucho. No es la gran cosa, estoy seguro que habrá mejores, pero este tiene la facilidad de poder asignar cualquier pin del micro para el manejo del LCD, por lo tanto no es necesario tener un puerto entero esclavo al display.

Con lo anterior es posible una flexibilidad extra en el diseño del PCB (muchas veces una gran ventaja) sin por ello aumentar la complejidad del programa.

Si bien el programa en .asm estaba bastante optimizado, creo que en C le falta mucho para estarlo, funciona, pero de seguro hay muchas cosas para mejorarle.

En .asm no lo usaba como librería, por una cuestión de capricho propio de que me gusta tener todo en el mismo programa. Pero en C y algún día (un poco lejano me temo) lo convertiré en librería ya que creo que el C es para simplificar la mente y no poner en el programa cosas ya vistas y sabidas, pero bueno, en un futuro....

Me gustaría comenten los errores que vean y en que se podría mejorar. Y al que le sea de utilidad, pues, provecho.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Joseph90 en 13 de Enero de 2015, 12:37:10
Muy bueno Chaly ((:-)), sería bueno que comentaras un poco las funciones pues no me quedan muy claras. Por cierto para que IDE está escrito el código...
Saludos
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 13 de Enero de 2015, 13:33:07
Hola Joseph90, está escrito para el XC8 de microchip. Y en realidad es bastante sencillo de usar, te explico:

Código: C
  1. #define     LCD_RS          PORTBbits.RB0
  2. #define     LCD_E           PORTBbits.RB1
  3. #define     LCD_D4          PORTBbits.RB2
  4. #define     LCD_D5          PORTBbits.RB3
  5. #define     LCD_D6          PORTBbits.RB4
  6. #define     LCD_D7          PORTBbits.RB5

En este punto defines los pines que usarás para manejar el LCD. Cambiando las sentencias PORTBbits.RBx puedes usar cualquier pin de cualquier puerto, por supuesto si dicho pin es apto para salida.

Código: C
  1. TRISB = 0b11000000;    // Configuro el puerto

Luego debes configurar los "TRIS" involucrados de manera correcta ya sean estos los TRISA, TRISB, TRISC, etc.

Código: C
  1. void main(void) {
  2.     TRISB = 0b11000000;    // Configuro el puerto
  3.     PORTB = 0;
  4.     LCD_INICIALIZAR();     // Inicializo el display

En el programa principal y luego de configurar puertos y demás funciones debes usar por única ves el comando "LCD_INICIALIZAR()". Esto es para inicializar el LCD y se hace solo una ves y al principio del funcionamiento del micro.

Código: C
  1. LCD_INST(0X80);        // Indico escribir en la primera posición de la primera linea
  2. LCD_INST(0XC0);        // Indico escribir en la primera posición de la segunda linea

Estas dos instrucciones le indican al LCD donde vas a escribir el carácter que viene a continuación. Con 0x80 indico la primera posición de la primera linea, si colocara, por ejemplo 0x85 sería la quita posición de la primera linea.

Código: C
  1. LCD_INST(0X80);        // Indico escribir en la primera posición de la primera linea
  2.     LCD_DATO(32);          // = " "
  3.     LCD_DATO(32);          // = " "
  4.     LCD_DATO(32);          // = " "
  5.     LCD_DATO(72);          // = "H"
  6.     LCD_DATO(111);         // = "o"
  7.     LCD_DATO(108);         // = "l"
  8.     LCD_DATO(97);          // = "a"
  9.     LCD_DATO(32);          // = " "
  10.     LCD_DATO(77);          // = "M"
  11.     LCD_DATO(117);         // = "u"
  12.     LCD_DATO(110);         // = "n"
  13.     LCD_DATO(100);         // = "d"
  14.     LCD_DATO(111);         // = "o"
  15.     LCD_DATO(32);          // = " "
  16.     LCD_DATO(32);          // = " "
  17.     LCD_DATO(32);          // = " "

Por lo tanto, con la instrucción anterior estoy escribiendo "Hola Mundo" en el centro de la primera linea del display. Entre los () "paréntesis" esta el valor de cada carácter Ascii2.

Tal como expliqué, no es el programa más óptimo (tener en cuenta que es mi primer programa en C), pero puede ser de utilidad. Cada cual es libre de mejorarlo a su gusto y por supuesto sería interesante que posteara sus resultados para que nos sea de utilidad a todos.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 13 de Enero de 2015, 16:11:56
Hola Carlos. Te adjunto una pequeña modificación que es más estandar.
En C no se suelen utilizar los registros de estado porque dependen de la máquina.

Código: C
  1. void SACAR(unsigned char DATO) {
  2.     LCD_D7 = 0;
  3.     if (DATO & 0x80) LCD_D7 = 1;
  4.     DATO <<= 1;
  5.     LCD_D6 = 0;
  6.     if (DATO & 0x80) LCD_D6 = 1;
  7.     DATO <<= 1;
  8.     LCD_D5 = 0;
  9.     if (DATO & 0x80) LCD_D5 = 1;
  10.     DATO <<= 1;
  11.     LCD_D4 = 0;
  12.     if (DATO & 0x80) LCD_D4 = 1;
  13. }

Un saludo.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 13 de Enero de 2015, 16:18:15
Otra modificación para escribir un string:

Código: [Seleccionar]

void lcd_puts(char *string) {
   while(*string != 0) {
      LCD_DATO(*string);
      string++;
}

void main(void) {

   char mensaje[] = "Hola Mundo";
   lcd_puts(mensaje);
}



Otro comentario sobre el estilo de escritura en C:

   Los nombres de funciones y variables siempre se escriben en minúsculas o como mucho con tipo título: rutinaEscrituraPantalla()

   Las definiciones del preprocesador siempre se escriben en mayúsculas:  #define     LCD_RS          PORTBbits.RB0


Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 13 de Enero de 2015, 16:23:24
Por último.
Las definiciones de las funciones se escriben en un archivo separado con extensión *.h (header)
De esta forma, se puede acceder a las definiciones de las funciones en el caso de utilizar una librería y que el código c no sea accesible

Archivo lcd.h:
Código: [Seleccionar]
#ifndef __LCD_H
#define __LCD_H

#define     LCD_RS          PORTBbits.RB0
#define     LCD_E           PORTBbits.RB1
#define     LCD_D4          PORTBbits.RB2
#define     LCD_D5          PORTBbits.RB3
#define     LCD_D6          PORTBbits.RB4
#define     LCD_D7          PORTBbits.RB5

void LCD_INICIALIZAR(void);
void LCD_IN(unsigned char);
void LCD_INST(unsigned char);
void SACAR(unsigned char);
void LCD_DATO(unsigned char);

#endif


En otro archivo colocamos las funciones de tratamiento de LCD
Archivo lcd.c:
Código: [Seleccionar]
#include "lcd.h"

   // Resto del programa con las funciones de tratamiento del lcd ...
   // En este archivo no se coloca la rutina main



Por último se puede hacer un programa en un archivo separado que utilice las rutinas del LCD:
Archivo main.c:
Código: [Seleccionar]
#include "lcd.h"

   // Programa que va a utilizar el LCD (rutina main)
void main(void) {
    //...
}

El archivo "lcd.h" lo puedes incluir en cualquier programa que vaya a utilizar el lcd.

Creo que esto es lo que querías hacer cuando comentaste lo de la "Librería"

Saludos.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: MGLSOFT en 13 de Enero de 2015, 16:34:42


Citar
Las definiciones de las funciones se escriben en un archivo separado con extensión *.h (header)
De esta forma, se puede acceder a las definiciones de las funciones en el caso de utilizar una librería y que el código c no sea accesible

Como es eso de que no puedes acceder al código de las funciones??
Como lo implementas??
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 13 de Enero de 2015, 17:09:46
No lo se bien porque nunca lo he hecho para un PIC, pero no es difícil.

Sólo hay que compilar los *.c para producir los ficheros objeto. *.o

Luego puedes utilizar sólo los ficheros objeto *.o con los header *.h sin el código c original.

Si juntas varios ficheros objeto *.o, puedes hacer una librería *.lib.


Seguro que alguien puede explicarlo mejor.

Saludos.


PD. En el caso del código de Charly esto no valdría porque el código c depende de las definiciones de los pines de salida. Habría que implementar el código de otra forma.
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: KILLERJC en 13 de Enero de 2015, 17:59:33
Si bien el programa en .asm estaba bastante optimizado, creo que en C le falta mucho para estarlo, funciona, pero de seguro hay muchas cosas para mejorarle.

Con los ejemplos que dio Picuino, el codigo de enviar un dato o una instruccion lo podes hacer en ASM, de esa forma va mas rapido a tu gusto.
Luego de ahi usas funciones en C para inicializarlo, Poder mandar todo un string como hizo Picuino


--------


Por lo que tengo entendido una libreria es una coleccion de codigo cabecera y objeto de varios archivos, ya estan precompiladas, entonces al momento de hacer un proyecto y usar esa libreria no hay necesidad de volver a compilar ese programa.
Aca hay unos pasos para generar una libreria con gcc

http://www.delorie.com/djgpp/doc/ug/larger/archives.html

seria usar gcc para generar la libreria y luego agregarla al MPLAB si fuera necesario. Y tal como dice Picuino en su Post Data. habria que implementarlo de otra forma, pero puede seguir usandolo asi  :)
Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Chaly29 en 13 de Enero de 2015, 22:39:08
Hola y gracias a todos por sus respuestas, ahora tengo material para experimentar un rato  :D

KILLERJC, claro que tienes razón, de hacer el envío de datos en .asm y los comandos en C (tiene muchas ventajas), y eso aré en un futuro, pero como ahora estoy practicando el C, pues lo hice todo así para practicar y sobre todo para ver si podía hacerlo  ;-)

Picuino, gracias por los consejos (ni bien tenga un rato me pondré a practicar), lo del string es muy bueno y útil, pero comprender que estoy lejísimo de aplicarlo solo por mis propios medios (aunque ahora este un poco más cerca), de seguro pondré manos a la obra.
Lo otro no entendí nada (por ahora y a vistazo rápido), pero ya me pondré con tiempo y seguro lo entenderé.

Deberán tenerme un poco de paciencia, este programa si bien lo e realizado en C, el que conoce un poco del .asm verá que el tipo de mentalidad aplicada es el .asm (es algo difícil el cambio de mentalidad). Básicamente es un código C asemblizado  :D  :D  :D

Gracias a todos por el apoyo y las enseñanzas.

Un saludo.

Atte. CARLOS.

Título: Re: Busco consejo sobre que lenguaje conviene aprender
Publicado por: Picuino en 14 de Enero de 2015, 07:20:28
Con respecto a hacer partes de programa en ASM, creo que en este caso no es necesario.
Si compilas este programa y miras el ASM generado, será muy parecido al que tenías antes en ensablador:

Código: C
  1. void SACAR(unsigned char DATO) {
  2.     LCD_D7 = 0;
  3.     if (DATO & 0x80) LCD_D7 = 1;
  4.     DATO <<= 1;
  5.     LCD_D6 = 0;
  6.     if (DATO & 0x80) LCD_D6 = 1;
  7.     DATO <<= 1;
  8.     LCD_D5 = 0;
  9.     if (DATO & 0x80) LCD_D5 = 1;
  10.     DATO <<= 1;
  11.     LCD_D4 = 0;
  12.     if (DATO & 0x80) LCD_D4 = 1;
  13. }

Para que sea igual que en ASM, habría que hacer la variable dato global (definirla fuera de la función) para que el compilador no utilice la pila de datos (el stack):


Código: C
  1. unsigned char lcd_dato;
  2.  
  3. void sacar(void) {
  4.     LCD_D7 = 0;
  5.     if (lcd_dato & 0x80) LCD_D7 = 1;
  6.     lcd_dato =  lcd_dato << 1;
  7.     LCD_D6 = 0;
  8.     if (lcd_dato & 0x80) LCD_D6 = 1;
  9.     lcd_dato =  lcd_dato << 1;
  10.     LCD_D5 = 0;
  11.     if (lcd_dato & 0x80) LCD_D5 = 1;
  12.     lcd_dato =  lcd_dato << 1;
  13.     LCD_D4 = 0;
  14.     if (lcd_dato & 0x80) LCD_D4 = 1;
  15. }
  16.  
  17.  
  18. void main(void) {
  19.    lcd_dato = 0x35;
  20.    lcd_sacar();
  21. }


Respecto a las dudas que tengas, si preguntas alguna en concreto seguro que te podemos responder sin enrollarnos demasiado, para que sea más sencillo.

La función de imprimir una cadena de caracteres (string) utiliza punteros y no es nada sencilla de entender a la primera. Los punteros son muy interesantes. Es lo que hace que el c sea tan eficiente. Un puntero en ASM es como utilizar el registro INDF (indirect addressing) para acceder a los datos de memoria.
Yo puse esa función para que veas que en C se pueden programar lo mismo con menos código.


Saludos.