Meu tutorial favorito do AVR-do-zero-em-C é https://www.mainframe.cx/~ckuethe/avr-c-tutorial/
Todo mundo tem seu próprio estilo para pequenos sistemas embarcados. Aqui está o meu:
Eu gosto de usar muitos arquivos C, com o nome de cada um criando um prefixo para funções. Por exemplo, led_init()
e led_tick()
ambos estão em led.c
. Isso mantém as coisas modulares e ajuda na portabilidade.
Eu uso um common.h
arquivo de cabeçalho para definir tipos, mas as inclusões individuais para cada módulo.
Eu costumo usar um único timer de sistema de freerunning (em a systime.c
) e, em seguida, os módulos chamam uma systime_get()
função para buscar o tempo atual em ticks do sistema ou milissegundos. Cada módulo pode então agendar eventos através de temporizadores de software usando as X_tick()
funções.
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
}
main.c:
#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;
}
Aqui estão dois projetos do "mundo real" usando esse estilo para AVR e MSP430 .