mikrokontrolery avr i jak rozpocząć kodowanie init lub pętli głównej, timerów lub przerwań

9

Od kilku lat modyfikuję kod mikrokontrolera AVR i PIC do pracy, ale nigdy nie napisałem niczego od zera, rozumiem to całkiem dobrze.

Zaczynam teraz pisać własny kod i mam problemy z rozpoczęciem. Zastanawiałem się, jak inne osoby zaczynają pisać kod i czy jest jakaś książka lub samouczek, które ludzie by to polecili.

Zaczynasz od zakodowania funkcji inicjalizacji, a następnie przerywa, a następnie timery, a następnie główną pętlę while (1) ... Zastanawiam się, jaki jest najlepszy sposób na rozpoczęcie pracy.

Dziękuję Ci

Mediolan
źródło

Odpowiedzi:

7
  1. Pierwszą rzeczą, jaką robi się w każdym projekcie mikrokontrolera, jest mruganie diody LED; ciągle migaj i nadaj mu nazwę („Blinky”) . To bicie serca twojego widżetu i zawsze będzie działać, dopóki twój program nie utknie.
  2. Zatwierdź do lokalnego repozytorium kontroli wersji.
  3. Następnie przejdź przez cały program w pseudo / crapcode, w oparciu o diagramy przepływu programu lub dowolne subskrybowane metody planowania. Jeśli coś nie działa lub po prostu ci się nie podoba, skomentuj to, ale zachowaj to, abyś mógł to naprawić później. Jeśli nie wiesz, jak coś zrobić, zapisz to w komentarzach.
  4. Zatwierdź do lokalnego repozytorium kontroli wersji.
  5. Czas wypełnić puste pola! Zaimplementuj jedną funkcję na raz, na przykład timer i przetestuj go . Twój program powinien zawsze się kompilować i działać zgodnie z oczekiwaniami. W tym momencie lubię implementować dowolne połączenia interfejsu użytkownika, takie jak UART -> RS232 -> łącza PC lub wyświetlacze LCD. Nie zapomnij o Blinky .
  6. Zatwierdź do lokalnego repozytorium kontroli wersji.
  7. Spróbuj złamać kod za pomocą rygorystycznych procedur testowych; odpluskwić. Niech inni sprawdzą Twój kod ; odpluskwić. Regularnie uruchamiaj widget przez parametry projektowe, takie jak zmiany temperatury; odpluskwić.
  8. Zatwierdź do lokalnego repozytorium kontroli wersji.
  9. Odłącz Blinky, jeśli jesteś bezdusznym głupcem i wysyłaj.

AVRFreaks ma doskonały samouczek napisany przez Dean Camera (aka. Abcminuser ) o nazwie Modularizing C Code: Zarządzanie dużymi projektami . Być może zainteresuje Cię także lektura State Machines for Microprocessors Jamesa Wagnera.

tyblu
źródło
3
Całkowicie zgadzaj się na temat kontroli źródła. Popełniaj wcześnie, często popełniaj
Toby Jaffey
Wraz z zatwierdzeniem jest sprawdzenie go w nowym katalogu i przebudowanie. Nic gorszego niż zapomnienie o dodaniu pliku do kontroli źródła.
Robert
6

Mój ulubiony samouczek AVR-from-scratch-in-C to https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Każdy ma swój styl dla małych systemów wbudowanych. To moje:

Lubię używać wielu plików C, których nazwa tworzy prefiks funkcji. Na przykład led_init()i led_tick()oba są w led.c. Pozwala to zachować modułowość i ułatwia przenoszenie.

Korzystam z common.hpliku nagłówka, aby zdefiniować typy, ale dla każdego modułu osobno zawiera.

Zazwyczaj używam pojedynczego timera systemowego freerunning (w a systime.c), a następnie moduły wywołują systime_get()funkcję, aby pobrać bieżący czas w tikach systemowych lub milisekundach. Każdy moduł może następnie planować zdarzenia za pomocą timerów programowych przy użyciu X_tick()funkcji.

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

Oto dwa projekty w „świecie rzeczywistym” wykorzystujące ten styl dla AVR i MSP430 .

Toby Jaffey
źródło