본문 바로가기

Enginius/Firmware

Atmel Studio6환경에서 JMOD 128-1에 UART 인터럽트와 IO제어

 대학원을 들어왔더니 생각치도 앖게 LED를 제어할 일이 생겨서 MCU를 알아보다가 입맛에 맞는 제품을 발견했다! 



여느 atmega128 개발 보드와 비슷한 모양이지만 isp와 usb2serial을 내장하고 있어서 JTAG와 같은 다른 장비 없이도, 또 usb2serial같은 장비가 없이도 왠만한 테스트는 다 할 수 있다. 가히 혁명적인 보드라고 할 수 있다. 하지만 이 제품의 진가는 다른데 있었으니, 뒤에서 설명하겠다. 


 기존에는 회사에서 IAR Studio를 사용해서 개발했었기 때문에 이번에도 그리 하려고 크랙을 설치하는데.. 안된다 -_-.. 하루를 고생하다가 이건 아니다 싶어서 포기하고, AVR Studio와 Win AVR을 설치했는데! MFC 에러가 뜬다. -_-... 그래서 다시 하루를 버리고..


 에라 모르겠다 이왕 이렇게 된거 최선 환경에서 개발해보자! 란 마음에서 atmel에 들어가니까 atmelStudio6라는 거창한 이름의 개발 툴이 있는게 아닌가! 그래서 이를 받아서 설치했다. Visual Studio를 기반으로 해서 UI가 매우 익숙했다. 


 주소: http://www.atmel.com/microsite/atmel_studio6/

 

 몬가 모던하고 깔끔한게 좋아보였다. 이때까진.. 받아보니 용량이 700메가가 넘어가더라 -_-.. 인고의 시간을 거치고 나서 실행을 하니 몬가 좋긴 한데 PIC의 새로운 개발환경인 MPLAB X 같이 무겁다.. 

 

 <실제 개발 환경>


 내 Visual studio는 Visual assist X가 깔려 있는데 이것 역시 연동이 되어서 더 보기가 편했다. 게다가 기존의 AVR Studio 4는 별도의 gcc 컴파일러를 필요로 했었는데 이것은 자체 컴파일러가 있다. (F7을 똭)

 

 모 여튼 IAR과 비교했을 때 문법이 조금 다르기 떄문에 인터넷을 뒤지고 뒤져서 예제 파일을 받았고, 컴파일 까지 됐는데.. 문제는 downloading을 하는 곳이 없는 것이다 -_-.... 이 보드에 내장된 칩을 이용하려면 STK500을 이용해야 하는데, 지원하는 mcu에 atmega128이 없는 것이다. atmega128은 atmel에서 내놓은 자식이었단 말인가.. 여기서 굴하기엔 여기까지 삽질한 시간이 너무 길다. 그래서 물어물어 STK500에서 atmega128을 사용할 수 있는 방법을 찾았다. (실은 이것이 이번 포스팅의 주 목적이다.)


 결론부터 말하자면 아래 블로그의 포스팅을 따라가면 된다. 

  http://kpg1226.blogspot.com/2012/03/how-to-use-stk500-in-avr-studio-5.html


 필요한 것은 아래 파일만 있으면 된다. 

AVR Tools.zip

 

 1. 이 파일의 압축을 풀은 후에 Program Files 폴더 밑에 Atmel 폴더에 놓는다. 

 2. 압축을 풀은 폴더 안에 있는 STK500.reg 파일을 실행한다. 레지스터 파일이라 진짜 하겠냐고 묻는데 걍 고

 3. 자 여기서부터가 복잡한데, Atmel Studio에서 Tools->External Tools에 들어간다. 



4. 자 여기서 위에 네모 친 5곳을 채워넣어야 한다. 물론 먼저 Add를 해야지 

Title : "Any titles" - 아무거나

Command : "Select [...] Stk500.exe". - 아까 압축 풀어서 옮긴 것으로 

Args : "-e -b -t -J -I1.84MHz -dATMega128 -pf -vf -if$(ProjectDir)Debug\$(ItemFileName).hex". 그대로 복사

Init Dir. : "$(ItemDir) or perhaps $(ProjectDir)". - 그대로 복사


... 귀찮다 블로그에 있는거 복사 붙여넣기. 


5. Right mouse button select a [Customize...] toolbar blank area.

6. Select a [New...] and enter toolbar name "STK500".


7. New your toolbar add command.(Add or Remove Buttons -> Customize) 


8. Select [Add Command...] → "Tools" → "External Command1


9. Complete! Use after open or create your project.


 근데 사실 여기까지 하고 난 안됐었다.. 그래서 다음 파일을 설치했다. 

AVRCommandLineTools.z01

AVRCommandLineTools.z02

AVRCommandLineTools.z03

AVRCommandLineTools.z04

AVRCommandLineTools.z05

AVRCommandLineTools.zip


 막상 설치하면 중복 설치라고 뜨지만 설치하고 나서 됐으니... 

 여튼 이렇게하고 나면 됐다. 난



10. JMOD 128-1 의 예제 소스는 다음과 같다. 

 - 동작은 uart echo와 'a'를 넣었을 경우 LED를 켠다. 회로에서 PG0에 연결되어있다. 

#define F_CPU 16000000UL


#include <avr/interrupt.h>

#include <avr/io.h>

#include <util/delay.h>

#include <stdio.h>



void UART_int(void)

{

UCSR0A = 0; // 비동기 모드

UCSR0B = 0x98; // RX,TX 동작허용, 문자길이 8비트,수신 인터럽트

UCSR0C = 0x06; // 비동기 모드 송신시 상승에지, 수신시 하강에지, 전송데이터 8비트

UBRR0H = 0x00; // 보레이트 설정 9600bps -->>UBRR = 8(U2X=0, 16MHz일때)

UBRR0L = 0x67;

}

unsigned char rx0_char(void)

{

while((UCSR0A&0x80) == 0X00);

return UDR0;

}

void tx0_char(char ch)

{

while((UCSR0A&0x20) == 0X00);

UDR0 = ch;

}


ISR(SIG_UART0_RECV)

{

unsigned char rdata;

rdata = UDR0;

if(rdata == 'a') 

PORTG = 0xff;

else 

PORTG = 0x0;

tx0_char(rdata);

}


void uart_putChar(unsigned char commPort, unsigned char sendData)

{

switch(commPort)

{

case 0:

while(!( UCSR0A & 0x20 ));

UDR0 = sendData;

break;

case 1:

while(!( UCSR1A & 0x20 ));

UDR0 = sendData;

break;

}

}


int sys_putchar(char c, FILE *file)

{

tx0_char(c);

if(c == '\n') tx0_char('\r');

}

FILE mystdout = FDEV_SETUP_STREAM(tx0_char, NULL, _FDEV_SETUP_WRITE);


int main(void)

{

    char ch;

    char buf[100];

    int xx;

    UART_int();

DDRG = 0xff;


    stdout = &mystdout;

    printf("Hello Embedded HOlic ?\n");

    

    sei();

    while(1)

    {

    }

}


 11. 이 보드의 큰 장점은 바로 엄청난 서포트에 있다! 

  임베디드 홀릭이라는 카페가 있다.  

   http://cafe.naver.com/lazydigital

  이 카페는 이 보드의 제작사가 운영하는 카페인데 질문을 하면 대답을 잘해주신다. 너무 감사하다 ! ㅠㅠ 


 12. 실제 동작 사진 



'Enginius > Firmware' 카테고리의 다른 글

JMOD-128 UART 인터럽트와 LED 제어 예제  (0) 2012.06.24
VUSB (AVRUSB) usb를 avr의 gpio를 이용해서 제어.  (0) 2011.01.26
NEC 코드 리모컨  (0) 2010.04.16
PIC32 - UART  (2) 2010.04.13
PIC32 - TIMER  (0) 2010.04.13