bộ vi điều khiển avr và cách bắt đầu mã hóa init hoặc vòng lặp chính hoặc bộ định thời hoặc ngắt


9

Tôi đã sửa đổi mã vi điều khiển AVR và PIC trong một vài năm nay cho công việc nhưng chưa bao giờ viết bất cứ điều gì từ đầu, tôi hiểu nó khá tốt.

Tôi đang bắt đầu viết mã của riêng mình và gặp khó khăn khi bắt đầu. Tôi đã tự hỏi làm thế nào những người khác bắt đầu viết mã và nếu có một cuốn sách hoặc hướng dẫn mọi người sẽ giới thiệu về điều này.

Bạn có bắt đầu với việc mã hóa chức năng khởi tạo của mình sau đó ngắt sau đó tính giờ sau đó là vòng lặp while (1) chính không ... Tôi tự hỏi cách tốt nhất để bắt đầu là gì.

Cảm ơn bạn

Câu trả lời:


7
  1. Điều đầu tiên người ta làm trong bất kỳ dự án vi điều khiển nào là nháy đèn LED; giữ cho nó nhấp nháy và đặt tên cho nó ("Blinky") , quá. Đó là nhịp đập của widget và sẽ luôn hoạt động miễn là chương trình của bạn không bị kẹt.
  2. Cam kết kho lưu trữ kiểm soát phiên bản địa phương.
  3. Tiếp theo là lướt qua toàn bộ chương trình bằng mã giả / crapcode, dựa trên sơ đồ luồng chương trình của bạn hoặc bất kỳ phương pháp lập kế hoạch nào bạn đã đăng ký. Nếu một cái gì đó không hoạt động hoặc bạn chỉ không thích nó, hãy bình luận nhưng hãy để nó ở đó để bạn biết sửa nó sau. Nếu bạn không biết cách làm một cái gì đó, hãy viết ra những gì nó phải làm trong các bình luận.
  4. Cam kết kho lưu trữ kiểm soát phiên bản địa phương.
  5. Thời gian để điền vào chỗ trống! Thực hiện một chức năng tại một thời điểm, ví dụ như bộ đếm thời gian và kiểm tra nó . Chương trình của bạn sẽ luôn được biên dịch và làm việc như mong đợi. Tôi thích thực hiện bất kỳ kết nối giao diện người dùng nào tại thời điểm này, như UART -> RS232 -> liên kết PC hoặc màn hình LCD. Đừng quên Blinky .
  6. Cam kết kho lưu trữ kiểm soát phiên bản địa phương.
  7. Cố gắng phá vỡ mã của bạn với các thói quen kiểm tra nghiêm ngặt; gỡ lỗi. Nhờ người khác xem lại mã của bạn ; gỡ lỗi. Chạy widget của bạn thông qua các thông số thiết kế của nó thường xuyên, như biến đổi nhiệt độ; gỡ lỗi.
  8. Cam kết kho lưu trữ kiểm soát phiên bản địa phương.
  9. Ngắt kết nối Blinky nếu bạn là một kẻ ngốc vô tâm và giao hàng.

AVRFreaks có một hướng dẫn tuyệt vời được viết bởi Dean Camera (còn gọi là abcminuser ) được gọi là Modularizing C Code: Quản lý các dự án lớn . Bạn cũng có thể thích đọc Máy trạng thái cho Bộ vi xử lý của James Wagner.


3
Hoàn toàn đồng ý về kiểm soát nguồn. Cam kết sớm, cam kết thường xuyên
Toby Jaffey

Cùng với cam kết, là kiểm tra nó vào một thư mục mới và xây dựng lại nó. Không có gì tệ hơn việc quên thêm tệp vào kiểm soát nguồn.
Robert

6

Hướng dẫn ưa thích về AVR-from-scratch-in-C của tôi là https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Mọi người đều có phong cách riêng cho các hệ thống nhúng nhỏ. Đây là của tôi:

Tôi thích sử dụng nhiều tệp C, với tên của mỗi tệp tạo tiền tố cho các hàm. Ví dụ, led_init()led_tick()cả hai trong led.c. Điều này giữ cho mọi thứ mô-đun và giúp với tính di động.

Tôi sử dụng một common.htệp tiêu đề để xác định các loại, nhưng cá nhân bao gồm cho mỗi mô-đun.

Tôi có xu hướng sử dụng một bộ đếm thời gian hệ thống tự do duy nhất (trong a systime.c) sau đó có các mô-đun gọi ra một systime_get()chức năng để lấy thời gian hiện tại trong tích tắc hoặc mili giây của hệ thống. Mỗi mô-đun sau đó có thể lên lịch các sự kiện thông qua bộ định thời phần mềm bằng cách sử dụng các X_tick()chức năng.

chung.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);
}

đã dẫn

#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

đã dẫn

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

C chính:

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

Đây là hai dự án "thế giới thực" sử dụng phong cách này cho AVRMSP430 .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.