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

2012.12.29 12:00




현재 군 복무중인 상태입니다.



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를 깜빡이게 할 수 있습니다.
연습회로에서 다루어 볼것이고 여기서 코드비전 사용법 정리를 마칩니다.

BinGoon AVR/AVR 기초, info , ,

  1. Blog Icon
    Mr도리

    저도 Code Vision 쓰는데 ㅎㅎ 체험판이라는 아쉬운점이 ..
    그치만 처음부터 이걸 사용해서 그런지 편하네요.
    위자드 부분은 불편한듯해서 No누르고 코딩했던 터라.. 위 방법은 ㅎㅎ 왠지 귀찮이즘..
    이것 저것 읽어보면서 느낀거지만 정말 꼼꼼하신듯.. 자료정리하는거 보면...
    잘보고 갑니당~

  2. 코드비전 위자드 대단하죠 하하하^!
    대신 프로그램 실력이 안늘어서 Studio로도 해보고 있어요 ㅎ

  3. Blog Icon
    최규진

    혹시 전원은 몇 볼트 몇 암페어 쓰셨나요?

  4. 안녕하세요. 답변이 늦어서 죄송합니다.
    먼저 회로 구성하실때 사용하시는 AVR에 따라서 다를수 있는데요. Attiny2313 데이터 시트를 보시면 약2.7V~6V까지 공급이 가능하도록 되어있습니다. 따라서 전압은 최대 6V로 본인이 주위에 설계하고자 하는 회로에 따라서 변동 될수 있구요. 트랜지스터를 이용한다면, 마치 수도꼭지를 돌려서 많은 물이 나오듯이 AVR로 5V 신호를 입력해서 트랜지스터 스펙에 따라 최대 40V 정도까지 제어할 수 있습니다.

    그리고 전류는 모터같은 종류가 사용될 경우 모터 스펙에 따라 모터 당 1A씩 추가해서 입력해 주시고, LED만 사용될 경우 LED당 보통 30mA정도 사용됩니다. 이것을 참고해서 전류(암페어)값은 높아도 문제가 없으니 넉넉한 값으로 입력해 주시면 되겠습니다. 그럼 도움이 되셨기를 바랍니다.^^

  5. 마지막에program all 눌럿을때 stk500 error entering programing mode 라고 뜨는건 무엇때문인가요?ㅜ

  6. 마지막에program all 눌럿을때 stk500 error entering programing mode 라고 뜨는건 무엇때문인가요?ㅜ

티스토리 툴바