본문 바로가기

AVR/AVR 기초, info

CodeVisionAVR 코드비전AVR 사용법 - AVR 통합 개발 환경

 

 

CodeVisionAVR C 다운로드 및 설치


 

Tiny2313 연습프로그램으로는 2Kbyte로 충분히 연습할 수 있으므로 평가판으로 설치합니다.

 

먼저 http://hpinfotech.ro/cvavr_download.html 해당 사이트에 접속해 혹은 다운로드 

아이콘을 클릭해서 평가판 CodeVisionAVR 

Evaluation을 다운로드 받고 설치합니다.

 

 

 CodeVisionAVR Evaluation (평가판) 다운로드 - 구글 드라이브로 연결됩니다.

 

 

설치 후 바탕화면에서 CodeVisionAVR을 실행합니다.(설치와 실행 과정은 생략합니다.)

(CodeVisionAVR 실행화면)



기본설정을 합니다.


 

컴파일러의 프로그램 화면 상의 불필요한 창(Code Information, Clipboard History)들을 끕니다.

 

 

 

ISP 프로그래머 설정


 

 

프로그램을 다운로드하는데 사용할 ISP프로그래머로 설정해줍니다.사진은 패러렐 프로그래머인 STK200+/300 사용 예제입니다.USB종류의 프로그래머 사용시에는 COM포트 번호도 맞추어 주어야 합니다.

 

 

 

 

 

 

새로운 프로젝트를 시작합니다.


 

기본설정은 완료되었고 새로운 프로젝트 파일을 만듭니다.

 

 

 

 

   

 

 

코드위자드를 사용합니다.


 

 

코드위자드 사용을 묻는 창이 나타나면 Yes, 사용하도록 하고 사용하고자 하는 칩시리즈를 선택합니다.AVR의 고수라면 코드위자드를 사용하지않고 직접 입력하셔도 좋습니다.

 

 

 

  

 

 

입출력(I/O)설정을 해줍니다.

 

먼저 사용중인 크리스탈 주파수 값을 입력하고 입출력 설정을 해주는데 아래 내용을 참조하세요.

 

 

   

 

 

 

 

 

빨강은 포트A (PORTA) 이고 파랑은 포트B (PORTB) 이고 초록은 포트D (PORTD)입니다.

A포트는 크리스탈과 리셋핀으로 사용 중이기 때문에 사용할 수 없고 

B포트와 

D포트를 사용 할 수 있습니다.

 

 

가령 본인이 설계한 장치가 위 회로와 같다면 B포트만 사용중입니다.

전류가 AVR입장에서 5V를 출력해서 0V로 흐르는 것을 정논리(위 회로), LED기호를 반대로연결 하고 애노드(+)부분을 VCC(5V)에 연결해두고 AVR입장에서 바깥에서 자기에게 전류가들어오며 흐르는 형태를 부논리 라고 합니다.그리고 중학교 과학시간에 배우지만 전류는 +에서 -로 흐릅니다.회로상에서는 VCC에서 GND로 흐릅니다. 이때 LED의 캐소드(-)단자가 GND에 연결되어있을때AVR에서 어떤 신호를 줘야 LED에 불이 들어올까요??

 

여기서 다음 표를 참고하세요.

명칭 전압 논리  2진수  전압레벨   입출력  풀업/풀다운
 VCC 5V  참(True) HIGH  OUTPUT   Pullup
GND  0V  거짓(False)  LOW  INPUT  Pulldown

 

입출력 설정중 Ports에서 예제 회로에서 다른포트를 사용하지 않으므로 설정하지 않아도

무방하고 Port B만 클릭해서 설정합니다.

Data Direction은 입력/출력 설정인데 스위치등 입력이 아니므로 OUT으로 모두 설정합니다.Pullup/Output Value 는 해당 Bit의 초기 상태를 설정하는데 포트B의 초기설정이 0이므로 

프로그램을 그대로 사용하면 모든 LED가 꺼진상태로 있습니다.

따라서 While 부분에서 포트 B값을 변경해줄 필요가 있는데 이때 8비트 프로세서이므로

핀 번호별로 할당된 값

 

 포트번호  PB7  PB6 PB5  PB4  PB3 PB2  PB1  PB0 
 2진 값  128  64  32  16  8  4  2  1

즉 모든비트가 1로 설정되야 하므로 128+64+32+16+8+4+2+1 을 한 255를 16진수로 변환하면

FF입니다.

이 값을 16진수라고 표현하기 위해 0x를 붙이며 while 부분에서 PORTB=0xFF값을 주면B포트에 연결 된 모든 LED가 점등 됩니다.

 

 

코드위자드 설정을 완료합니다.


 

 

코드를 생성하고 저장합니다. Generate Program, save and exit클릭 후 원하는 폴더에

C파일 저장, Prj파일 저장, Cwp파일 저장 합니다.

 

 

 

생성된 코드를 수정합니다.


 

 

 

생성 된 코드는 다음과 같습니다.

 

 

/*******************************************************

This program was created by the

CodeWizardAVR V2.60 Evaluation

Automatic Program Generator

?Copyright 1998-2012 Pavel Haiduc, HP InfoTech s.r.l.

http://www.hpinfotech.com

 

Project : 

Version : 

Date    : 2012-12-25

Author  : 

Company : 

Comments: 

 

 

Chip type               : ATtiny2313

AVR Core Clock frequency: 8.000000 MHz

Memory model            : Tiny

External RAM size       : 0

Data Stack size         : 32

*******************************************************/  

/* */사용은 주석(설명문)이므로 제거

 

#include <tiny2313.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 A initialization

// Function: Bit2=In Bit1=In Bit0=In 

DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);

// State: Bit2=T Bit1=T Bit0=T 

PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);  

포트A는 사용하지 않으므로 모두 제거

 

// Port B initialization

// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 

PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

 

// Port D initialization

// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 

DDRD=(0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 

PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

포트D는 사용하지 않으므로 모두 제거

 

// 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(s)/Counter(s) Interrupt(s) initialization

TIMSK=(0<<TOIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<ICIE1) | (0<<OCIE0B) | (0<<TOIE0) | (0<<OCIE0A);

 

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// Interrupt on any change on pins PCINT0-7: Off

GIMSK=(0<<INT1) | (0<<INT0) | (0<<PCIE);

MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00); 

인터럽트는 사용하지 않으므로 모두 제거

 

// USI initialization

// Mode: Disabled

// Clock source: Register & Counter=no clk.

// USI Counter Overflow Interrupt: Off

USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC);  

비동기 통신은 사용하지 않으므로 모두제거

 

// USART initialization

// USART disabled

UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

비동기 통신은 사용하지 않으므로 모두제거

// Analog Comparator initialization

// Analog Comparator: Off

ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

DIDR=0x00;

아날로그 비교기는 사용하지 않으므로 모두제거

 

while (1)

      {

      // Place your code here

 

      }

}

 
불필요한 부분을 모두 제거하면 다음처럼 남은 코드가 있습니다.

 

#include <tiny2313.h>
 
void main(void)
{                             

DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);

// 출력으로 설정해둔 상태입니다.    

PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// 포트B의 초기상태는 0 (0V) LED는 초기에 모두 꺼져있는 상태입니다.          
while (1)  
     {    
 
PORTB=0xFF // Place your code here (이부분에 원하는 C 코딩을 하시면 된답니다.)
 
     }
}

 

 

 

 

컴파일 (빌드) 합니다.


 

Project > Build All 클릭 빌드가 완료되면 창이 뜨는데 오류가 없으면 No error가 뜨고

Hex, Bin 파일이 프로젝트를 저장했던폴더/Exe에 생성

됩니다.

에러가 뜬다면 Messages 박스를 보고 에러를 수정해서 다시 빌드합니다.

 

 

 

 

MCU보드에 프로그램을 다운로드합니다.


 

ISP프로그래머를 연결하고 컴파일로 생성된 Rom또는 Hex파일을 AVR 보드에 다운로드

합니다. 

Run the chip programmer 클릭후 다운로드 할 칩 선택

 

  

 

File > Load FLASH 로 초기에 프로젝트 생성했던 폴더/Exe 에서 Hex또는 Rom 을 열기합니다.

 

 

  

 

Program All을 클릭하고 상태바가 100% 찰때까지 기다립니다.

상태바가 다 차고 나면 EEPROM에 기록을 할꺼냐는 창이 나오는데 Cancel을 눌러줍니다.

 

 

작동을 확인해 봅니다.


 


 

위 사진처럼 불이 계속해서 들어와 있습니다.

 

소스코드 중에서 While 괄호 부분에 포트B에 값을 1주고 0.5초 대기 다시 전체 0주고 0.5 대기
코드를 넣으면 LED를 깜빡이게 할 수 있습니다.
연습회로에서 다루어 볼것이고 여기서 코드비전 사용법 정리를 마칩니다.