AVR микроконтроллеры и как начать кодирование инициализации или основной цикл или таймеры или прерывания

9

Я уже несколько лет модифицирую код микроконтроллера AVR и PIC для работы, но никогда не писал ничего с нуля, я это прекрасно понимаю.

Сейчас я начинаю писать свой собственный код, и у меня возникают проблемы с началом работы. Мне было интересно, как другие люди начинают писать код, и если есть книги или учебники, которые порекомендуют это.

Вы начинаете с кодирования вашей функции инициализации, затем прерываете таймеры, затем основной цикл while (1) ... Мне интересно, как лучше всего начать.

Спасибо

Милан
источник

Ответы:

7
  1. Первое, что нужно сделать в любом проекте микроконтроллера - это мигать светодиодом; продолжайте мигать и дайте ему имя ("Blinky") тоже. Это сердце вашего виджета, и оно всегда будет работать, пока ваша программа не застрянет.
  2. Передать в локальный репозиторий контроля версий.
  3. Далее следует пролистать всю программу в псевдо / дерьмовом коде, основываясь на схемах программ или любых методах планирования, на которые вы подписаны. Если что-то не работает или вам просто не нравится, закомментируйте это, но держите это там, чтобы вы могли исправить это позже. Если вы не знаете, как что-то сделать, запишите, что он должен делать в комментариях.
  4. Передать в локальный репозиторий контроля версий.
  5. Время заполнить пробелы! Реализуйте одну функцию за раз, например таймер, и протестируйте ее . Ваша программа всегда должна компилироваться и работать как положено. Мне нравится реализовывать любые подключения пользовательского интерфейса на этом этапе, такие как UART -> RS232 -> связи с ПК или ЖК-дисплеи. Не забывай про Блинки .
  6. Передать в локальный репозиторий контроля версий.
  7. Попробуйте сломать ваш код с помощью строгих тестовых процедур; отладки. Пусть другие проверят ваш код ; отладки. Регулярно запускайте свой виджет через параметры его дизайна, например, изменения температуры; отладки.
  8. Передать в локальный репозиторий контроля версий.
  9. Отключи Blinky, если ты бессердечный дурак, и отправляйся.

У AVRFreaks есть превосходное учебное пособие, написанное Дином Камером (он же abcminuser ), под названием Modularizing C Code: Управление большими проектами . Вы также можете быть заинтересованы в чтении State Machines для микропроцессоров Джеймса Вагнера.

tyblu
источник
3
Абсолютно согласен с исходным контролем. Фиксируйте рано, совершайте часто
Тоби Джаффи
Наряду с фиксацией стоит проверить его в новом каталоге и перестроить. Нет ничего хуже, чем забыть добавить файл в систему контроля версий.
Роберт
6

Мой любимый учебник AVR "с нуля" https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

У каждого свой стиль для маленьких встроенных систем. Вот мой:

Мне нравится использовать множество C-файлов, имя каждого из которых составляет префикс для функций. Например, led_init()и led_tick()оба в led.c. Это сохраняет вещи модульными и помогает с мобильностью.

Я использую common.hзаголовочный файл для определения типов, но отдельные включения для каждого модуля.

Я склонен использовать один системный таймер для фрираннинга (а systime.c), а затем вызывать модули для вызова systime_get()функции, чтобы получить текущее время в системных тиках или миллисекундах. Каждый модуль может затем планировать события через программные таймеры, используя X_tick()функции.

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;
}

Вот два «реальных» проекта, использующих этот стиль для AVR и MSP430 .

Тоби джеффи
источник