ARM 용 라이터프로그램인 SAMBA 는 너무 사용하기에 너무 불편하고, 라이팅 하는데 오랜 시간이 걸립니다.

라이팅 속도가 빠르고 사용하기에 편한 H-JTAG 를 알아보겠습니다.

   

 

준비물

  • 보드(AT91SAM7S64 보드) -  TMS, TDI, TDO, TCK 핀이 사용됩니다.
  • JTAG 프로그램 케이블
  • 라이팅용 프로그램(H-JTAG)

   

   

   

   

프로그램 설치

http://www.hjtag.com/download.html(무료) 에서 다운로드하여 PC에 설치합니다.

   

 

 

 

프로그램 라이팅

 

바탕화면의 [H-JTAG] 을 실행한 후 [Detect target]로 연결된 디바이스를 검색합니다.

에러 메세지가 발생하지 않고, 글씨가 파란색으로 변하면 ARM 모듈과 연결이 정상적으로 된 것입니다.

 

여기서는 0x3F0F0F0F0F 라는 글씨가 표시되어 정상입니다.

 

 

 

 

   

연결이 성공하면, [F]모양의 아이콘(Start H-Flasher)을 클릭하여 H-Flasher 프로그램을 실행합니다.

   

[1. Flash Selection]에서 사용할 디바이스를 선택

 


 

 

 

2,3 번은 default 값으로 두고, [Programming] 에서 

  • [Flash]와[Target]을 체크해주고
  • 파일 [Type]를 선택하고,
  • Src File을 선택
  • Dst Addr 을 설정 [잘 모르면 0]
  • [Program]을 눌러 다운로드를 시작

만약 다운로드가 되지 않는다면, 케이블, 보드, 전원을 확인해보고 처음부터 다시 시도합니다.

 

 

 

 

   

 

 

 

다운로드가 진행됩니다.

 

 

 

   

보드를 리셋하여 동작을 확인합니다.

   

 

 

 

참고사항

 

SAMBA 프로그램으로 라이팅을 하게 되면,

보드를 초기화(플래시 삭제)해야 하고, 전원 ON/OFF해야 하고,

보드 라이팅(클릭을 5번이상 해야 함)을 해야 하고 리셋해야 하는 번거로움이 있는 반면

 H-JTAG는 설정을 한번만 해주면, 1초에 라이팅을 완료할 수 있어 편리합니다.

 

 

Posted by WhiteAT
,

 

윈도우 드라이버: 

WhiteAT_drive01.zip


펌웨어 파일:


main.bin



(첨부파일에는 기본적인 USB 통신기능만 있다.)

 

 

 

드라이버 설치를 완료하면 아래와 같은 장치가 추가된다.

(아래 쪽에 WAT302 Board-WhiteAT 이라고 있다.)

   

Posted by WhiteAT
,

   

예제코드:

at91sam7s64_Atmel_interrupt_3LED.zip

 

여러 개의 I/O 를 제어할 때,

main 에서 모두 처리하게 되면 복잡해지고
하나의 I/O 에서 딜레이가 필요할 때, 다른 I/O 에 영향을 줄 수 있다.

이런 것을 간단하게 처리할 수 있는 예입니다.

 


예제소스는
 - 1mS 마다 깜박이는 LED
 - 1S    마다 깜박이는 LED
 - 0.7S 마다 깜박이는 LED
=> 3개의 LED 의 깜박이는 시간을 간단하게 변경해서 LED를 제어하는 내용이다.

14초가 되면 동시에 ON되는 것을 알 수 있다.

Posted by WhiteAT
,

 

AT91SAM7S64 의 타이머/카운터

 

예제 소스: 

at91sam7s64_Atmel_interrupt.zip


- 3개의 16비트 타이머/카운터
- 각각 독립적이며
- 주파수 측정, 이벤트 횟수, 시간 간격 측정, 펄스 발생, 지연시간, PWM 을 만들 수 있음
- 클럭소스를 8 가지 중 1개를 선택 가능
                       

첨부한 소스는 타이머0의 C 채널을 이용하였습니다.

   

 

Posted by WhiteAT
,

 

4개의 키를 각각 누를 때마다 누른 횟수 증가 하는 예제

 

 

PORTA0 ~ PORTA3까지 스위치를 연결하고 각 스위치를 누를 때마다 카운터를 증가시켜 LCD에 출력 하는 CodeVisionAVR 예제입니다.

 

< 시작 화면: 모든 값이 0으로 표시됩니다 >

 

 

 

 

< SW1는 5번, SW2는 3번, SW3는 2번, SW4는 4번 눌렀을 때 결과입니다.

 

 

 

 

전체 소스 CodeVision 1.24.0 용

 

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

Character LCD Control

PORTB ==> LCD DataLine

PORTA.7 ==> LCD E

PORTA.6 ==> LCD RW

PORTA.5 ==> LCD RS

 

PORTA.3 ==> SW1

PORTA.2 ==> SW2

PORTA.1 ==> SW3

PORTA.0 ==> SW4

 

Main Clock : 8Mhz

 

각키를누를때마다누른횟수증가하는예제

 

Tools : Codevision

http://watsim.tistory.com

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

 

#include <stdio.h>

//#include <string.h>

 

typedef signed int INT16S;

typedef signed int UINT16;

typedef unsigned int INT16US;

typedef unsigned char INT8US;

typedef unsigned int WORD;

typedef unsigned char UINT8;

typedef unsigned char BOOL;

typedef unsigned char BYTE;

 

 

#define SetBit(PORT,ibit)        (PORT=PORT| ((1<<ibit)))

#define ClearBit(PORT, ibit)    (PORT=PORT&(~(1<<ibit)))

 

#include <mega128.h>

#define LCD_RS 5

#define LCD_EA 7

#define LCD_DATA_PORT PORTB

#define LCD_CONTROL_PORT PORTA

 

void CLcdXY(BYTE x1, BYTE y1);

void CLcdCommand(BYTE data);

void CLcdOn();

BYTE CLcdBusyCheck();

void CLcdPutStrings(BYTE x, BYTE y, char *str);

void CLcdPutChar(BYTE chr);

void CLcdClear();

 

// time delay for us

void WaitUS(unsigned char time_us)        

{

    register unsigned char i;

    for(i = 0; i < time_us; i++)

    {

#asm

        PUSH R0 ;

        POP R0 ;

        PUSH R0 ;

        POP R0 ;

#endasm

    }

}

 

// time delay for ms

void WaitMS(unsigned int time_ms)    

{

    register unsigned int i;

    for(i = 0; i < time_ms; i++)

    {

        WaitUS(250);

        WaitUS(250);

        WaitUS(250);

        WaitUS(250);

    }

}

 

 

char chTemp[17];

unsigned int g_iSwCount[4];

 

 

 

// 스위치(키)의입력값이변경되었는지와마지막값확인용

unsigned char keyvalue = -1; // -1 은입력된값이없을때

unsigned char lastkeyvalue = -1; // -1 은입력된값이없을때

 

 

 

void GetSW()

{

    keyvalue = PINA & 0x0F;

 

    // switch 의값이변경되었을때만처리하자.

    if( keyvalue != lastkeyvalue)

    {

 

        if((lastkeyvalue& 0x08) && !(keyvalue & 0x08))

        {

            g_iSwCount[0] ++;

            if(g_iSwCount[0] >999) g_iSwCount[0] = 0;

        }    

 

        if((lastkeyvalue& 0x04) && !(keyvalue & 0x04))

        {

            g_iSwCount[1] ++;

            if(g_iSwCount[1] >999) g_iSwCount[1] = 0;

        }

        if((lastkeyvalue& 0x02) && !(keyvalue & 0x02))

        {

            g_iSwCount[2] ++;

            if(g_iSwCount[2] >999) g_iSwCount[2] = 0;

        }

        

        if((lastkeyvalue& 0x01) && !(keyvalue & 0x01))

        {

            g_iSwCount[3] ++;

            if(g_iSwCount[3] >999) g_iSwCount[3] = 0;

        }

 

 

        lastkeyvalue = keyvalue;

    }

}

 

void main(void)

{

    DDRA = 0xF0;    

    DDRB = 0xFF;    

 

 

g_iSwCount[0]=0;

g_iSwCount[1]=0;

g_iSwCount[2]=0;

g_iSwCount[3]=0;

    

    SetBit(PORTD,LCD_EA);    // ENABLE

    ClearBit(PORTD,6);

 

 

    CLcdOn();

    CLcdClear();

 

    while (1)

    {

 

         sprintf(chTemp,"S1:%4d,S2:%4d." ,g_iSwCount[0],g_iSwCount[1]);

        CLcdPutStrings(0,0,chTemp);

         sprintf(chTemp,"S3:%4d,S4:%4d." ,g_iSwCount[2],g_iSwCount[3]);

        CLcdPutStrings(0,1,chTemp);

 

         GetSW();

    }

}

 

BYTE CLcdBusyCheck()

{

    WaitMS(1);

    

    return (0);

}

 

 

void CLcdPutStrings(BYTE x, BYTE y, char *str)

{

    int len = 0;

    CLcdXY(x,y);

    while(*str ){

        if(len>16) break;

        CLcdPutChar(*str++);

        len++;

    }

}

 

void CLcdPutChar(BYTE data)

{

    while(CLcdBusyCheck());

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    SetBit(LCD_CONTROL_PORT,LCD_RS);

    WaitUS(2);

    LCD_DATA_PORT= data;

    WaitUS(50);

    SetBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(50);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

}

 

void CLcdClear()

{

    CLcdCommand(1);

    WaitMS(1);

    CLcdCommand(2);

    WaitMS(1);

}

 

void CLcdXY(BYTE x, BYTE y)

{

    BYTE position;

    if(x>16) x = 0;

    switch(y)

    {

    case 0 :

        position = 0x80;

        break;

    case 1 :

        position = 0xC0;

        break;

    }

    CLcdCommand(position + x);

}

 

void CLcdCommand(BYTE data)

{

    while(CLcdBusyCheck()){}

    ClearBit(LCD_CONTROL_PORT,LCD_RS);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(1);

    LCD_DATA_PORT= data;

    WaitUS(50);

    SetBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(20);

    ClearBit(LCD_CONTROL_PORT,LCD_EA);

    WaitUS(50);

}

 

void CLcdOn()

{

    CLcdCommand(0x01);// dummy

    CLcdCommand(0x38);

    CLcdCommand(0x0C );

    CLcdCommand(0x01);

    CLcdCommand(0x06);

    CLcdCommand(0x01);

    WaitMS(2);

}

 

 

 

 

 

 

주요 부품

ATMEGA128 - 1EA

ABC016002E57 – 1EA
Character LCD 16x2

Switch – 4EA

POWER 5V/1A

 

 

 



실행파일 다운로드

이번 예제가 추가되면서 실행파일이 업데이트 되었습니다.

이 예제를 사용하기 위해서는 최신 버전(0.2.1.0 이상)으로 패치 하시기 바랍니다.

 

 실행파일 ( 0.2.1.0)




 WATSIM 프로젝트 파일과 Codevision 소스 파일



 

 

 

Posted by WhiteAT
,