avrマイクロコントローラーと、initまたはメインループまたはタイマーまたは割り込みのコーディングを開始する方法


9

私はAVRとPICマイクロコントローラーのコードをここ数年、仕事のために変更していますが、ゼロから何かを書いたことがないので、かなりよく理解しています。

私は今自分のコードを書き始めており、始めるのに問題があります。他の人がどのようにコードを書き始めるのか、本やチュートリアルがあるとすれば、これについてお勧めします。

初期化関数のコーディングから始めて、次に割り込み、次にタイマー、そしてメインのwhile(1)ループのコーディングから始めますか...始めるための最良の方法は何なのかと思っています。

ありがとうございました

回答:


7
  1. マイクロコントローラープロジェクトで最初に行うことは、LEDを点滅させることです。点滅し続けて、それに名前( "Blinky")を付けます。これはウィジェットの心臓部であり、プログラムが行き詰まらない限り、常に機能します。
  2. ローカルバージョン管理リポジトリにコミットします。
  3. 次に、プログラムフロー図またはサブスクライブした計画方法に基づいて、プログラム全体を疑似/スクラップコードで飛行します。何かがうまくいかなかったり、気に入らなかったりした場合は、コメントアウトしておきます。後で修正できるように、そのままにしておいてください。何かをする方法がわからない場合は、何をすべきかをコメントで書き留めてください。
  4. ローカルバージョン管理リポジトリにコミットします。
  5. 空白を埋める時間です!タイマーなど、一度に1つの関数を実装し、テストします。プログラムは常にコンパイルされ、期待どおりに動作するはずです。この時点で、UART-> RS232-> PCリンクまたはLCDディスプレイなどのユーザーインターフェイス接続を実装するのが好きです。Blinkyを忘れないでください。
  6. ローカルバージョン管理リポジトリにコミットします。
  7. 厳密なテストルーチンでコードを解読してください。デバッグ。他の人にあなたのコードをレビューしてもらいます。デバッグ。温度変化のように、ウィジェットをその設計パラメーターを定期的に実行します。デバッグ。
  8. ローカルバージョン管理リポジトリにコミットします。
  9. あなたが無情な愚か者なら、ブリンキーを外して、出荷してください。

AVRFreaksには、Dean Camera(別名abcminuser)によって書かれた、Cコードのモジュール化:大規模プロジェクトの管理と呼ばれる優れたチュートリアルがあります。James Wagnerによるマイクロプロセッサ用のステートマシンを読むことにも興味があるかもしれません。


3
ソース管理については完全に同意します。早い段階でコミットし、頻繁にコミットする
Toby Jaffey 2011年

コミットと共に、新しいディレクトリにチェックアウトして再構築します。ファイルをソース管理に追加することを忘れないことほど悪いことはありません。
Robert

6

私のお気に入りのAVR-from-scratch-in-Cチュートリアルは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;
}

AVRMSP430にこのスタイルを使用している2つの「実際の」プロジェクトを次に示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.