microcontroladores avr e como começar a codificar init ou loop principal ou temporizadores ou interrupções

9

Estou modificando o código dos microcontroladores AVR e PIC há alguns anos para trabalhar, mas nunca escrevi nada do zero, eu o entendo muito bem.

Estou começando a escrever meu próprio código agora e estou tendo problemas para começar. Fiquei me perguntando como outras pessoas começam a escrever código e se há um livro ou tutorial que as pessoas recomendariam sobre isso.

Você começa com a codificação da sua função de inicialização e depois interrompe os temporizadores e o loop while (1) principal ... Estou pensando qual é a melhor maneira de começar.

Obrigado

milão
fonte

Respostas:

7
  1. A primeira coisa que se faz em qualquer projeto de microcontrolador é piscar um LED; mantenha-o piscando e dê-lhe um nome ("Blinky") também. É a batida do coração do seu widget e sempre funcionará enquanto o seu programa não ficar parado.
  2. Confirme com o repositório de controle de versão local.
  3. O próximo passo é percorrer todo o programa em pseudo / crapcode, com base nos diagramas de fluxo do programa ou em quaisquer métodos de planejamento nos quais você se inscreveu. Se algo não funcionar ou você simplesmente não gostar, comente, mas mantenha-o lá para que você possa corrigi-lo mais tarde. Se você não sabe fazer algo, escreva o que deve fazer nos comentários.
  4. Confirme com o repositório de controle de versão local.
  5. Hora de preencher os espaços em branco! Implemente uma função de cada vez, por exemplo, o cronômetro e teste-a . Seu programa deve sempre compilar e funcionar conforme o esperado. Eu gosto de implementar qualquer conexão da interface do usuário neste momento, como UART -> RS232 -> links para PC ou monitores LCD. Não se esqueça do Blinky .
  6. Confirme com o repositório de controle de versão local.
  7. Tente quebrar seu código com rotinas de teste rigorosas; depurar. Outras pessoas revisam seu código ; depurar. Execute seu widget pelos parâmetros de design regularmente, como variações de temperatura; depurar.
  8. Confirme com o repositório de controle de versão local.
  9. Desconecte Blinky se você for um tolo sem coração e envie.

O AVRFreaks possui um excelente tutorial escrito por Dean Camera (também conhecido como abcminuser ) chamado Modularizing C Code: Gerenciando grandes projetos . Talvez você também esteja interessado em ler Máquinas de Estado para Microprocessadores de James Wagner.

tyblu
fonte
3
Concordo absolutamente com o controle da fonte. Commit cedo, commit frequentemente
Toby Jaffey
Junto com o commit, é fazer o check-out em um diretório novo e reconstruí-lo. Nada pior do que esquecer de adicionar um arquivo ao controle de origem.
Robert
6

Meu tutorial favorito do AVR-do-zero-em-C é https://www.mainframe.cx/~ckuethe/avr-c-tutorial/

Todo mundo tem seu próprio estilo para pequenos sistemas embarcados. Aqui está o meu:

Eu gosto de usar muitos arquivos C, com o nome de cada um criando um prefixo para funções. Por exemplo, led_init()e led_tick()ambos estão em led.c. Isso mantém as coisas modulares e ajuda na portabilidade.

Eu uso um common.harquivo de cabeçalho para definir tipos, mas as inclusões individuais para cada módulo.

Eu costumo usar um único timer de sistema de freerunning (em a systime.c) e, em seguida, os módulos chamam uma systime_get()função para buscar o tempo atual em ticks do sistema ou milissegundos. Cada módulo pode então agendar eventos através de temporizadores de software usando as X_tick()funções.

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

Aqui estão dois projetos do "mundo real" usando esse estilo para AVR e MSP430 .

Toby Jaffey
fonte