quarta-feira, junho 13, 2012

Escrevendo um Firmware Alternativo para o Display JY-MCU 3208 - Parte 2

Continuando o post anterior, vamos ver como compilar e gravar o nosso firmware de teste e examinar o resultado.


O makefile abaixo automatiza todo o processo:

GCCFLAGS=-g -Os -Wall -mcall-prologues -mmcu=atmega8
LINKFLAGS=-Wl,-Map,${PROGNAME}.map
AVRDUDEFLAGS=-c usbtiny -p atmega8
LINKOBJECTS=ht1632c.o

PROGNAME=Teste1

all: ${PROGNAME}.hex

program: ${PROGNAME}-upload

${PROGNAME}.hex: ${PROGNAME}.c ht1632c.c
 avr-gcc ${GCCFLAGS} -o ht1632c.o -c ht1632c.c
 avr-gcc ${GCCFLAGS} ${LINKFLAGS} -o ${PROGNAME}.o ${PROGNAME}.c ${LINKOBJECTS}
 avr-objcopy -O ihex ${PROGNAME}.o ${PROGNAME}.hex
 
${PROGNAME}-upload: ${PROGNAME}.hex
 avrdude ${AVRDUDEFLAGS} -U flash:w:${PROGNAME}.hex:a

Estamos usando aqui alguns recursos mais avançados do make:
  • Nas linhas iniciais definimos algumas "macros", isto é, nomes para textos que serão usados posteriormente. Por exemplo, definimos que PROGNAME corresponde a Teste1.
  • Usamos a sintaxe $(MACRO) para colocar o texto correspondente à macro MACRO. Por exemplo, a primeira regra do makefile é all: $(PROGNAME).hex, o que equivale a all: Teste1.hex. Reparar que com o uso de macros fica fácil fazer uma alteração se refletir em todo o arquivo.
Se executarmos simplesmente "make" será obedecida a regra "all", que gera Teste1.hex. Se executarmos "make program" Teste1.hex será gerado (se necessário) e gravado na Flash.

A gravação da Flash usa o nosso velho conhecido avrdude. Neste caso estamos gravando somente a Flash, mantendo os fuses com os valores anteriores.

O vídeo abaixo mostra o programa em execução no display.



Reparar que a sequência na qual os LEDs são acendidos é um pouco estranha. Os quatro bits de cada posição da memória do controlador controlam quatro LEDs consecutivos com o bit menos significativo controlando o LED mais à direita. As posições de memória são mapeadas em "zig-zag" dentro de cada módulo 8x8 do display. O endereço 0 controla os primeiros quatro LEDs do primeiro módulo, o endereço 1 controla os quatro LEDs à direita; o endereço 2 os LEDs à esquerda na segunda linha do primeiro módulo e assim por diante até o final do módulo. O endereço 16 controla os primeiros quatro LEDs do segundo módulo e assim sucessivamente.

No próximo post faremos uma rotina para endereçar os LEDs de uma forma mais simples.


Nenhum comentário: