¿Funcionará el mismo código C para un microcontrolador AVR con cualquier otro tipo?

2

Estoy aprendiendo acerca de los microcontroladores y tengo un conocimiento muy limitado sobre el tema.

Solo sé que uno necesita establecer bits en los registros y manipularlos básicamente para hacer que una unidad de control de datos funcione. Los registros configuran y controlan la electrónica del microcontrolador.

Digamos que escribí un código C en Atmel Studio para un uC particular de 8 bits. Este uC tiene nombres de registro en su hoja de datos como TCNT0, por ejemplo. ¿Qué sucede si deseo usar el mismo código con otro AVR de 8 bits? ¿Debo escribir todo desde cero o simplemente debo hacer pequeñas modificaciones? ¿La mayoría de los nombres de registro son comunes?

Por ejemplo, si programo un ATmega328P con C, ¿funcionaría el mismo código en cualquier otro tipo de 8 bits por ejemplo con ATmega168? Y si no, ¿lo escribirías normalmente desde cero o simplemente modificarías el anterior?

Estoy confundido acerca de la compatibilidad del código. ¿Qué hay de la misma pregunta para usar el código de uC de 8 bits para una uC de 32 bits como AVR32?

    
pregunta user164567

6 respuestas

3
  

Por ejemplo, si programo un ATmega328P con C, ¿funcionaría el mismo código en cualquier otro tipo de 8 bits por ejemplo con ATmega168?

En ese caso, la respuesta es sí. La única diferencia entre el ATmega168P y el 328P es la cantidad de memoria flash, siempre que su programa se ajuste al 168P (es decir, siempre que no sea mayor de 16 KB), se ejecutará de manera idéntica en esa parte.

En otros casos ... depende. Existen algunas diferencias sutiles en los periféricos y las características en la línea AVR, incluso en situaciones en las que los periféricos tienen el mismo nombre. Compare las hojas de datos con cuidado para obtener más detalles.

  

¿Qué hay de la misma pregunta para usar el código de uC de 8 bits para una uC de 32 bits como AVR32?

AVR32 es una arquitectura completamente diferente de AVR de 8 bits; No tienen casi nada en común además del nombre. Así que probablemente tendrías que volver a escribir tu programa.

    
respondido por el duskwuff
3

El código se puede escribir para ser portátil entre los microcontroladores. Es una buena idea hacer esto a menos que su aplicación sea muy simple o tenga mucha prisa :)

La idea es separar los procedimientos de nivel superior (el flujo de su programa principal) de la manipulación de hardware de bajo nivel (activar pines, configurar registros, etc.).

Para un ejemplo simple, tome un circuito donde desee controlar un LED. Puede configurar su código teniendo un módulo completamente separado para los LED: (No trabajo con AVR, perdone los errores)

led.c:

// For simplicity, this assumes all LEDs are on Port D.

void ledInit(uint8_t ledPin)
{

    DDRD |= (1 << ledPin);   // Configure the pin as an output
    PORTD &= ~(1 << ledPin); // Set the pin low
}

void ledOn(uint8_t ledPin)
{
    PORTD |= (1 << ledPin);
}

void ledOff(uint8_t ledPin)
{
    PORTD &= ~(1 << ledPin);
}

Luego, en su código de línea principal, solo accederá al LED a través de estos comandos. Si necesitara más acceso, como un comando de alternancia, lo agregaría al archivo led.c. El código principal ni siquiera es consciente de lo que sucede dentro del módulo LED.

Esto hace que sea mucho más fácil mover el código de la línea principal entre los microcontroladores. Básicamente, solo tendría que volver a escribir el archivo led.c. No tendría que cambiar su código de línea principal en absoluto .

Esta lógica también se puede utilizar para temporizadores, puertos de comunicaciones (SPI, I2C, USART ...), etc.

En un proyecto grande, creo que es mejor tener tres capas de código:

  • El código de la línea principal, que organiza todo
  • Nivel medio, que proporciona funciones y nombres (# define) al código de la línea principal. Esto se traduce entre la intención del código de línea principal y las funciones de bajo nivel requeridas para hacer que las cosas sucedan, y
  • Nivel bajo (controlador), que en realidad da la vuelta a los bits correctos.

En este caso, las funciones de bajo nivel solo se ven en el bloque de nivel medio. El bloque de nivel medio está expuesto al código de la línea principal.

Esto puede parecer demasiado complejo, pero en realidad no requiere mucho más trabajo. El beneficio se produce si tiene que cambiar detalles de implementación más grandes.

Por ejemplo, supongamos que ha diseñado su programa para usar un periférico SPI, pero su nuevo diseño debe usar I2C. Ahora puede cambiar el bloque de código de nivel medio para llamar correctamente a los comandos I2C de bajo nivel en lugar de los comandos SPI de bajo nivel. No tendría que cambiar el código de alto nivel o el de bajo nivel.

Dicho esto, no recomendaría esto mientras sigues aprendiendo lo básico :)

    
respondido por el bitsmack
2

Respuesta corta, no, no se garantiza que el código C escrito para un microcontrolador se ejecute en otros microcontroladores.

Respuesta larga, su compilador puede encargarse de tales asuntos en gran medida, y también se pueden escribir bibliotecas que se ocupan de muchos detalles que se encuentran bajo el capó.

Por ejemplo, tiendo a usar el compilador PIC C de CCS para tratar con los microcontroladores de la familia PIC. El código escrito para un microcontrolador simple generalmente se ejecutará en un controlador complejo, solo con la inclusión de un archivo h diferente. Si intento ejecutar un periférico que no existe, el compilador me dará un error (que evita que uno pase fácilmente de un controlador complejo a uno simple).

No hay nada mágico en esto. Alguien se tomó el tiempo de escribir las definiciones para todas las ubicaciones de memoria relevantes, y escribir las funciones para llamar a estas definiciones y tomar las acciones apropiadas.

Para los controladores centrales STM32, hay bibliotecas CMSIS, que en teoría significa que si su fabricante de chips proporciona una biblioteca CMSIS, su código será JUSTAMENTE portátil a otros miembros de la familia central STM32, incluso Los de diferentes fabricantes.

    
respondido por el Scott Seidman
1
  

¿Qué sucede si deseo usar el mismo código con otro AVR de 8 bits?

depende de la naturaleza del código.

el código dependiente del hardware, obviamente, no se ejecutará en un mcu con hardware diferente. En la medida en que los dos mcus tengan el mismo hardware (TIMER0 por ejemplo), el código se ejecutará sin modificaciones.

el código independiente del hardware obviamente se ejecutará en cualquier mcu, en la medida en que los compiladores tengan el soporte.

    
respondido por el dannyf
1

El código podría funcionar, eso depende de su compilador y si los periféricos utilizados en su código, es decir, temporizadores y contadores, tienen los mismos registros.

    
respondido por el user140439
0

El nombre del registro suele ser el mismo si está trabajando con la misma familia de AVR. Puede aparecer algún registro, desaparecer si la característica no es la misma. Sin embargo, si elige otro fabricante de uC, el nombre del registro será totalmente diferente. (Si vas de microchip a TI, etc ...)

Puedes comenzar desde tu código anterior porque la mayoría de los usuarios de la UC utilizan la programación en C La parte del algoritmo puede estar sin cambios. Deberá adaptar el registro para que el uC se comporte según lo previsto.

    
respondido por el M.Ferru

Lea otras preguntas en las etiquetas