AVR微控制器以及如何开始编写init或main循环或计时器或中断的代码


9

几年来,我一直在修改AVR和PIC微控制器的代码以进行工作,但从未从头开始编写任何东西,我非常了解。

我现在开始编写自己的代码,开始上手也很麻烦。我想知道其他人是如何开始编写代码的,是否有人推荐这本书或教程。

您是从编写初始化函数开始,然后是中断,然后是计时器,然后是主要的while(1)循环吗?我想知道最好的入门方法是什么。

谢谢

Answers:


7
  1. 在任何微控制器项目中,第一件事就是使LED闪烁;使其闪烁并为其命名(“ Blinky”)。这是您的小部件的心脏跳动,只要您的程序不会卡住,它将始终有效。
  2. 提交到本地版本控制存储库。
  3. 接下来,根据您的程序流程图或您订阅的任何计划方法,以伪代码/残码遍历整个程序。如果某件事情不起作用或您只是不喜欢它,请将其注释掉,然后保留在那儿,以便稍后知道要修复。如果您不知道该怎么做,请在注释中写下该做的事情。
  4. 提交到本地版本控制存储库。
  5. 是时候填补空白了!一次实现一个功能(例如计时器)并对其进行测试。您的程序应始终按预期进行编译和运行。我现在喜欢实现任何用户界面连接,例如UART-> RS232-> PC链接或LCD显示器。不要忘记眨眼
  6. 提交到本地版本控制存储库。
  7. 尝试使用严格的测试例程破坏代码;调试。让其他人审查您的代码 ; 调试。定期通过其设计参数(例如温度变化)运行小部件;调试。
  8. 提交到本地版本控制存储库。
  9. 如果您是个无情的傻瓜,请断开Blinky的连接,然后发货。

AVRFreaks有一个由Dean Camera(aka。abcminuser)编写的优秀教程,称为模块化C代码:管理大型项目。您可能也有兴趣阅读James Wagner的《微处理器状态机》


3
绝对同意源代码控制。尽早提交,经常提交
Toby Jaffey

与提交一起,是将其检出到新目录并重建它。没有比忘记将文件添加到源代码管理更糟糕的了。
罗伯特

6

我最喜欢的CVR AVR-from-scratch-in教程是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的 “现实世界”项目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.