Programe o Arduino UNO com o CodeVisionAVR

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:

Ligação do LCD no Arduino UNO
Figura 1 – Ligação do LCD no Arduino UNO

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:

Ligação do LCD no ATmega328P
Figura 2 – Ligação do LCD no ATmega328P

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:

Iniciando o CodeWizardAVR no CodeVisionAVR
Figura 3 – Iniciando o CodeWizardAVR

Será aberta uma janela para escolha do tipo de microcontrolador AVR usado na aplicação. Selecione a opção do ATmega:

Selecione o tipo de AVR do projeto
Figura 4 – Selecione o tipo de AVR do projeto

Será aberta a janela de configuração do projeto. Acesse Project Information nas opções. Vamos inserir algumas informações para o nosso projeto:

Informações do projeto
Figura 5 – Informações do projeto

Vamos selecionar o microcontrolador e configurar o clock do sistema. Selecione Chip e faça a seguinte configuração:

Escolha do microcontrolador no CodeVisionAVR
Figura 6 – Escolha do microcontrolador

Agora vamos configurar LCD. Para isso, selecione Alphanumeric LCD e faça a configuração conforme esquemático apresentado acima:

Configuração dos pinos de controle do LCD.
Figura 7 – Configuração dos pinos de controle do LCD.

Agora, vamos configurar a direção dos pinos. Acesse Ports. Configure os PORTB e PORTD conforme figura 8:

Configuração da direção dos pinos e estado inicial
Figura 8 – Configuração da direção dos pinos e estado inicial

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:

Projeto gerado no CodeVisionAVR
Figura 9 – Projeto gerado

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:

Resultado da compilação
Figura 10 – Resultado da compilação

Com o Arduino conectado ao computador, acesse Tools> Upload to Arduino:

Upload para o Arduino
Figura 11 – Upload para o Arduino

Selecione a placa Arduino UNO, a porta COM e depois clique em OK. Será feito o upload do arquivo .hex para a placa:

Programação finalizada
Figura 12 – Programação finalizada

Após o UPLOAD será apresentada a seguinte informação no display:

Mensagem de saída
Figura 13 – Mensagem de saída

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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
4 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Marcelo
Marcelo
24/02/2018 21:36

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

Mateus Mateus
Mateus Mateus
05/08/2017 16:47

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.

Rogerio Moreira
Rogerio Moreira
17/05/2017 14:04

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.

Fabio_Souza_Embarcados
Fabio_Souza_Embarcados
Reply to  Rogerio Moreira
18/05/2017 22:00

Legal Rogério. Eu usei o CVAVR no passado, era muito bom.

Home » Arduino » Programe o Arduino UNO com o CodeVisionAVR

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: