컴파일하여 생성된 결과 파일(헥사파일)을 다음과 같은 방법으로 라이팅 할 수 있습니다.

- Ponyprog 프로그램과 프린터 포트를 이용

- AVRStudio 프로그램과 WAT-AVR ISP ( USB 용 AVR ISP)를 이용

 



 



 

하드웨어 연결

 

 

 

그림처럼 AVR 모듈과 USB ISP 케이블을 연결하고 USB ISP 케이블을 PC의 USB 포트에 연결합니다.




 

 

 

 

 

이 내용에 대한

원본은 http://WhiteAT.com 에서 제공하는 WAT-AVR128 모듈 매뉴얼에 있습니다.

저작권은 http://WhiteAT.com 에 있습니다.

 

 



PL2303 드라이버(XP, 윈도우7 공용) 

   PL2303_Prolific_DriverInstaller_v1.5.0.zip
드라이버 제작사인 http://www.prolific.com.tw/eng/downloads.asp?ID=31 에서도 다운로드 가능합니다.





 

 

프로그램 연결

 

 

 

AVRStudio STK500 도구바에서 ‘Display the Connect Dialog' 버튼을 클릭하면 ISP 연결 설정에 관한 다이어로그 박스가 나타납니다.

 



 

 

  

 

Platform에서 AVRISP 를 선택하고 Port에서 연결된 포트 번호를 선택한 후 [Connect]를 클릭합니다. 연결을 성공하면 프로그램라이팅에 관련된 다이어로그박스가 뜨게 되고 연결이 실패하면 다시 선택하라고 같은 창이 뜹니다.

지금까지는 ISP 케이블에 AVR 모듈을 연결하지 않아도 상관없습니다.

 





 

 

 

 

 

 

 

 

디바이스 설정

 

 

[Device and Signature Bytes]에서 사용할 디바이스명을 선택하고 [Settings]에서 적당한 라이팅 속도를 결정합니다.

 

 

 

 

 

 

 

 

 

 

 

프로그램 라이팅

 

 

 

[...]으로 헥사파일을 선택한 후 [Program]으로 라이팅을 할 수 있습니다.


 








 

 

 

 

FUSE( 퓨즈) 설정

 

 


 

아래와 같이 설정할 수 있습니다. 가장 많이 사용되는 설정이며 필요에 따라 변경할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

에러 발생시

 

 

만약 다음과 같은 에러가 발생한다면 AVR 모듈이 연결되었는지 확인하고 연결되어 있다면 SCK 속도를 낮춰가며 적당한 라이팅 속도를 찾아야 합니다.

 

 









 

 

현재 AVRStudio 에서는 총 6가지의 ISP 라이팅 속도를 제공합니다.

 

 

 




 




 

이 제품은 http://kit128.com/goods/view.php?seq=4&main=true&mainType=1 에서 구매하실 수 있습니다.



 

Posted by WhiteAT
,

 

PORTA의 0 ~ 7 포트에 LED 8개가 연결되어 있고 LED에 불이 들어오게 하려면 해당되는 포트에 '0'을 출력하면 됩니다. 딥스위치 1번을 ON 하면 D0(PORTA.0에 연결된 LED)부터 D7까지 차례대로 ON되고 딥스위치 1번을 OFF 하면 마지막 켜진 LED부터 OFF 되는 예제입니다.

 

 

DIP SWITCH 1번 ON

D0: ●○○○○○○○

D1: ●●○○○○○○

D2: ●●●○○○○○

D3: ●●●●○○○○

D4: ●●●●●○○○

D5: ●●●●●●○○

DIP SWITCH 1번 OFF

D4: ●●●●●○○○

D3: ●●●●○○○○

D2: ●●●○○○○○

D1: ●●○○○○○○

D0: ●○○○○○○○

PORTA 에 LED, PORTE에는 딥스위치가 연결되며, 실험에 사용할 회로와 WAT보드의 연결 방법은 아래와 같습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

원문은 http://avr128.com 에 있습니다.

 






 

 

 

 

 

주요 코드

 

main.c 일부

/*

    EX_01_03.c

 

    PORTA의0 ~ 7 포트에LED 8개가연결되어있고

    LED에불이들어오게하려면해당되는포트에

    ''을출력하면됩니다.

    

    딥스위치1번을ON 하면

    D0(PORTA.0에연결된LED)부터D7까지차례대로ON되고

    딥스위치1번을OFF 하면마지막켜진LED부터OFF 되는

    예제입니다.

 

    LED: PORTA 에연결

    DIP SWITCH: PORTE 에연결

         

 

    AVRStudio 4.18

    2011-08-25

 

    최신코드와다른예제는홈페이지에있습니다.

    http://avr128.com

 

*/

 

#include <avr/io.h>

 

// 일정시간딜레이

void Delay()

{

    register unsigned long i;

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

    {

        asm volatile(" PUSH R0 ");

        asm volatile(" POP R0 ");

        asm volatile(" PUSH R0 ");

        asm volatile(" POP R0 ");

        asm volatile(" PUSH R0 ");

        asm volatile(" POP R0 ");

        asm volatile(" PUSH R0 ");

        asm volatile(" POP R0 ");

        asm volatile(" PUSH R0 ");

        asm volatile(" POP R0 ");    

    }

}

 

int main()

{

    DDRA = 0xFF;     // PORTA OUTPUT

    PORTA = 0xFF;    //    ALL LED OFF

 

    DDRE = 0x00;        // DIP SWITCH 용으로입력

 

    while(1)

    {

 

        Delay();

 

        if((PINE & 0x01) == 0x00)

        {

 

            // DIP 1 이ON 이면

            PORTA <<= 1;

            PORTA |= 0;        // 마지막LED 는ON 되게

        

        }

        else

        {

 

            //     DIP 1이OFF 이면

            PORTA >>=1;

            PORTA |=0x80;    // 처음LED 는OFF 되게

 

        }    

    }

}

 

 

 

 

 

 

전체 소스 ( AVRStudio 컴파일용)

 

 

 




Posted by WhiteAT
,

 

PC에서 받은 데이터를 CLCD에 출력하는 예제입니다.

 

 

 

<Character LCD 초기화>

 

 

 

 

 

 

< PC로부터 수신된 데이터 출력 >

 

 

 

 

 

< PC프로그램 화면 >

http://avr128.com/35 에 있는 시리얼 통신 프로그램을 사용했습니다.

 

 

 

윈도우에 기본적으로 제공되는 하이퍼터미널 프로그램을 사용해도 됩니다.^^

 

 

 

 

원문은 http://avr128.com 에 있습니다.

 

 

 

 

 

 

 

주요 코드

 

main.c 일부

/*

    EX_09_02.c

 

    PC에서USART0 로받은데이터를LCD에출력

    AVRStudio 4.18

    2011-08-16

 

    http://avr128.com

 

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

int main()

{

    INT16S iRxData;

 

    OpenSCI0(57600);    // USART 0 열기

 

    CLCD_Init();        // LCD 초기화

 

    while(1)

    {

        iRxData=GetByte0();

        if( 0<= iRxData && iRxData<=255 ){

            

            // CLCD 에출력

            CLCD_PutChar(iRxData);

            PutChar0(iRxData); // echo 보내기

        }

    }

}

 

 

 

 

 

 

전체 소스

 


 

Posted by WhiteAT
,

 

 

WAT-KEY 4x4 예제

 

WAT-KEY 4x4 배열을 PC 에서 실시간으로 모니터링 하는 예제

http://avr128.com/27

 

 

 

 

WAT-IO&ADC 예제

 

로터리 스위치의 값을 FND 4자리 중 제일 앞자리에 표시하는 예제

http://avr128.com/25

 

가변 저항의 값에 따라 LED 를 켜는 예제

http://avr128.com/24

 

 

 

Posted by WhiteAT
,

WAT-AVR128_EXT 보드

AVR키트 2011. 7. 20. 15:53

 

 

다른 보드에 연결

 

WAT-AVR128_EXT 보드(확장 보드)를 사용하면 다른 보드와 쉽게 연결 할 수 있습니다.

 

 

 

보드명

보드 설명

WAT-KEY 4x4

4x4 배열의 매트릭스 키보드 보드

WAT-CLCD

Character LCD 보드

WAT-GLCD

Graphics LCD 보드

WAT-IO&ADC

LED, FND 와 가변 저항 테스트 보드

추가 예정

 
   

 

 

 

 

WAT-KEY 4x4 보드

 

WAT-KEY 4x4 보드

4x4 배열로 스위치를 장착하여 MCU의 8개의 핀과 VCC 핀만으로 16개의 스위치를 제어하는 예제를 제공합니다.

 

 

 

 

 

 

 

Posted by WhiteAT
,

WAT-AVR128 모듈

AVR키트 2011. 7. 20. 15:53


제품 소개

 

WAT-AVR128 Module은 Atmel 의 ATMEGA128A을 장착한 모듈로 ATMEGA128A 구동에 필요한 기본적인 부품과 회로를 포함하고 있으며, SP3232 RS-232C IC를 장착하여 PC와의 통신을 쉽게 할 수 있게 도와주는 제품입니다.

 

특징

 

 

사용 전압: 3.3V ~ 5.0V

AD 채널 수: 8채널 10bit

CLOCK: 11.0592 Mhz (보레이트 115200bps에서 오류률 0%)

시리얼 통신: 2채널

2채널을 TTL LEVEL 레벨과 RS-232C 레벨의 두 가지 모두 제공

ISP: ISP 커넥터 제공

크기: 40.6(가로) x 48.8mm (세로)

소켓: 2.54mm 2줄 핀 헤더 사용

 

 

 

 

 

 

 


 

 

외부 장치 연결

 

 

핀 정의

 

좌 측

우 측

1. VCC

2. VCC

41. VCC

42. VCC

3. ADC7/TDI

4. ADC6/TDO

43. AD0

44. AD1

5. ADC5/TMS

6. ADC4/TCK

45. AD2

46. AD3

7. ADC3

8. ADC2

47. AD4

48. AD5

9. ADC1

10. ADC0

49. AD6

50. AD7

11. AREF

12. AVCC

51. ALE

52. NC

13. PE0

14. PE1

53. A15

54. A14

15. PE2

16. PE3

55. A13

56. A12

17. PE4

18. PE5

57. A11

58. A10

19. PE6

20. PE7

59. A09

60. A08

21. GND

22. GND

61. GND

62. GND

23. PB0

24. PB1

63. /RD

64. /WR

25. PB2

26. PB3

65. PD7

66. PD6

27. PB4

28. PB5

67. PD5

68. PD4

29. PB6

30. PB7

69. PD3

70. PD2

31. NC

32. NC

71. PD1

72. PD0

33. PG3

34. PG4

73. TXD0_12V

74. RXD0_12V

35. nRESET

36. NC

75. TXD1_12V

76. RXD1_12V

37. GND

38. GND

77.GND

78.GND

 

 

ISP 핀

10핀 ISP용 커넥터를 제공하여 ISP로 프로그램 라이팅이 가능합니다.

아래처럼 보드 좌측의 1번과 10p 플랫케이블의 적색 1번 핀 방향을 맞춰서 연결해야 합니다.

 




 

 

RS-232C 통신용 핀

 

RS-232C용 통신에 사용되는 핀은 3핀으로 구성되어 PC와의 통신 연결이 쉽습니다.

 

 

 

 

외부 장치 연결

 

핀헤더 소켓을 사용하여 외부 장치와 연결하여 사용할 수 있습니다.

 

WAT-AVR128_EXT 보드(확장 보드)를 사용하면 외부 보드와 쉽게 연결 할 수 있습니다.



 







WAT-KEY 4x4 예제

 

WAT-KEY 4x4 배열을 PC 에서 실시간으로 모니터링 하는 예제

http://avr128.com/27

 

 

 

 

WAT-IO&ADC 예제

 

로터리 스위치의 값을 FND 4자리 중 제일 앞자리에 표시하는 예제

http://avr128.com/25

 

가변 저항의 값에 따라 LED 를 켜는 예제

http://avr128.com/24

 

 

 



매뉴얼  (최신 자료는 http://whiteat.com/57204 에서 제공됩니다.)

WATAVR128_manual.pdf


 

예제 소스  

AVR128_example.zip

 


회로도

WATAVR128_sch.pdf




Posted by WhiteAT
,

 

WAT-AVR128보드로 키 패드를 읽어 PC로 전송하는 방법입니다.

 

키 패드 제어에 대한 자세한 설명은 아래 주소를 참조하세요

http://avr128.com/26

 

 

 

 

 



 

 

 

 

SW16을 누를 경우

 

 

 

 

 

 

SW13, SW14, SW15, SW16을 동시에 누를 경우

 

 

 

 

 

SW1, SW6, SW11, SW16을 동시에 누를 경우

 

 









 

 

 

메인 소스 AVR Studio 4.18 용

 

 

 

/*

    

필요한보드

    1. WAT-AVR128 (모듈)

    2. WAT-AVR128 EXT (확장보드)

    3. WAT-KEY 4x4 (키패드)

=> WAT-KEY 4x4 보드를PORTA 에연결한 예

 

 

기능

    4x4 배열의키상태를시리얼통신으로PC에서실시간으로감시한다.

    - MFC (VC6.0)

    - C# (VS2008)

 

 

컴파일러: AVRStudio 4.18

 

    http://avr128.com

 

*/

 

 

#include <avr/io.h>

#include "WAT128.h"

 

 

void OperatingFromPC();

 

int main(){

 

    // 시리얼통신으로PC에전송하기위한보레이트설정

    InitSCI0(57600);

 

 

    // 키패드초기화

    InitKey4x4();

 

 

    while(1)

    {

        // 키패드의값을읽어서PC로전송

        OperatingFromPC();

 

    }

}

 

 

BOOL    bPCHeadCheckOK = FALSE;

INT16US g_uiPCRecevingDataCount = 0;

BYTE    g_bytePCData[RX_BUFFER_SIZE];

 

//! rx 버퍼초기화

void RXClearFromPC(){

    g_uiPCRecevingDataCount = 0;

    bPCHeadCheckOK = FALSE;

}

 

//! rx 처리루틴

void OperatingFromPC(){

    BYTE byteCommand;

 

    INT16S iRxData;

    iRxData=GetByte0();

    if( 0<= iRxData && iRxData<=255 ){

 

        

        if (TRUE == bPCHeadCheckOK)

        {

            // STX 를통과했다면(이미나왔다면)

            g_bytePCData[g_uiPCRecevingDataCount] = iRxData;

            if(++g_uiPCRecevingDataCount>=RX_BUFFER_SIZE )

            {

                g_uiPCRecevingDataCount =0;

            }

 

            if (COMM_ETX == iRxData )

            {

                byteCommand = g_bytePCData[0];

                switch(byteCommand)

                {

                case 0x10:    // key 4x4

                    if ( g_uiPCRecevingDataCount>=7)

                    {

                        if (COMM_ETX == g_bytePCData[6] )

                        {

                            SendKey4x4( GetKey4x4());

                        }

                        RXClearFromPC();

                    }

                    break;

 

                default:

                    RXClearFromPC();

                    break;

                }            

            }

        }

        else

        {

            // STX 가나오지않았다면STX 가나올때까지기다린다.

            if (COMM_STX == iRxData)

            {

                bPCHeadCheckOK = TRUE;

                g_uiPCRecevingDataCount = 0;

 

            }else{

 

            }

        }

    }

}

 

 

 

 

 

 

 

 

 

C# .NET 2008 소스 (PC용 어플리케이션 소스)

 

 

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

using System.Diagnostics;

 

namespace WATkey4x4

{

public partial class frmMain : Form

{

 

// 수신 데이터 보관용 버퍼

List<byte> m_buff = new List<byte>();

 

// 4x4 배열의 버튼 묶음

List<Button> m_Buttons = new List<Button>();

 

 

public frmMain()

{

InitializeComponent();

 

// 시리얼 통신 초기화

m_sp1 = new SerialPort();

m_sp1.DataReceived += new SerialDataReceivedEventHandler(m_sp1_DataReceived);

 

 

// 한번에 처리하기 위해 모든 버튼을 묶음

m_Buttons.Add(this.btnSW1);

m_Buttons.Add(this.btnSW2);

m_Buttons.Add(this.btnSW3);

m_Buttons.Add(this.btnSW4);

m_Buttons.Add(this.btnSW5);

m_Buttons.Add(this.btnSW6);

m_Buttons.Add(this.btnSW7);

m_Buttons.Add(this.btnSW8);

m_Buttons.Add(this.btnSW9);

m_Buttons.Add(this.btnSW10);

m_Buttons.Add(this.btnSW11);

m_Buttons.Add(this.btnSW12);

m_Buttons.Add(this.btnSW13);

m_Buttons.Add(this.btnSW14);

m_Buttons.Add(this.btnSW15);

m_Buttons.Add(this.btnSW16);

 

}

 

void m_sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

// 수신된 데이터를 처리하자.

int iRecSize = m_sp1.BytesToRead;

 

if (iRecSize != 0)

{

 

byte[] buff = new byte[iRecSize];

m_sp1.Read(buff, 0, iRecSize);

 

foreach (byte by in buff)

{

m_buff.Add(by);

}

}

 

 

 

// STX 찾기

 

while (true)

{

if (m_buff.Count <= 0) break;

if (m_buff[0] == 0x02) break;

else

{

m_buff.RemoveAt(0);

}

}

 

if (m_buff.Count >= 8)

{

bool bSame = true;

 

if (0x02 != m_buff[0]) bSame = false;

if (0x03 != m_buff[7]) bSame = false;

 

if (true == bSame)

{

 

// CRC 를 체크해야 하는데 생략 ;;

 

UInt16 byteData = Convert.ToUInt16(m_buff[2]);

byteData <<= 8;

byteData += Convert.ToUInt16(m_buff[3]);

 

 

// 버튼을 하나씩 꺼내서 눌러졌는지 아닌지를 검사하자

foreach (Button btn in m_Buttons)

{

// SW1

if (byteData % 2 == 1)

{

// 눌러졌으면 RED

btn.BackColor = System.Drawing.Color.Red;

}

else

{

// 눌러지지 않았으면 Control(기본색)

btn.BackColor = System.Drawing.SystemColors.Control;

}

byteData >>= 1;

}

 

// 수신 버퍼에서 지금 처리된 데이터를 제거하자

m_buff.RemoveRange(0, 7);

 

 

 

}

else

{

// 수신 버퍼 초기화

m_buff.Clear();

 

}

}

}

 

 

private void btnOpen_Click(object sender, EventArgs e)

{

// 컴포트 열기

this.btnOpen.Enabled = false;

m_sp1.PortName = txbComNum.Text; // 컴포트명

m_sp1.BaudRate = Convert.ToInt32(txbBaud.Text); // 보레이트

 

m_sp1.Open();

 

tmr50mS.Enabled = true;

tmr50mS.Start();

}

 

private void btnClose_Click(object sender, EventArgs e)

{

// 컴포트 닫기

tmr50mS.Stop();

m_sp1.Close();

this.btnOpen.Enabled = true;

}

 

private void TmrRequest(object sender, EventArgs e)

{

// 키패드 값을 요청하자

byte[] byteData =new byte[100];

int iLength=0;

 

byteData[iLength++] = 0x02;

byteData[iLength++] = 0x10;

 

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

byteData[iLength++] = 0x00;

 

byteData[iLength++] = 0xCC; // CRC 체크를 생략한다;

 

byteData[iLength++] = 0x03;

 

m_sp1.Write(byteData,0,iLength);

}

}

}

 

 

 

 

 

 

 

 

 

 

 

 

필요한 보드

 

 

WAT-AVR128 (ATMEGA128A 모듈)

WAT-AVR128 EXT (ATMEGA128A 외부 인터페이스 보드)

WAT-KEY 4x4 (4x4 키 패드 보드)

 

 

 

 

프로젝트 파일(전체 소스) 다운로드

 

ATMEGA128 소스 &  C# 소스:  ( 압축파일 안의 App 이름이 있는 폴더가 c# 소스입니다.)

EX_01_05 다운로드

 


 

Posted by WhiteAT
,

 

4x4 배열의 스위치를 제어하는 방법을 알아 보겠습니다.

 

여러 가지 방법이 있지만 그 중 간단한 방법으로 회로를 구성할 수 있습니다.

 

 

 

 

 

 

 

하나의 스위치 값 읽기

 

먼저 회로를 살펴 보면 SET 이 4개, VALUE 가 4개 있습니다.

SET 으로 '1', '0' 신호를 주고 VALUE 로 '0'인지, '1'인지 판단 할 수 있습니다.

스위치가 모두 눌러지지 않은 상태라면 VALUE 는 모두 '1'이 됩니다.

 

 

우측하단의 SW16 의 값을 읽으려면 어떻게 해야 할까요?

KEY_SET3을 LOW 로 설정하고 KEY_VAL3을 읽어서

HIGH 이면 키가 눌리지 않았고, LOW이면 키가 눌리지 않았음을 확인 할 수 있습니다.

 

SW15 를 확인하려면 KEY_SET3을 LOW 로 설정하고 KEY_VAL2 를 읽으면 알 수 있습니다.

 

SW6 를 확인하려면 KEY_SET1을 LOW 로 설정하고 KEY_VAL1 를 읽으면 알 수 있습니다.

 

 

 

 

한 줄(4개)의 스위치 값 읽기

 

스위치를 하나하나 체크하면 많은 시간이 걸립니다. 한번에 1줄 모두의 스위치 값을 읽는 방법을 알아보겠습니다.

위의 회로를 그대로 사용하며 ATMEGA128 의 PORTA 에 연결하는 예입니다.

KEY_VAL3, KEY_VAL2, KEY_VAL1, KEY_VAL0 을 각각 PORTA.3, PORTA.2, PORTA.1, PORTA.0에 연결하였습니다.

 

 

 

 

 

 

KEY_SET3을 LOW 로 하고 PINA 를 읽으면 SW13, SW14, SW15, SW16 의 상태를 알 수 있습니다.

 

 

 

    BYTE byteKEY = PINA & 0x0F;// PORTA3 ~ PORTA0 값 읽기

 

 

 

byteKEY 가 0x0F 이면 모든 키가 눌러지지 않은 상태이고 0x00 이면 모든 키가 눌러진 것입니다.

 

 

 

< byteKEY 값에 따른 스위치 누름 상태 >

byteKEY 값

SW13

SW14

SW15

SW16

0x0F

안 눌림

안 눌림

안 눌림

안 눌림

0x0E

눌림

안 눌림

안 눌림

안 눌림

0x0D

안 눌림

눌림

안 눌림

안 눌림

0x0C

눌림

눌림

안 눌림

안 눌림

0x0B

안 눌림

안 눌림

눌림

안 눌림

0x0A

눌림

안 눌림

눌림

안 눌림

0x09

안 눌림

눌림

눌림

안 눌림

0x08

눌림

눌림

눌림

안 눌림

0x07

안 눌림

안 눌림

안 눌림

눌림

0x06

눌림

안 눌림

안 눌림

눌림

0x05

안 눌림

눌림

안 눌림

눌림

0x04

눌림

눌림

안 눌림

눌림

0x03

안 눌림

안 눌림

눌림

눌림

0x02

눌림

안 눌림

눌림

눌림

0x01

안 눌림

눌림

눌림

눌림

0x00

눌림

눌림

눌림

눌림

 

 

관련 제품입니다.


 http://kit128.com/goods/view.php?seq=6




키 매트릭스(4x4)

 





'데이터시트' 카테고리의 다른 글

ATMEGA8A-AU  (0) 2012.03.07
Package information - SO16−28 [WIDE]  (0) 2011.08.28
가변저항(Potentiometer) 3362  (1) 2011.07.07
LED ON  (0) 2011.01.30
5101ASR , FND Anode  (0) 2011.01.22
Posted by WhiteAT
,