avr 마이크로 컨트롤러 및 init 또는 메인 루프 또는 타이머 또는 인터럽트 코딩을 시작하는 방법


9

나는 일을 위해 몇 년 동안 AVR 및 PIC 마이크로 컨트롤러 코드를 수정 해 왔지만 처음부터 아무것도 작성하지 않았습니다. 아주 잘 이해합니다.

지금 내 코드를 작성하기 시작했으며 시작하는 데 문제가 있습니다. 다른 사람들이 코드를 작성하기 시작하는 방법이 궁금하고 사람들이 권장하는 책이나 자습서가 있다면

초기화 함수 코딩으로 시작한 다음 인터럽트 한 다음 타이머를 시작한 다음 기본 while (1) 루프 ... 시작하는 가장 좋은 방법이 무엇인지 궁금합니다.

감사합니다

답변:


7
  1. 마이크로 컨트롤러 프로젝트에서 가장 먼저하는 일은 LED를 깜박이는 것입니다. 깜박 거리고 이름 ( "Blinky") 도 지정하십시오. 그것은 위젯 의 심장 박동 이며 프로그램이 멈추지 않는 한 항상 작동합니다.
  2. 로컬 버전 제어 저장소에 커미트하십시오.
  3. 다음은 프로그램 흐름도 또는 가입 한 계획 방법에 따라 의사 / 스크랩 코드로 전체 프로그램을 살펴 보는 것입니다. 무언가가 효과가 없거나 마음에 들지 않으면 주석을 달고 나중에 고칠 수 있도록 보관하십시오. 무언가를하는 방법을 모른다면, 의견에 무엇을해야하는지 적어 두십시오.
  4. 로컬 버전 제어 저장소에 커미트하십시오.
  5. 공백을 채울 시간입니다! 타이머 같은 기능을 한 번에 하나씩 구현 하고 테스트하십시오 . 프로그램은 항상 예상대로 컴파일되고 작동해야합니다. 이 시점에서 UART-> RS232-> PC 링크 또는 LCD 디스플레이와 같은 사용자 인터페이스 연결을 구현하고 싶습니다. Blinky를 잊지 마십시오 .
  6. 로컬 버전 제어 저장소에 커미트하십시오.
  7. 엄격한 테스트 루틴으로 코드를 깨십시오. 디버그. 다른 사람들이 귀하의 코드를 검토하도록하십시오 . 디버그. 온도 변화와 같은 디자인 매개 변수를 통해 위젯을 정기적으로 실행하십시오. 디버그.
  8. 로컬 버전 제어 저장소에 커미트하십시오.
  9. 마음이없는 바보라면 Blinky를 분리 하고 배를 타십시오.

AVRFreaks 에는 Dean Camera (일명 abcminuser )가 모듈화 C 코드 : 대규모 프로젝트 관리 라는 훌륭한 자습서가 있습니다 . James Wagner의 마이크로 프로세서 용 스테이트 머신 (State Machines for Microprocessors) 에 관심이있을 수도 있습니다 .


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헤더 파일을 사용하여 유형을 정의하지만 각 모듈마다 개별적으로 포함됩니다.

나는 하나의 프리 런닝 시스템 타이머를 사용하는 경향이 있으며 (a 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 에이 스타일을 사용하는 두 가지 "실제"프로젝트 입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.