ÍNDICE DE CONTEÚDO
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
/******************************************************* This program was created by the CodeWizardAVR V3.29 Automatic Program Generator © Copyright 1998-2016 Pavel Haiduc, HP InfoTech s.r.l. http://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
http://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.