O CodeVisionAVR é um ambiente integrado de desenvolvimento para os microcontroladores AVR e XMEGA. Possui compilador ANSI C e apresenta diversos recursos para facilitar a programação, que vão desde bibliotecas/drivers até assistente gráfico para configuração de periféricos.
O CodeVisionAVR já possui alguns anos de estrada, tive a oportunidade de trabalhar com essa ferramenta no passado e lembro-me da facilidade para iniciar um projeto usando seu assistente.
Recentemente recebi uma notícia que a nova versão do CodeVisionAVR tinha suporte para algumas placas Arduino e resolvi testar.
O CodeVisionAVR não é grátis, mas você pode usar a versão de avaliação que possui limitação de código de 4Kbytes e alguns recursos.
A seguir são apresentados os passos para configuração de um projeto com LCD Alfanumérico e o upload para a placa Arduino UNO.
Hardware
Para nosso teste, vamos usar uma placa Arduino UNO e um display LCD de 16X2. A ligação do LCD no Arduino:
A seguir é apresentado o esquema de ligação do display no Atmega328P. Precisamos saber quais são os pinos do microcontrolador usados para o controle do display. Essa informação será importante para a etapa de configuração no CodeVisioAVR:
Com o esquemático em mãos, vamos para o código no CodeVisionAVR.
Criando um projeto no CodeVisionAVR
O CodeVisionAVR possui um assistente para criação e configurações iniciais de um projeto. Para iniciar um novo projeto, acesse File>New Project, será aberta uma janela perguntando se você quer usar o CodeWizardAVR, clique em Yes:
Será aberta uma janela para escolha do tipo de microcontrolador AVR usado na aplicação. Selecione a opção do ATmega:
Será aberta a janela de configuração do projeto. Acesse Project Information nas opções. Vamos inserir algumas informações para o nosso projeto:
Vamos selecionar o microcontrolador e configurar o clock do sistema. Selecione Chip e faça a seguinte configuração:
Agora vamos configurar LCD. Para isso, selecione Alphanumeric LCD e faça a configuração conforme esquemático apresentado acima:
Agora, vamos configurar a direção dos pinos. Acesse Ports. Configure os PORTB e PORTD conforme figura 8:
Para finalizar, acesse o menu: Generate, Save and Exit. Crie uma pasta e salve os arquivos.
A estrutura do projeto será criada, assim como todo o código de configuração dos registradores, conforme configuração feita no codeWizardAVR:
Explorando o arquivo main.c gerado, podemos observar o cabeçalho criado com as informações do projeto inseridas. Em seguida são incluídas as bibliotecas e logo abaixo encontramos a função main. Note que a ferramenta de geração de código já configura todos os registradores, conforme configurações feitas graficamente, inclusive a inicialização do LCD. No loop infinito encontramos a mensagem para inserir o código.
A seguir é apresentado o código do nosso teste no CodeVisionAVR:
/*******************************************************
This program was created by the CodeWizardAVR V3.29
Automatic Program Generator
© Copyright 1998-2016 Pavel Haiduc, HP InfoTech s.r.l.
https://www.hpinfotech.com
Project : HelloWorldArduinoCodevisionAVR
Version : 1
Date : 3/2/2017
Author : Fábio Souza
Company : Embarcados
Comments:
Teste do CodeVisionAVR para programação
da placa Arduino UNO
Chip type : ATmega328P
Program type : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*******************************************************/
#include <io.h>
// Alphanumeric LCD functions
#include <alcd.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=Out Bit1=Out Bit0=Out
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=0 Bit1=0 Bit0=0
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2A output: Disconnected
// OC2B output: Disconnected
ASSR=(0<<EXCLK) | (0<<AS2);
TCCR2A=(0<<COM2A1) | (0<<COM2A0) | (0<<COM2B1) | (0<<COM2B0) | (0<<WGM21) | (0<<WGM20);
TCCR2B=(0<<WGM22) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0);
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1);
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=(0<<OCIE2B) | (0<<OCIE2A) | (0<<TOIE2);
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
// Interrupt on any change on pins PCINT8-14: Off
// Interrupt on any change on pins PCINT16-23: Off
EICRA=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
EIMSK=(0<<INT1) | (0<<INT0);
PCICR=(0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
// USART initialization
// USART disabled
UCSR0B=(0<<RXCIE0) | (0<<TXCIE0) | (0<<UDRIE0) | (0<<RXEN0) | (0<<TXEN0) | (0<<UCSZ02) | (0<<RXB80) | (0<<TXB80);
// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
ADCSRB=(0<<ACME);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR1=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);
// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);
// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);
// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTB Bit 0
// RD - PORTB Bit 3
// EN - PORTB Bit 2
// D4 - PORTD Bit 4
// D5 - PORTD Bit 5
// D6 - PORTD Bit 6
// D7 - PORTD Bit 7
// Characters/line: 16
lcd_init(16);
while (1)
{
// go on the second LCD line
lcd_gotoxy(0,0);
// display the message
lcd_putsf(" CodeVisionAVR");
lcd_gotoxy(0,1);
lcd_putsf(" Embarcados");
while (1);
}
}
Para compilar, acesse o menu Build All ou pressione CTRL + F9. Será aberta uma janela com o resultado da compilação:
Com o Arduino conectado ao computador, acesse Tools> Upload to Arduino:
Selecione a placa Arduino UNO, a porta COM e depois clique em OK. Será feito o upload do arquivo .hex para a placa:
Após o UPLOAD será apresentada a seguinte informação no display:
Chegamos ao fim do nosso tutorial, mas você pode explorar os demais recursos do CodeVisionAVR utilizando sua placa Arduino.
Caso queira explorar outra ferramenta para desenvolvimento com os microcontroladores AVR, recomendo o Atmel Studio. Veja alguns links:
Primeiros passos com Atmel Studio
Atmel Studio 7 está disponível
Se ficou alguma dúvida, deixe seu comentário abaixo.


















Fábio, parabéns pelo artigo.
Tenho uma licença original do Codevision v3.32 e recentemente resolvi fazer alguns testes com o Arduino. Porém tudo compila sem erros mas dá erro ao subir o código para o Arduino UNO. Sabe o que pode ser ? Preciso mudar o bootloader do Arduino ? O protocolo que o Codevision usa ‘Optiboot’ é o do Arduino ?
Grato,
Marcelo
Curso Arduino Essencial
https://bit.ly/curso-arduino-essencial
Aprenda a programar desde o zero, projetar e calcular circuitos elétricos e desenvolver projetos com a plataforma microcontroladora mais utilizada por empresas e universidades do mundo: o Arduino! Neste curso você aprenderá a trabalhar com LEDs, resistores, sensores, displays LCD; saberá como manusear um multímetro digital para medir grandezas elétricas tais como corrente, tensão e resistência e desenvolverá seu próprio sensor de estacionamento caseiro que emite sinais sonoros e mostra a distância.
Excelente , Fábio. Parabéns. O CodeVisionAVR não é gratuito , mas não é muito caro. É leve, roda em qualquer máquina. Na época da Atmel, muitos engenheiros de aplicação usavam o CodeVision.
Legal Rogério. Eu usei o CVAVR no passado, era muito bom.