Programando un microcontrolador atmega168

Hola!

Soy nuevo en este mundo Arduino, me gustaria una ayuda para empezar a programar un microcontrolador ATMEGA168.

Realice una programación en lenguaje C de Arduino, el tema que ha llegado la hora para pasar el codigo a un microcontrolador y sacarme de encima el Arduino. Estuve leyendo del tema y entiendo que se puede usar el micro ATMEGA168, pero la duda que tengo como buen novato es:

Debo traducir todo el código que programé para que arduino envie los comandos a un modulo A7 AITHINKER, al lenguaje de programación para ATMEGA168?, o existe una forma más elegante de no estar haciendo borron y cuenta nueva para ello?

Atte., Pablo

psilvao:
Debo traducir todo el código que programé para que arduino envie los comandos a un modulo A7 AITHINKER, al lenguaje de programación para ATMEGA168?, o existe una forma más elegante de no estar haciendo borron y cuenta nueva para ello?

Si el código se basa únicamente en "aspectos generales" del lenguaje, no.
Por "aspectos generales" me refiero a las típicas estructuras de control, ciclo, sintaxis, etc.

Las funciones que están siempre disponibles (sin necesidad de agregar librerías), la mayoría se supone que son portables (compatibles al compilar para distintas plataformas/arquitecturas). Si en las definiciones del microcontrolador no hay una implementación de Serial y/o EEPROM que sean compatibles con el estándar de la IDE, dudo mucho que se puedan utilizar para esa arquitectura.

Librerías externas o incluso las que ya tiene la IDE: su compatibilidad es dudosa; algunas se basan en instrucciones portables, otras en instrucciones de más bajo nivel. Cuidado con ellas, porque lo que encuentres en Internet muy muy muy muy probablemente sea compatible sólo en arquitecturas AVR (pensadas en el popular Arduino Uno más que todo).

Por otra parte, si tu programa explícitamente involucra instrucciones de más bajo nivel como manipulación de registros, uso de interrupciones e incluso instrucciones en ensamblador; ahí tendrás problemas.

PD: ojo con los tipos de datos "primitivos" diferentes de byte o char; ese cambio puede salir desapercibido.
Esencialmente, la diferencia está en los bytes que ocupa en memoria. Ej.: int puede llegar a ocupar 4 bytes y no 2 como suele suceder en el 168, short y double entran en juego (en AVR son equivalentes a int y float respectivamente), y long pasa a ser de 8 bytes

Hola

Muchas gracias por la respuesta, la verdad que el código programado para Arduino se basa en la utilizacion de

stdio.h y strings.h

Lo otro son funciones del tipo for, while y declaraciones de String, char e int.

Finalmente, utilizo Serial.print y Serial2.println

Voy por el buen camino???, o me vere enfrentado a algun imprevisto cuando pase el codigo al microcontrolador atmega168?, a todo esto, utilizo el mismo IDE de arduino para ello?

Atte., Pablo

psilvao:
la verdad que el código programado para Arduino se basa en la utilizacion de

stdio.h y strings.h

Lo otro son funciones del tipo for, while y declaraciones de String, char e int.

Según lo que dicta mi teoría, dicho código debería ser portable entonces.

psilvao:
Finalmente, utilizo Serial.print y Serial2.println

Primero... ¿Serial2? ¿Seguro que es un 168 y no un 2560?
Segundo: será que intentes esa parte.
Hasta donde sé, la implementación del puerto serial en AVR involucra manipular registros y manejar las interrupciones de TX y RX.

Hola!

Como buen novato, cometi un error respecto del microcontrolador, ya que tienes razón es un 2560, porque estamos trabajando en un arduino mega 2560.

Asi que como te señalaba, sí ocupo

Serial2.println

Lo unico que me causa un poco de pavor, es la utilización de la variable tipo String, y funciones asociadas de la librería string.h, así que por lo que leo de tus comentarios debería ser un parto sin dolor...

Ahora, buscando en google, entiendo que bien puedo seguir estas instrucciones:

Entiendo de ese tutorial que:

  1. se debe armar un ambiente con resistencia, capacitor, una board de pruebas, un ente serial/usb junto con el microcontrolador 2560

  2. desde el arduino ide, se carga un scketch del microcontrolador.

  3. se procede a la validacion y upload de la compilación al micro 2560 de la board

Y eso debería ser todo, se podría realizar la carga o flash del codigo de arduino ide tambien usando yamichi socket que sería más agradable y facil para el novato.

https://www.aliexpress.com/w/wholesale-yamaichi-socket.html

Si quiero ahora usar el modulo A7 aithinker + atmega2560 => debo armar una pcb ad hoc para que estos dos modulos conversen junto con la batería. El tema de la pcb, ya es harina de otro costal y habria que diseñar una para que este ingenio ...

Voy bien?, o falta algo adicional?

Atte., Pablo

psilvao:
Lo unico que me causa un poco de pavor, es la utilización de la variable tipo String, y funciones asociadas de la librería string.h, así que por lo que leo de tus comentarios debería ser un parto sin dolor...

La clase String en realidad es una de las pocas librarías que se puede garantizar que son 100% portables. Si miras su implementación, notarás que no hay instrucciones específicas de arquitectura; solo array de char, un contador int y el resto son solo instrucciones propias del lenguaje C.

psilvao:
Si quiero ahora usar el modulo A7 aithinker + atmega2560 => debo armar una pcb ad hoc para que estos dos modulos conversen junto con la batería.

Espera un segundo... tu problema no es con traducir código, creo que tu duda está en cómo intercomunicar ambos microcontroladores. ¿Correcto?

Hola!

Ya me queda claro y estoy muy tranquilo con lo que me acabas de señalar respecto del codigo, lo que te puse a continuación es como proseguir, ya que si bien puedo pasar el codigo del IDE Arduino al microcontrolador 2560, ahora me queda el otro trabajo.., independizarme del arduino y crear la pcb.

Por tal motivo, te hice la consulta de caracter general..

Agradecido por tus comentarios..

Atte., Pablo

psilvao:
ya que si bien puedo pasar el codigo del IDE Arduino al microcontrolador 2560, ahora me queda el otro trabajo.., independizarme del arduino y crear la pcb.

¿Entonces traducir qué? Si al fin y al cabo lo que ibas a programar era un ATmega2560 (arquitectura AVR) "virgen".
Supongo que ya viste que no era algo de otro mundo, y que no hay diferencia de código entre un Arduino Mega y 2560 solo.

Hola!

Asi es, ya me di cuenta, el tema que tenia una duda, ya que un programador estaba usando una libreria no estandar para leer el modulo A7 Aithinker, de alli retome la programación y partí de cero, ocupando eso si un arduino mega 2560 y sólo las librerias stdio.h y strings.h

Como no tenia idea, y por supuesto, deseo al menos a prender lo basico, consulte como era el tema de pasar el codigo al microcontrolador, lo curioso que el programador que me estaba apoyando me indicaba que solo se podia utilizar el 80% del codigo, cosa que cuando le informe que si se usa C estandar (como me comentaste), es posible pasar el codigo un 100% sin hacer nada..., ergo debería ser trivial. Ahora cual es la justificación de haber usado una libreria no estandar vs su experiencia en el tema, es lo que me quedo dando vueltas.

Por el tema de la PCB examinaré que se puede hacer.

Muchas gracias por las respuestas.

Atte., Pablo

psilvao:
Ahora cual es la justificación de haber usado una libreria no estandar vs su experiencia en el tema, es lo que me quedo dando vueltas.

¿Librería no estándar? ¿No estándar en C? ¿O te refieres a esas que no vienen en la IDE y que descargas de internet?

Ya que no se trata de traducir código de AVR a cual sea la arquitectura del ESP8266 (¿será ARM?), el 97% de las librerías que encuentres "para Arduino" muy probablemente sean compatibles con un ATmega2560 (aunque no esté explícitamente expresado).
Las librerías que vienen con la IDE, absolutamente todas son compatibles con este microcontrolador (lo que quizás pueda cambiar, es la ubicación de los pines para ciertas funciones).

Hazte de cuentas que un 2560 (Arduino Mega) es un 328P (Arduino Uno), con la única salvedad de tener más hardware como 3 USART adicionales, 8 entradas analógicas más, 9 pines PWM extra, etc.
Lo que lo hace compatible con casi todas las librerías, es que tiene los mismos registros e interrupciones de un 328P; en instrucciones en ensamblador no estoy seguro debido al aumento en RAM y memoria flash.

Hay algunos ejemplos de código AVR para el A7 que no es Arduino pero con algunas modificaciones puede usarse. Seguramente psilvao refiere a eso.