avr mikrodenetleyicileri ve init veya ana döngü veya zamanlayıcılar veya kesmeler kodlamaya nasıl başlanır


9

AVR ve PIC mikrodenetleyici kodunu iş için birkaç yıldır değiştiriyorum ama sıfırdan hiçbir şey yazmadım, bunu gayet iyi anlıyorum.

Şimdi kendi kodumu yazmaya başlıyorum ve başlamakta sorun yaşıyorum. Diğer insanların kod yazmaya nasıl başladığını merak ediyordum ve bir kitap ya da eğitim varsa, bu konuda tavsiye ederim.

Başlatma fonksiyonunuzu kodlamakla mı başlıyorsunuz, sonra zamanlayıcıları kesiyor, sonra ana süre (1) döngü ... Başlamak için en iyi yolun ne olduğunu merak ediyorum.

teşekkür ederim

Yanıtlar:


7
  1. Herhangi bir mikrodenetleyici projesinde yapılan ilk şey bir LED yanıp söner; yanıp sönmeye devam edin ve ona bir isim verin ("Blinky") . Bu var kalp atışı Widget'ınızın ve her zaman bu kadar uzun programınız durma yapmamaktadır olarak çalışacaktır.
  2. Yerel sürüm denetim deposuna geçin.
  3. Ardından, program akış şemalarınıza veya hangi planlama yöntemlerine abone olduğunuza bağlı olarak, tüm program boyunca sahte / crapcode olarak uçmaktır. Bir şey işe yaramazsa veya beğenmediyseniz, yorum yapın, ancak daha sonra düzeltmeyi bildiğiniz için orada tutun. Bir şeyi nasıl yapacağınızı bilmiyorsanız, yorumlarda ne yapması gerektiğini yazın.
  4. Yerel sürüm denetim deposuna geçin.
  5. Boşlukları doldurma zamanı! Bir seferde bir işlev, örneğin zamanlayıcı uygulayın ve test edin . Programınız her zaman beklendiği gibi derlenmeli ve çalışmalıdır. Bu noktada UART -> RS232 -> PC bağlantıları veya LCD ekranlar gibi kullanıcı arabirimi bağlantılarını uygulamayı seviyorum. Blinky'yi unutma .
  6. Yerel sürüm denetim deposuna geçin.
  7. Sıkı test rutinleri ile kodunuzu kırmaya çalışın; ayıklama. Başkalarının kodunuzu incelemesini sağlayın ; ayıklama. Widget'ınızı sıcaklık değişimleri gibi tasarım parametreleri aracılığıyla düzenli olarak çalıştırın; ayıklama.
  8. Yerel sürüm denetim deposuna geçin.
  9. Kalpsiz bir aptalsanız Blinky'nin bağlantısını kesin ve gemi.

AVRFreaks , Dean Camera (aka. Abcminuser ) tarafından C Modülerleştirici Kod: Büyük projeleri yönetme adlı mükemmel bir öğreticiye sahiptir . Ayrıca , James Wagner tarafından Mikroişlemciler için Devlet Makineleri okumak da ilginizi çekebilir .


3
Kaynak kontrolü konusunda kesinlikle katılıyorum. Erken, sık sık
Toby Jaffey

Taahhütle birlikte, yeni bir dizine göz atmak ve yeniden oluşturmaktır. Kaynak denetimine dosya eklemeyi unutmaktan daha kötü bir şey yoktur.
Robert

6

En sevdiğim AVR-sıfırdan-C eğitimim https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Herkesin küçük gömülü sistemler için kendi stili vardır. Benimki burada:

Çok sayıda C dosyası kullanmayı seviyorum, her birinin adı işlevler için bir önek oluşturuyor. Örneğin, led_init()ve led_tick()ikisi de led.c. Bu, işleri modüler tutar ve taşınabilirliğe yardımcı olur.

common.hTürleri tanımlamak için bir başlık dosyası kullanıyorum , ancak her modül için ayrı ayrı dosyalar var.

Tek bir serbest sistem zamanlayıcı kullanma eğilimindedir (a systime.c) sonra modüller systime_get(), sistem kenelerinde veya milisaniyede geçerli saati getirmek için bir işleve çağırır . Her modül daha sonra X_tick()fonksiyonları kullanarak yazılım zamanlayıcıları aracılığıyla olayları programlayabilir .

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 ve MSP430 için bu stili kullanan iki "gerçek dünya" projesi .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.