microcontroladores avr y cómo comenzar a codificar init o bucle principal o temporizadores o interrupciones

9

He estado modificando el código del microcontrolador AVR y PIC durante algunos años por trabajo, pero nunca he escrito nada desde cero, lo entiendo bastante bien.

Estoy empezando a escribir mi propio código ahora y tengo problemas para comenzar. Me preguntaba cómo otras personas comienzan a escribir código y si hay un libro o tutorial que la gente recomendaría sobre esto.

¿Comienza con la codificación de su función de inicialización, luego interrumpe, luego temporiza y luego el ciclo while principal (1) ... Me pregunto cuál es la mejor manera de comenzar.

Gracias

Milán
fuente

Respuestas:

7
  1. Lo primero que se hace en cualquier proyecto de microcontrolador es parpadear un LED; manténgalo parpadeando y asígnele un nombre ("Blinky") también. Es el latido de su widget, y siempre funcionará mientras su programa no se atasque.
  2. Comprometerse con el repositorio local de control de versiones.
  3. Lo siguiente es volar a través del programa completo en pseudo / crapcode, basado en los diagramas de flujo de su programa o cualquier método de planificación al que se haya suscrito. Si algo no funciona o simplemente no le gusta, coméntelo pero manténgalo allí para que sepa cómo solucionarlo más tarde. Si no sabe cómo hacer algo, escriba lo que se supone que debe hacer en los comentarios.
  4. Comprometerse con el repositorio local de control de versiones.
  5. ¡Hora de llenar los espacios en blanco! Implemente una función a la vez, por ejemplo, el temporizador, y pruébelo . Su programa siempre debe compilarse y funcionar como se espera. Me gusta implementar cualquier conexión de interfaz de usuario en este punto, como UART -> RS232 -> enlaces de PC o pantallas LCD. No te olvides de Blinky .
  6. Comprometerse con el repositorio local de control de versiones.
  7. Intente descifrar su código con rigurosas rutinas de prueba; depurar. Haga que otros revisen su código ; depurar. Ejecute su widget a través de sus parámetros de diseño regularmente, como variaciones de temperatura; depurar.
  8. Comprometerse con el repositorio local de control de versiones.
  9. Desconecta a Blinky si eres un insensato y envía.

AVRFreaks tiene un excelente tutorial escrito por Dean Camera (también conocido como abcminuser ) llamado Modularizing C Code: Gestión de grandes proyectos . También te puede interesar leer Máquinas de estado para microprocesadores de James Wagner.

tyblu
fuente
3
Absolutamente de acuerdo sobre el control de la fuente. Comprometerse temprano, comprometerse a menudo
Toby Jaffey
Junto con el commit, es verificarlo en un directorio nuevo y reconstruirlo. Nada peor que olvidar agregar un archivo al control de origen.
Robert
6

Mi tutorial favorito de AVR desde cero en C es https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Cada uno tiene su propio estilo para pequeños sistemas integrados. Aquí está el mío:

Me gusta usar muchos archivos C, con el nombre de cada uno formando un prefijo para las funciones. Por ejemplo, led_init()y led_tick()ambos están en led.c. Esto mantiene las cosas modulares y ayuda con la portabilidad.

Yo uso un common.harchivo de encabezado para definir los tipos, pero incluye individual para cada módulo.

Tiendo a usar un solo temporizador de sistema de freerunning (en a systime.c) y luego los módulos llaman a una systime_get()función para obtener la hora actual en tics del sistema o milisegundos. Cada módulo puede programar eventos a través de temporizadores de software utilizando las X_tick()funciones.

common.h:

#ifndef COMMON_H
#define COMMON_H
#include <stdio.h>  // general purpose headers
#include <stdint.h>
#include <stdbool.h>
...
#endif

uart.h:

#ifndef UART_H
#define UART_H
#include <avr/usart.h>  // microcontroller specific headers for uart
...

void uart_init(void);
void uart_putc(uint8_t ch);
...

#endif

uart.c:

#include "common.h"
#include "uart.h"

void uart_isr(void) __interrupt VECTOR
{
  // handle incoming data
}

void uart_init(void)
{
  // setup hardware
}

void uart_putc(uint8_t ch)
{
  UART_TX_FIFO_REGISTER = ch;
  while(!TX_COMPLETE_REGISTER);
}

led.h:

#ifndef LED_H
#define LED_H
#include <avr/ioports.h>  // microcontroller specific headers for port io
...

#define LED_DDR   PORTAD
#define LED_PIN   5
#define LED_MASK  (1 << LED_PIN)
#define LED_PORT  PORTA

void led_init(void);
void led_set(void);
void led_tick(void);
...

#endif

led.c:

#include "common.h"
#include "led.h"

void led_init(void)
{
  LED_DDR |= LED_MASK;
}

void led_set(void)
{
  LED_PORT |= LED_MASK;
}

void led_tick(void)
{
  // animate LEDs in an amusing fashion
}

C Principal:

#include "common.h"
#include "led.h"
#include "uart.h"

int main(void)
{
  led_init();
  uart_init();
  ...

  led_set();

  while(1)
  {
    led_tick();
    uart_tick();
  }

  return 0;
}

Aquí hay dos proyectos del "mundo real" que usan este estilo para AVR y MSP430 .

Toby Jaffey
fuente