avr мікроконтролери та як розпочати кодування init чи main циклу або таймерів чи переривань


9

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

Я зараз починаю писати власний код і у мене виникають проблеми з початком роботи. Мені було цікаво, як інші люди починають писати код і якщо є книга чи підручник, люди рекомендували б це.

Ви почнете з кодування вашої функції ініціалізації, потім перериває, а потім таймери, а потім основний цикл while (1) ... Мені цікаво, що найкращий спосіб почати - це.

Дякую

Відповіді:


7
  1. Перше, що потрібно зробити в будь-якому проекті мікроконтролера - це блимати світлодіод; продовжуйте миготіти і дайте йому ім’я ("Blinky") теж. Це серцебиття вашого віджета, і воно буде працювати до тих пір, поки ваша програма не застрягне.
  2. Перейти до сховища контролю локальної версії.
  3. Далі - пролетіти всю програму в псевдо / crapcode, виходячи з ваших схем потоку програми або будь-яких методів планування, на які ви підписалися. Якщо щось не працює або вам просто не подобається, коментуйте це, але зберігайте його там, щоб потім ви могли це виправити. Якщо ви не знаєте, як щось зробити, запишіть, що він повинен робити в коментарях.
  4. Перейти до сховища контролю локальної версії.
  5. Час заповнювати заготовки! Реалізуйте по одній функції, наприклад таймер, і протестуйте її . Ваша програма завжди повинна збиратись і працювати так, як очікувалося. Мені подобається реалізовувати будь-які підключення користувальницького інтерфейсу в цей момент, наприклад UART -> RS232 -> посилання на ПК або РК-дисплеї. Не забувайте про Blinky .
  6. Перейти до сховища контролю локальної версії.
  7. Спробуйте зламати свій код суворими тестовими процедурами; налагоджувати. Попросіть інших переглянути ваш код ; налагоджувати. Запускайте віджет регулярно за його конструктивними параметрами, як-от перепади температури; налагоджувати.
  8. Перейти до сховища контролю локальної версії.
  9. Відключіть Blinky, якщо ви бездушний дурень, і корабель.

AVRFreaks має чудовий підручник, написаний Діном Камерою (ака. Abcminuser ) під назвою Modularizing C Code: Управління великими проектами . Можливо, вам також буде цікаво прочитати Державні машини для мікропроцесорів Джеймса Вагнера.


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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.