microcontrollori avr e come iniziare a programmare init o main loop o timer o interrupt


9

Sto modificando il codice del microcontrollore AVR e PIC da alcuni anni per lavoro ma non ho mai scritto nulla da zero, lo capisco abbastanza bene.

Sto iniziando a scrivere il mio codice ora e ho problemi a iniziare. Mi chiedevo come le altre persone iniziassero a scrivere codice e se c'è un libro o un tutorial che la gente consiglierebbe su questo.

Cominci con la codifica della tua funzione di inizializzazione, quindi interrompi, quindi i timer, quindi il ciclo while (1) principale ... Mi chiedo quale sia il modo migliore per iniziare.

Grazie

Risposte:


7
  1. La prima cosa che si fa in qualsiasi progetto di microcontrollore è lampeggiare un LED; continua a lampeggiare e assegnagli anche un nome ("Blinky") . È il battito del cuore del tuo widget e funzionerà sempre finché il tuo programma non si bloccherà.
  2. Effettuare il commit nel repository di controllo versione locale.
  3. Il prossimo è volare attraverso l'intero programma in pseudo / crapcode, in base ai diagrammi di flusso del programma o ai metodi di pianificazione a cui ti sei abbonato. Se qualcosa non funziona o semplicemente non ti piace, commentalo ma tienilo lì in modo da sapere in seguito per risolverlo. Se non sai come fare qualcosa, scrivi cosa dovrebbe fare nei commenti.
  4. Effettuare il commit nel repository di controllo versione locale.
  5. È ora di riempire gli spazi vuoti! Implementare una funzione alla volta, ad esempio il timer, e testarlo . Il tuo programma dovrebbe sempre compilare e funzionare come previsto. Mi piace implementare tutte le connessioni dell'interfaccia utente a questo punto, come UART -> RS232 -> collegamenti PC o display LCD. Non dimenticare Blinky .
  6. Effettuare il commit nel repository di controllo versione locale.
  7. Prova a violare il codice con routine di test rigorose; debug. Chiedi ad altri di rivedere il tuo codice ; debug. Esegui il tuo widget attraverso i suoi parametri di progettazione regolarmente, come le variazioni di temperatura; debug.
  8. Effettuare il commit nel repository di controllo versione locale.
  9. Disconnetti Blinky se sei uno sciocco senza cuore e spedisci.

AVRFreaks ha un eccellente tutorial scritto da Dean Camera (aka. Abcminuser ) chiamato Modularizing C Code: Gestione di grandi progetti . Potresti anche essere interessato a leggere State Machines for Microprocessors di James Wagner.


3
Assolutamente d'accordo sul controllo del codice sorgente. Impegnati presto, commetti spesso
Toby Jaffey il

Insieme al commit, è di estrarlo in una nuova directory e ricostruirlo. Niente di peggio che dimenticare di aggiungere un file al controllo del codice sorgente.
Robert,

6

Il mio tutorial AVR-da-zero-in-C preferito è https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Ognuno ha il proprio stile per i piccoli sistemi integrati. Ecco il mio:

Mi piace usare molti file C, con il nome di ognuno che costituisce un prefisso per le funzioni. Ad esempio, led_init()e led_tick()sono entrambi in led.c. Ciò mantiene le cose modulari e aiuta con la portabilità.

Uso un common.hfile di intestazione per definire i tipi, ma i singoli includono per ciascun modulo.

Tendo a utilizzare un singolo timer di sistema per freerunning (in a systime.c), quindi i moduli richiamano una systime_get()funzione per recuperare l'ora corrente in tick di sistema o millisecondi. Ogni modulo può quindi programmare eventi tramite timer software utilizzando le X_tick()funzioni.

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

Ecco due progetti "del mondo reale" che utilizzano questo stile per AVR e MSP430 .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.