Como já vimos antes, o avr-gcc toolchain inclui um compilador C, uma biblioteca e alguns utilitários para o desenvolvimento de programas para os microcontroladores AVR. Como primeiro exemplo, vou fazer um software simples que acende um LED quando um botão é pressionado.
O primeiro passo é examinar o circuito (que está nos arquivos do blog) e preparar um arquivo de include que indique quais os registradores e bits estão conectados aos LEDs e botões:
// Conexões dos LEDS #define LED_DDR DDRB #define LED_PORT PORTB #define LED1 _BV(PB7) #define LED2 _BV(PB6) #define LED3 _BV(PB5) #define LED4 _BV(PB4) #define LED5 _BV(PB3) #define LED6 _BV(PB2) #define LED7 _BV(PB1) #define LED8 _BV(PB0) // Conexão das Teclas #define TEC_DDR DDRD #define TEC_PORT PORTD #define TEC_PIN PIND #define TEC1 _BV(PD4) #define TEC2 _BV(PD5) #define TEC3 _BV(PD6) #define TEC4 _BV(PD7)O programa em si é bastante simples. Na iniciação, precisamos programar os pinos onde estão os LEDs como saída e ligar os resistores de pull-up nos pinos onde estão os botões:
// Inicia as direçoes dos pinos de conexão dos LEDs LED_DDR |= 0xFF; // LEDs Apagados LED_PORT = 0x00; // Liga pullup das teclas TEC_DDR &= ~(TEC1|TEC2|TEC3|TEC4); TEC_PORT |= TEC1|TEC2|TEC3|TEC4;Feito isto, quando um botão estiver apertado o bit correspondente estará em zero; no lado dos LEDs o valor 1 corresponde a aceso. O código abaixo implementa a lógica desejada de forma bem direta:
for (;;) { if ((TEC_PIN & TEC1) == 0) LED_PORT |= LED1; else LED_PORT &= ~LED1; if ((TEC_PIN & TEC2) == 0) LED_PORT |= LED2; else LED_PORT &= ~LED2; if ((TEC_PIN & TEC3) == 0) LED_PORT |= LED3; else LED_PORT &= ~LED3; if ((TEC_PIN & TEC4) == 0) LED_PORT |= LED4; else LED_PORT &= ~LED4; }Vamos usar um makefile para gerar o programa. Nada de novo aqui, exceto pela parte de gravação do software, que veremos no próximo post:
GCCFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega32 LINKFLAGS=-Wl,-Map,${PROGNAME}.map PROGNAME=Teste1 all: ${PROGNAME}.hex program: ${PROGNAME}-upload ${PROGNAME}.hex: ${PROGNAME}.c jymega32.h avr-gcc ${GCCFLAGS} ${LINKFLAGS} -o ${PROGNAME}.o ${PROGNAME}.c avr-objcopy -O ihex ${PROGNAME}.o ${PROGNAME}.hex ${PROGNAME}-upload: ${PROGNAME}.hex bootloadHID ${PROGNAME}.hexExecutando o make o programa é compilado e linkado e o hex correspondente é gerado.
Falta ver como gravar este hex no ATmega32. Poderíamos regravar toda a flash com o USBtinyISP ou outro programador, mas veremos no próximo post como usar o bootloader que vem de fábrica para gravar a aplicação conectando a placa diretamente a um PC.
Os projeto completo está nos arquivos do blog, em jymega32_teste1.zip.
Nenhum comentário:
Postar um comentário