ไมโครคอนโทรลเลอร์ avr และวิธีเริ่มใช้งานการเข้ารหัส init หรือลูปหลักหรือตัวจับเวลาหรืออินเตอร์รัปต์


9

ฉันได้ทำการดัดแปลงโค้ด AVR และ PIC ไมโครคอนโทรลเลอร์เป็นเวลาสองสามปีเพื่อทำงาน แต่ไม่เคยเขียนอะไรเลยตั้งแต่ต้นฉันเข้าใจดีทีเดียว

ฉันเริ่มเขียนรหัสของตัวเองตอนนี้และมีปัญหาในการเริ่มต้น ฉันสงสัยว่าคนอื่น ๆ เริ่มเขียนโค้ดได้อย่างไรและถ้ามีหนังสือหรือแบบฝึกหัดที่คนอยากจะแนะนำในเรื่องนี้

คุณเริ่มต้นด้วยการเขียนรหัสฟังก์ชั่นการเริ่มต้นของคุณแล้วขัดจังหวะแล้วตัวนับแล้วในขณะที่หลัก (1) วน ... ฉันสงสัยว่าวิธีที่ดีที่สุดในการเริ่มต้นคือ

ขอบคุณ

คำตอบ:


7
  1. สิ่งแรกที่ทำในโครงการไมโครคอนโทรลเลอร์คือกระพริบไฟ LED; ให้มันกระพริบตาและตั้งชื่อ("Blinky")เช่นกัน มันเป็นหัวใจสำคัญของวิดเจ็ตของคุณและจะทำงานตราบใดที่โปรแกรมของคุณไม่ติดขัด
  2. ยอมรับกับที่เก็บการควบคุมเวอร์ชันโลคัล
  3. ถัดไปคือการบินผ่านโปรแกรมทั้งหมดในหลอก / crapcode ตามแผนภาพการไหลของโปรแกรมของคุณหรือวิธีการวางแผนใด ๆ ที่คุณสมัครเป็นสมาชิก หากมีอะไรบางอย่างไม่ทำงานหรือคุณไม่ชอบความเห็นมันออกมา แต่เก็บไว้ที่นั่นเพื่อให้คุณรู้ว่าจะแก้ไขในภายหลัง หากคุณไม่ทราบวิธีการทำบางสิ่งบางอย่างเขียนสิ่งที่ควรทำในความคิดเห็น
  4. ยอมรับกับที่เก็บการควบคุมเวอร์ชันโลคัล
  5. ได้เวลากรอกข้อมูลในช่องว่าง! ดำเนินการอย่างใดอย่างหนึ่งฟังก์ชั่นได้ตลอดเวลาเช่นการจับเวลาและทดสอบ โปรแกรมของคุณควรรวบรวมและทำงานตามที่คาดไว้ ฉันชอบที่จะใช้การเชื่อมต่อส่วนต่อประสานกับผู้ใช้ ณ จุดนี้เช่น UART -> RS232 -> ลิงค์พีซีหรือจอ LCD อย่าลืมเกี่ยวกับBlinky
  6. ยอมรับกับที่เก็บการควบคุมเวอร์ชันโลคัล
  7. ลองแบ่งรหัสด้วยขั้นตอนการทดสอบที่เข้มงวด การแก้ปัญหา มีคนอื่น ๆ ตรวจสอบรหัสของคุณ ; การแก้ปัญหา เรียกใช้วิดเจ็ตของคุณผ่านพารามิเตอร์การออกแบบเป็นประจำเช่นความแปรผันของอุณหภูมิ การแก้ปัญหา
  8. ยอมรับกับที่เก็บการควบคุมเวอร์ชันโลคัล
  9. ปลดBlinky ออกถ้าคุณเป็นคนโง่ที่ไร้หัวใจและจัดส่ง

AVRFreaksได้กวดวิชาที่ดีเยี่ยมที่เขียนโดยคณบดีกล้อง (aka. abcminuser ) เรียกว่าmodularizing C รหัสสินค้า: ผู้จัดการโครงการขนาดใหญ่ คุณอาจสนใจอ่านState Machines for Microprocessorsโดย James Wagner


3
เห็นด้วยอย่างแน่นอนเกี่ยวกับการควบคุมแหล่งที่มา กระทำก่อนกำหนดส่งบ่อย
Toby Jaffey

พร้อมกับการกระทำคือการตรวจสอบออกไปยังไดเรกทอรีใหม่และสร้างใหม่ ไม่มีอะไรเลวร้ายไปกว่าการลืมเพิ่มไฟล์ลงในคอนโทรลแหล่งที่มา
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()ฟังก์ชั่นเพื่อดึงเวลาปัจจุบันในระบบ ticks หรือมิลลิวินาที แต่ละโมดูลสามารถกำหนดเวลาเหตุการณ์ผ่านตัวจับเวลาซอฟต์แวร์โดยใช้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;
}

นี่คือสองโครงการ "โลกจริง" ใช้รูปแบบนี้สำหรับAVRและMSP430

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.