avr Mikrocontroller und wie man anfängt, Init oder Hauptschleife oder Timer oder Interrupts zu codieren

9

Ich habe den AVR- und PIC-Mikrocontroller-Code seit einigen Jahren für die Arbeit modifiziert, aber noch nie etwas von Grund auf neu geschrieben. Ich verstehe das ziemlich gut.

Ich fange jetzt an, meinen eigenen Code zu schreiben und habe Probleme beim Einstieg. Ich habe mich gefragt, wie andere Leute anfangen, Code zu schreiben, und ob es ein Buch oder ein Tutorial gibt, das die Leute dazu empfehlen würden.

Beginnen Sie mit der Codierung Ihrer Initialisierungsfunktion, unterbrechen Sie dann die Timer und dann die Haupt-while (1) -Schleife? Ich frage mich, wie Sie am besten beginnen können.

Danke

Mailand
quelle

Antworten:

7
  1. Das erste, was man in einem Mikrocontroller-Projekt macht, ist das Blinken einer LED. Lass es blinken und gib ihm auch einen Namen ("Blinky") . Es ist der Herzschlag Ihres Widgets und funktioniert immer, solange Ihr Programm nicht hängen bleibt.
  2. Festschreiben im lokalen Versionskontroll-Repository.
  3. Als nächstes fliegen Sie das gesamte Programm in Pseudo / Crapcode durch, basierend auf Ihren Programmflussdiagrammen oder den von Ihnen abonnierten Planungsmethoden. Wenn etwas nicht funktioniert oder Sie es einfach nicht mögen, kommentieren Sie es aus, aber lassen Sie es dort, damit Sie es später beheben können. Wenn Sie nicht wissen, wie man etwas macht, schreiben Sie in Kommentaren auf, was es tun soll.
  4. Festschreiben im lokalen Versionskontroll-Repository.
  5. Zeit, die Lücken zu füllen! Implementieren Sie jeweils eine Funktion, z. B. den Timer, und testen Sie sie . Ihr Programm sollte immer wie erwartet kompiliert und funktionieren. Ich möchte an dieser Stelle alle Benutzeroberflächenverbindungen implementieren, wie UART -> RS232 -> PC-Verbindungen oder LCD-Anzeigen. Vergiss Blinky nicht .
  6. Festschreiben im lokalen Versionskontroll-Repository.
  7. Versuchen Sie, Ihren Code mit strengen Testroutinen zu brechen. debuggen. Lassen Sie andere Ihren Code überprüfen . debuggen. Führen Sie Ihr Widget regelmäßig durch die Entwurfsparameter, z. B. Temperaturschwankungen. debuggen.
  8. Festschreiben im lokalen Versionskontroll-Repository.
  9. Trennen Sie Blinky, wenn Sie ein herzloser Dummkopf sind, und versenden Sie.

AVRFreaks hat ein exzellentes Tutorial von Dean Camera (auch bekannt als abcminuser ) namens Modularizing C Code: Verwalten großer Projekte . Vielleicht möchten Sie auch State Machines for Microprocessors von James Wagner lesen .

Tyblu
quelle
3
Über die Quellcodeverwaltung absolut einverstanden. Früh
festlegen
Zusammen mit dem Commit müssen Sie es in ein neues Verzeichnis auschecken und neu erstellen. Nichts schlimmeres als zu vergessen, der Quellcodeverwaltung eine Datei hinzuzufügen.
Robert
6

Mein Lieblings-AVR-Tutorial von Grund auf in C ist https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Jeder hat seinen eigenen Stil für kleine eingebettete Systeme. Hier ist meins:

Ich verwende gerne viele C-Dateien, wobei der Name jeder Datei ein Präfix für Funktionen darstellt. Zum Beispiel led_init()und led_tick()sind beide in led.c. Dies hält die Dinge modular und hilft bei der Portabilität.

Ich verwende eine common.hHeader-Datei, um Typen zu definieren, aber einzelne Includes für jedes Modul.

Ich neige dazu, einen einzelnen Freerunning-System-Timer (in a systime.c) zu verwenden und dann Module zu einer systime_get()Funktion aufrufen zu lassen , um die aktuelle Zeit in System-Ticks oder Millisekunden abzurufen. Jedes Modul kann dann mithilfe der X_tick()Funktionen Ereignisse über Software-Timer planen .

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
}

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

Hier sind zwei "reale" Projekte, die diesen Stil für AVR und MSP430 verwenden .

Toby Jaffey
quelle