avr mikrokontroler dan cara memulai pengkodean init atau loop utama atau timer atau interupsi

9

Saya telah memodifikasi kode mikrokontroler AVR dan PIC selama beberapa tahun sekarang untuk bekerja tetapi belum pernah menulis apa pun dari awal, saya memahaminya dengan cukup baik.

Saya mulai menulis kode saya sendiri sekarang dan saya kesulitan memulai. Saya bertanya-tanya bagaimana orang lain mulai menulis kode dan jika ada buku atau tutorial orang akan merekomendasikan hal ini.

Apakah Anda mulai dengan pengkodean fungsi inisialisasi Anda kemudian menyela kemudian timer kemudian utama sementara (1) loop ... Saya bertanya-tanya apa cara terbaik untuk memulai adalah.

Terima kasih

Milan
sumber

Jawaban:

7
  1. Hal pertama yang dilakukan seseorang dalam proyek mikrokontroler adalah berkedip LED; tetap berkedip dan beri nama ("Blinky") juga. Ini adalah detak jantung widget Anda, dan akan selalu berfungsi selama program Anda tidak macet.
  2. Berkomitmen ke repositori kontrol versi lokal.
  3. Berikutnya adalah terbang melalui seluruh program dalam pseudo / crapcode, berdasarkan diagram alir program Anda atau metode perencanaan apa pun yang telah Anda langgani. Jika sesuatu tidak berfungsi atau Anda tidak menyukainya, beri komentar tapi simpan di sana agar Anda tahu untuk memperbaikinya nanti. Jika Anda tidak tahu bagaimana melakukan sesuatu, tulis apa yang seharusnya dilakukan dalam komentar.
  4. Berkomitmen ke repositori kontrol versi lokal.
  5. Saatnya mengisi bagian yang kosong! Menerapkan satu fungsi pada satu waktu, misalnya timer, dan mengujinya . Program Anda harus selalu dikompilasi dan berfungsi seperti yang diharapkan. Saya ingin menerapkan koneksi antarmuka pengguna apa pun pada saat ini, seperti UART -> RS232 -> tautan PC atau layar LCD. Jangan lupakan Blinky .
  6. Berkomitmen ke repositori kontrol versi lokal.
  7. Cobalah untuk memecahkan kode Anda dengan rutinitas pengujian yang ketat; debug. Mintalah orang lain meninjau kode Anda ; debug. Jalankan widget Anda melalui parameter desainnya secara teratur, seperti variasi suhu; debug.
  8. Berkomitmen ke repositori kontrol versi lokal.
  9. Putuskan sambungan Blinky jika Anda bodoh, dan kirimkan.

AVRFreaks memiliki tutorial yang sangat bagus yang ditulis oleh Dean Camera (alias .cminuser ) yang disebut Modularizing C Code: Mengelola proyek-proyek besar . Anda juga mungkin tertarik membaca State Machines for Microprocessors oleh James Wagner.

tyblu
sumber
3
Sepenuhnya setuju tentang kontrol sumber. Berkomitmen awal, komit sering
Toby Jaffey
Seiring dengan komit, adalah untuk memeriksanya ke direktori baru dan membangunnya kembali. Tidak ada yang lebih buruk dari lupa untuk menambahkan file ke kontrol sumber.
Robert
6

Tutorial AVR-from-scratch-in-C favorit saya adalah https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Setiap orang memiliki gaya mereka sendiri untuk sistem tertanam kecil. Ini milik saya:

Saya suka menggunakan banyak file C, dengan nama masing-masing membuat awalan untuk fungsi. Sebagai contoh, led_init()dan led_tick()keduanya di led.c. Ini menjaga hal-hal modular dan membantu dengan portabilitas.

Saya menggunakan common.hfile header untuk mendefinisikan jenis, tetapi masing-masing termasuk untuk setiap modul.

Saya cenderung menggunakan timer sistem freerunning tunggal (dalam a systime.c) kemudian memiliki modul memanggil systime_get()fungsi untuk mengambil waktu saat ini dalam kutu sistem atau milidetik. Setiap modul kemudian dapat menjadwalkan acara melalui penghitung waktu perangkat lunak menggunakan X_tick()fungsi.

jam biasa:

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

Berikut adalah dua proyek "dunia nyata" yang menggunakan gaya ini untuk AVR dan MSP430 .

Toby Jaffey
sumber