AtmelStudio7 (AVRStudio7) 프로그램 다운로딩

앞에서 AtmelStudio7을 이용하여 컴파일 하는 방법을 포스팅 하였습니다. 이제 AVR 보드에 프로그램을 다운로딩하는 방법을 알아보겠습니다.
(요즘은 보드에 프로그램 넣는 것을 ‘업로딩’이라고도 합니다.)

 

프로그래밍 설정

[Tools] => [Device Programming]를 실행합니다.

[WAT-ISP29] AVR ISP 가 연결된 포트를 선택합니다.

 

Device 를 선택합니다.

 

[Apply]를 클릭하면 더 자세한 설정창이 표시됩니다.

 

설정은 보드 환경에 맞게 해주시고, 잘 모르면 Close로 닫아도 됩니다.

 

[Start Without Debugging]으로 다운로드 후 실행을 합니다.

 

PORTB에 연결된 LED 가 약 1초 간격으로 ON/OFF 를 반복합니다.

 

아래와 같이 ‘ISP on STK500’ 상태에서 프로그래밍 다운로딩이 가능합니다.
만약 ‘Simulator’ 상태라면 클릭하여 변경할 수 있습니다.

 

이 예제는 아래의 코드를 사용하였습니다.

 

AVR ISP 자료들

AVR Studio4
AVR Studio7

 

 

AVR ISP 프로그램 케이블 제품구매

WAT-AVR ISP (10핀 플랫케이블) 는 http://kit128.com/goods/view?no=10 에서
WAT-AVR ISP (6핀 케이블) 는 http://kit128.com/goods/view?no=4 에서

WAT-ISP79 AVR ISP(표준10핀) 케이스 포함은 http://kit128.com/goods/view?no=79 에서
WAT-ISP79 AVR ISP(표준10핀) (케이스 미포함)은 http://kit128.com/goods/view?no=113 에서

[WAT-ISP29] USB AVR ISP 프로그램 케이블 (표준10핀)는 http://kit128.com/goods/view?no=29 에서 구매하실수 있습니다.

 


Posted by WhiteAT

댓글을 달아 주세요

 

준비

 

- 프로그램 설치: http://whiteat.com/260

(WinAVR, AVRStudio 가 설치되어 있어야 ATMEGA128에 프로그램을 할 수 있습니다.)

 

- 프로그램 라이팅 방법: 다운로드

(직접 작성한 프로그램을 ATMEGA128 에 라이팅 하는 방법입니다.)

 

- ATMEGA128 초급 키트 (http://kit128.com/goods/view.php?seq=57 )

 

 

 

 

 

 

LED 회전 ON/OFF

 

PORTE에 연결된 8개의 LED 가 ON/OFF 하면서 시계방향으로 회전하는 예제입니다.

이 예제는 EX_01_01과 동일합니다. (http://whiteat.com/57204 참조)

 

/*

EX_01_01.c

 

PORTE에연결된LED 순차적으로ON 하기

 

AVRStudio 4.18

2012-01-08

 

홈페이지: http://whiteat.com

MCU자료실: http://avr128.com

쇼핑몰: http://kit128.com

 

*/

 

#include <avr/io.h>

 

// 일정시간딜레이(약1초)

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()

{

    DDRE = 0xFF; // ALL OUTPUT

    PORTE = 0xFE;    // PORTE.0 LED ON

 

    while(1)

    {

        Delay();

 

        if(PORTE == 0x7F)    // 마지막LED 가ON 되었다면.

        {

            // 처음LED ON 되게

            PORTE = 0xFE;    // PORTE.0 LED ON

        }

        else                // 그렇지않다면

        {

            PORTE <<= 1;    // 한칸이동(PORTE = PORTE<<1; 와동일)

            PORTE |= 1;     // 마지막LED 는OFF (PORTE = PORTE | 0x01; 와동일)

        }

    }

}

 

 

 

 


 

 

 

 

 

 

 

 

 

LED 반복 ON/OFF

 

PORTA에 연결된 8개의 LED 를 교대로 ON/OFF 하는 예제입니다.

 

#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 = 0x55; // 0, 2, 4, 6 bit LED OFF

 

 

    while(1)

    {

        PORTA = 0x55; // 0, 2, 4, 6 bit LED OFF

         Delay();

 

        PORTA = 0xAA; // 1, 3, 5, 7 bit LED OFF

        Delay();

 

    }

}

 

 

 

 

 

 




 

ATMEGA128 로 LED 를 ON/OFF 하는 예제를 다루어 보았습니다.

 

감사합니다.

 

'AVR 예제' 카테고리의 다른 글

OUTPUT 실험, WAT-AVR128  (0) 2013.05.30
Posted by WhiteAT

댓글을 달아 주세요

WAT-AVR128_PLUS 모듈

AVR키트 2013. 4. 8. 17:21




WAT-AVR128 모듈과
확장 보드의 기능을 합친 모듈 입니다.



WAT-AVR128 보드 얼.pdf

WATAVR128_manual.pdf

AVR128 모듈을 다른 보드에 연결하여 사용할수 있는 확장 보드입니다.



PORTA,
PORTB,
PORTC,
PORTD,
PORTE,
PORTF

등의 포트를 다른 보드와 연결해서 사용할 수 있습니다.

 

 

 

 

 

 

 

 

쇼핑몰에서 구매하기

 

 

 

 

 

Posted by WhiteAT

댓글을 달아 주세요

WAT-LED

전자 키트 2013. 4. 8. 16:15
 


WAT-AVR128 모듈과 연결하여 LED ON/OFF 실험을 할수 있는 모듈입니다.

 

 

 



 

 

LED 를 타원 형태로 배치하여 LED 회전(정방향, 역방향), 이동 등의 다양한 실험을 할 수 있습니다.

 

 

 

 

/*

  EX_01_01.c

 

  PORTE에연결된LED 무한히 회전하기

 

  Main Clock : 11.0592Mhz 

 

  AVRStudio  4.18

  2012-01-08

 

  홈페이지:  http://whiteat.com

  쇼핑몰:    http://kit128.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()

{

         DDRE = 0xFF; // ALL OUTPUT

         PORTE = 0xFE;         // PORTE.0    LED ON

 

         while(1)

         {

                  Delay();

 

                  if(PORTE == 0x7F)    // 마지막LED ON 되었다면.

                  {

                           // 처음LED ON 되게

                           PORTE = 0xFE;         // PORTA.0    LED ON

                  }

                  else                               // 그렇지않다면

                  {

                           PORTE <<= 1;         // 한칸이동한후

                           PORTE |= 1;            // 마지막LED OFF 되게

                  }

         }

}

 

 


Posted by WhiteAT

댓글을 달아 주세요

 

 

 

 

AT45DB041D 데이터 플래시를 SPI 로 구동할 수 있는 모듈입니다.

MCU 의 구동에 추가적인 메모리가 필요할 때 SPI 기능을 실험할 때

적합한 모듈입니다.

WAT-AVR128 에 바로 연결하여 사용할 수 있습니다.

 

 


 






ATMEGA128 용 소스코드

 

/*

         EX_06_01.c

 

         SPI DataFlash 읽고쓰는예제입니다.

 

  SPI 를초기화한후

  데이터를쓰고읽은후

  쓰고읽은데이터가동일한지확인합니다.

 

         AVRStudio  4.18

         2013-03-08

 

 

*/ 

 

#include <stdio.h>

 

#include <avr/io.h>

#include "WAT128.h"

#include "AT45DB161D.h"

 

 

BYTE Data[256];   // w

BYTE ReadData[256];

 

 

int main()

{

  const BYTE BufferNum =AT45DB_BUFFER_1;

  const BYTE PageNum =4;

 

  DDRA = 0xFF;

  PORTA = 0xFF;

 

  // AT45DB SPI 초기화  

  SpiInit();

  SFlash_GetID();

 

  // 버퍼로한번써줘야한다.(중요)

  PageToBuffer(1,0);

 

  // Data 에임의의값

  for(int i=0;i<256;i++)

  {

    Data[i] = i;

  }

 

  // Data 값을버퍼에넣기

  SFlash_WriteBuffer(BufferNum,0,Data,256);

 

  // 버퍼값을페이지(실제저장할위치)에쓰기

  SFlash_BufferToPage(BufferNum, PageNum, 1);

 

 

  // 읽어올변수(ReadData)에임의의값쓰기

  for(int i=0;i<256;i++)

  {

    ReadData[i] = 0xff;

  }

 

  // 페이지데이터를버퍼로가져오기

  PageToBuffer(BufferNum,PageNum);

 

  // 버퍼데이터를ReadData로가져오기

  GetMemBuffer(ReadData);

 

  //

  for(int i=0;i<256;i++)

  {

    if(ReadData[i] != Data[i] )

    {

      while (1)

      {

        // 쓰고읽은데이터가다르다면

        PORTA = 0x55;

 

      }

    }

  }

 

  // 쓰고읽은데이터가동일하다면

  PORTA = 0xf0;;

  while(1)

  {    

  }

}       

 


Posted by WhiteAT

댓글을 달아 주세요

 

실험 키트

 

WAT-AVR128 모듈 알아보기

WAT-IO&ADC 모듈 알아보기

 

 

 

 

 

 

 

ATMEGA128 모듈에 연결

 

WAT-AVR128 모듈의 PORTA는 LED, PORTB는 DIP SWITCH, PORTC는 FND SELECT, PORTE는 FND DATA, PORTE는 ADC 에 연결하여 PC 프로그램에서 제어 및 상태를 실시간으로 모니터링 하는 예제입니다.

 

 

 

WAT-AVR128 모듈

WAT-IO&ADC 모듈

PORTA

FND DATA

PORTB

 

PORTC

FND SELECT, ROTARY SWITCH

PORTD

DIP SWITCH

PORTE

LED

PORTF

ADC

 

 

ATEMGA128 펌웨어 코드

  /*

    USART0 로보드의상태PC로전송

    PC에서LED, BUZZER, FND 제어

    AVRStudio 4.18

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

BYTE g_FNDData[4]={1,2,3,4};

BYTE g_BUZZER = 0;

BYTE g_LED = 0;

 

UINT16 g_adcCDS;    // CDS 값보관

UINT16 g_adcVR;    // 가변저항값보관

 

void OperDisplayFND()

{

    DisplayFND4(g_FNDData[0],g_FNDData[1],g_FNDData[2],g_FNDData[3]);

}

 

INT16 g_byteOperPCTXTimer = 0;

void OperPCTX()

{

    if(--g_byteOperPCTXTimer>0)

        return;

 

    PutChar0(0x02);                        // 0 시작신호

    PutChar0(PIND);                        // 1 DIP SWITCH

    PutChar0(GetRotaryInt());             // 2 ROTARY

    PutChar0(g_adcCDS>>8);                // 3 CDS 상위값

    PutChar0(g_adcCDS);                // 4 CDS 하위값

    PutChar0((g_adcVR)>>8 &0xFF); // 5 가변저항상위값

    PutChar0(g_adcVR&0xFF);                // 6 가변저항하위값

    PutChar0(0x03); // 7

    PutChar0(0xCC);                        // 8 체크섬

    PutChar0(0x03);                        // 9 끝신호

 

    g_byteOperPCTXTimer = 20;

 

}

 

// 가변저항, CDS 값을ADC로읽기

void OperReadADC()

{

    INT16 uiTemp; // 임시변수

 

    g_adcCDS = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x00;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcCDS += ADCL + (ADCH*256);

    }

 

    g_adcCDS>>=4;

 

    g_adcVR = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x01;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcVR += ADCL + (ADCH*256);

    }

 

    g_adcVR>>=4;

}

 

int main()

{

 

    BUZZER_INIT; // BUZZER 초기화

    OpenSCI0(115200);    // USART 0 열기 

    InitFND4(); // FND 초기화 

    InitADC();    // ADC 초기화

 

    DisplayFND4(3,4,5,6);

    InitRotary();

    

    DDRD = 0x00; // 딥스위치를입력으로설정

    DDRE = 0xFE; // LED

 

 

    while(1)

    {

        BUZZER_OFF;

        OperDisplayFND();

        OperReadADC();

        

        OperPCTX();

 

        if(0x02 ==GetByte0())

        {

            UINT16 uiData = 0;

            uiData = GetByte0(); //1

            uiData<<=8;

            uiData += GetByte0(); //2

 

            //buzzer

            g_BUZZER = GetByte0();

 

                

            g_LED =    GetByte0(); //4

            GetByte0(); //5

            GetByte0(); //6

            GetByte0(); //7

            if(0xCC == GetByte0() && 0x03 == GetByte0() )

            {

                if( g_BUZZER)

                {

                    BUZZER_ON;

                    DelayMS(2);

                }

 

                // PC에서받은LED 값을출력

                PORTE =~((g_LED)&0xFC);

 

                // FND 표시

                g_FNDData[0]=((uiData/1000)%10);

                g_FNDData[1]=((uiData/100)%10);

                g_FNDData[2]=((uiData/10)%10);

                g_FNDData[3]=(uiData%10);

            }

        }    

    }

} 

 

윈도우 코드(통신 처리 부분)

try

{

        // 이번에 수신된 데이터 m_byteArray(QUEUE) 에 넣기

        for( int i=1; i<=nRcvSize; i++ )

        {

            m_byteArray.Add(m_CommPort.m_byRcvBuf[i]);

        }

        

        // 시작 신호 체크

        while(m_byteArray.GetSize()>0)

        {

            if(m_byteArray.GetAt(0) != 0x02)

            {

                m_byteArray.RemoveAt(0);

                continue;

            }

            else

            {

                break;

            }

        }

        

        CString strData;

        CString strTemp;

        if(m_byteArray.GetSize()>=10)

        {

            if(m_byteArray.GetAt(0) == 0x02 && m_byteArray.GetAt(9) == 0x03)

            {

                // DIP SWITCH 체크

                byteTemp = m_byteArray.GetAt(1);

                

                UpdateData(TRUE);

                m_bDIP8 = ((byteTemp & 0x80)!=0x80);

                m_bDIP7 = ((byteTemp & 0x40)!=0x40);

                m_bDIP6 = ((byteTemp & 0x20)!=0x20);

                m_bDIP5 = ((byteTemp & 0x10)!=0x10);

                m_bDIP4 = ((byteTemp & 0x08)!=0x08);

                m_bDIP3 = ((byteTemp & 0x04)!=0x04);

                m_bDIP2 = ((byteTemp & 0x02)!=0x02);

                m_bDIP1 = ((byteTemp & 0x01)!=0x01);

                

                // 로터리 스위치 값 읽기

                m_strRotary.Format("%d",m_byteArray.GetAt(2));

                

                // CDS 값 읽기

                uiTemp = m_byteArray.GetAt(3);

                uiTemp <<=8;

                uiTemp += m_byteArray.GetAt(4);

                m_prgCDS.SetPos(1023 - uiTemp);

                

                // 가변저항 값 읽기

                uiTemp = m_byteArray.GetAt(5);

                uiTemp <<=8;

                uiTemp += m_byteArray.GetAt(6);

                m_prgVR.SetPos(1023 - uiTemp);

                

                // 화면 갱신

                UpdateData(FALSE);                

            }

            

            // 마지막에 처리한 데이터 보기

            for(int i=0;i<10;i++)

            {

                strTemp.Format( "%02X ", m_byteArray.GetAt(i) );

                strData+=strTemp+ " ";

            }

            strData+= "\n";

            

            m_byteArray.RemoveAt(0,10);            

        }        

        

        m_ReceiveData = strData;        

        UpdateData(FALSE);

        

}

catch (CException* )

{

        

}

 

 

윈도우 프로그램에서 FND에 5634, LED 모두 OFF 값을 전송하며 ATMEGA128 보드에서 딥 스위치4번 OFF, CDS값 최대, 가변저항 값 최소, 로터리 스위치 값 3을 전송되면 아래와 같이 됩니다.

< WAT-IO&ADC에 연결한 윈도우 프로그램 >

윈도우 프로그램에서 FND에 5667, LED 3,5,7번 ON 값을 전송하며 ATMEGA128 보드에서 딥 스위치1,3,5,7,번 ON, CDS값 최대, 가변저항 값 최대, 로터리 스위치 값 9을 전송되면 아래와 같이 됩니다.


 

 

다운로드



매뉴얼: pdf.gif WAT-IO_ADC매뉴얼.pdf

펌웨어EX_09_03.zip

윈도우 프로그램(MFC 6.0):실행파일.EXE

윈도우 프로그램(C# 2008): 실행파일.EXE
(
실행파일의 소스코드는 제품과 함께 제공됩니다.)

 


출처: http://whiteat.com/60193


Posted by WhiteAT

댓글을 달아 주세요

 

다운로드

매뉴얼: WAT-IO_ADC매뉴얼.pdf  

펌웨어 소스코드: EX_09_03.zip

   

 

 

 

 

제품 소개

   

WAT-IO&ADC 모듈은 AVR, Cortex-M3, PIC 등의 MCU와 10P Flat 케이블을 연결하여 Input/Output을 실험할 수 있는 모듈입니다. FND, LED, BUZZER 을 제어할 수 있으며 가변저항, CDS(빛의 밝기), 딥 스위치, 로터리 스위치의 값을 읽을 수 있는 제품입니다.

 

 

특징

 

항목

내용

FND

4 digit

LED

8 port

BUZZER

1 port (5V)

가변저항

5K

CDS

CDS

딥 스위치

8 channel

로터리 스위치

10R

크기

85 mm x 85 mm

인터페이스

Digital Input/Output

 

 

구조

    

   

 

 

외형

 

 

 

 

 

 

 

 

회로도

 

 

 

외부 인터페이스

 

 

커넥터

 

 

 

 

번호

핀명

설명

1

D0

DATA (bit 0)

2

D1

DATA (bit 1)

3

D2

DATA (bit 2)

4

D3

DATA (bit 3)

5

D4

DATA (bit 4)

6

D5

DATA (bit 5)

7

D6

DATA (bit 6)

8

D7

DATA (bit 7)

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< FND DATA >

 

번호

핀명

설명

1

RO0

로터리 스위치 핀 0

2

RO1

로터리 스위치 핀 1

3

RO2

로터리 스위치 핀 2

4

RO3

로터리 스위치 핀 3

5

FND0

FND 0 선택 핀

6

FND1

FND 1 선택 핀

7

FND2

FND 2 선택 핀

8

FND3

FND 3 선택 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< FND SELECT, ROTARY SWITCH >

 

번호

핀명

설명

1

LED0

LED 0 제어 핀

2

LED1

LED 1 제어 핀

3

LED2

LED 2 제어 핀

4

LED3

LED 3 제어 핀

5

LED4

LED 4 제어 핀

6

LED5

LED 5 제어 핀

7

LED6

LED 6 제어 핀

8

LED7

LED 7 제어 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< LED >

 

 

 

번호

핀명

설명

1

AVCC

ADC 컨버터용 전압

2

AREF

ADC 컨버터용 기준 전압

3

CDS

CDS 센서 연결 핀

4

VR

가변저항 연결 핀

5

   

6

   

7

   

8

BUZ

부저 연결 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< ADC >

 

번호

핀명

설명

1

DIP0

딥스위치 1번 핀

2

DIP1

딥스위치 2번 핀

3

DIP2

딥스위치 3번 핀

4

DIP3

딥스위치 4번 핀

5

DIP4

딥스위치 5번 핀

6

DIP5

딥스위치 6번 핀

7

DIP6

딥스위치 7번 핀

8

DIP7

딥스위치 8번 핀

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< DIP SWITCH >

 

 

ATMEGA128 모듈에 연결

 

WAT-AVR128 모듈의 PORTA는 LED, PORTB는 DIP SWITCH, PORTC는 FND SELECT, PORTE는 FND DATA, PORTE는 ADC 에 연결하여 PC 프로그램에서 제어 및 상태를 실시간으로 모니터링 하는 예제입니다.

 

 

 

WAT-AVR128 모듈

WAT-IO&ADC 모듈

PORTA

FND DATA

PORTB

 

PORTC

FND SELECT, ROTARY SWITCH

PORTD

DIP SWITCH

PORTE

LED

PORTF

ADC

 

 

ATEMGA128 펌웨어 코드

  /*

    EX_09_03.c

 

    USART0 로보드의상태PC로전송

    PC에서LED, BUZZER, FND 제어

    AVRStudio 4.18

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

BYTE g_FNDData[4]={1,2,3,4};

BYTE g_BUZZER = 0;

BYTE g_LED = 0;

 

UINT16 g_adcCDS;    // CDS 값보관

UINT16 g_adcVR;    // 가변저항값보관

 

void OperDisplayFND()

{

    DisplayFND4(g_FNDData[0],g_FNDData[1],g_FNDData[2],g_FNDData[3]);

}

 

INT16 g_byteOperPCTXTimer = 0;

void OperPCTX()

{

    if(--g_byteOperPCTXTimer>0)

        return;

 

    PutChar0(0x02);                        // 0 시작신호

    PutChar0(PIND);                        // 1 DIP SWITCH

    PutChar0(GetRotaryInt());             // 2 ROTARY

    PutChar0(g_adcCDS>>8);                // 3 CDS 상위값

    PutChar0(g_adcCDS);                // 4 CDS 하위값

    PutChar0((g_adcVR)>>8 &0xFF); // 5 가변저항상위값

    PutChar0(g_adcVR&0xFF);                // 6 가변저항하위값

    PutChar0(0x03); // 7

    PutChar0(0xCC);                        // 8 체크섬

    PutChar0(0x03);                        // 9 끝신호

 

    g_byteOperPCTXTimer = 20;

 

}

 

// 가변저항, CDS 값을ADC로읽기

void OperReadADC()

{

    INT16 uiTemp; // 임시변수

 

    g_adcCDS = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x00;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcCDS += ADCL + (ADCH*256);

    }

 

    g_adcCDS>>=4;

 

    g_adcVR = 0;

    // 노이즈를생각해서값을번읽어평균을낸다.

 

    for(uiTemp = 0; uiTemp<16;uiTemp++)

    {

        ADMUX=0x40 | 0x01;

        ADCSRA = 0xD7;

        while((ADCSRA & 0x10) != 0X10);

        g_adcVR += ADCL + (ADCH*256);

    }

 

    g_adcVR>>=4;

}

 

int main()

{

 

    BUZZER_INIT; // BUZZER 초기화

    OpenSCI0(115200);    // USART 0 열기

 

    InitFND4(); // FND 초기화

 

    InitADC();    // ADC 초기화

 

    DisplayFND4(3,4,5,6);

    InitRotary();

    

    DDRD = 0x00; // 딥스위치를입력으로설정

    DDRE = 0xFE; // LED

 

 

    while(1)

    {

        BUZZER_OFF;

        OperDisplayFND();

        OperReadADC();

        

        OperPCTX();

 

        if(0x02 ==GetByte0())

        {

            UINT16 uiData = 0;

            uiData = GetByte0(); //1

            uiData<<=8;

            uiData += GetByte0(); //2

 

            //buzzer

            g_BUZZER = GetByte0();

 

                

            g_LED =    GetByte0(); //4

            GetByte0(); //5

            GetByte0(); //6

            GetByte0(); //7

            if(0xCC == GetByte0() && 0x03 == GetByte0() )

            {

                if( g_BUZZER)

                {

                    BUZZER_ON;

                    DelayMS(2);

                }

 

                // PC에서받은LED 값을출력

                PORTE =~((g_LED)&0xFC);

 

                // FND 표시

                g_FNDData[0]=((uiData/1000)%10);

                g_FNDData[1]=((uiData/100)%10);

                g_FNDData[2]=((uiData/10)%10);

                g_FNDData[3]=(uiData%10);

            }

        }    

    }

} 

 

윈도우 코드(통신 처리 부분)

private void tmrRxData_Tick(object sender, EventArgs e)

{

btnRxSignal.BackColor = Color.White;

 

 

if (null == m_serialPort) return;

if (!m_serialPort.IsOpen) return;

 

int iRecSize = m_serialPort.BytesToRead; // 수신된 데이터 갯수

 

 

// AVR에서 10바이트식 보내는데 10바이트 이상이 들어 왔는지 체크

if (iRecSize >= 10)

{

byte[] buff = new byte[iRecSize]; // 임시 변수

 

// 시리얼 포트에서 데이터를 가져오자.

m_serialPort.Read(buff, 0, iRecSize);

 

// 맨앞의 값이 0x02 인지 체크

if (buff[0] !=0x02 )

{

for(int i=0;i<iRecSize-1;i++)

{

buff[i] = buff[i+1];

}

}

 

 

if (buff[0] == 0x02 && buff[8] == 0xCC && buff[9] == 0x03)

{

this.txbRotaryValue.Text = buff[2].ToString();

 

this.btnDIP1.BackColor = ((buff[1] & 0x01) == 0x01) ? Color.White : Color.Green;

this.btnDIP2.BackColor = ((buff[1] & 0x02) == 0x02) ? Color.White : Color.Green;

this.btnDIP3.BackColor = ((buff[1] & 0x04) == 0x04) ? Color.White : Color.Green;

this.btnDIP4.BackColor = ((buff[1] & 0x08) == 0x08) ? Color.White : Color.Green;

this.btnDIP5.BackColor = ((buff[1] & 0x10) == 0x10) ? Color.White : Color.Green;

this.btnDIP6.BackColor = ((buff[1] & 0x20) == 0x20) ? Color.White : Color.Green;

this.btnDIP7.BackColor = ((buff[1] & 0x40) == 0x40) ? Color.White : Color.Green;

this.btnDIP8.BackColor = ((buff[1] & 0x80) == 0x80) ? Color.White : Color.Green;

 

 

this.trbCDS.Value = (Convert.ToInt32(buff[3]) << 8) + (Convert.ToInt32(buff[4]) << 0);

this.trbCDS.BackColor = Color.FromArgb((1024-this.trbCDS.Value) / 4, (1024-this.trbCDS.Value) / 4, (1024-this.trbCDS.Value) / 4);

this.trbVR.Value = (Convert.ToInt32(buff[5]) << 8) + (Convert.ToInt32(buff[6]) << 0);

 

 

 

btnRxSignal.BackColor = Color.Green;

}

}

 

// AVR 모드로 명령 전송

this.SendToBoard();

 

}

 

 

윈도우 프로그램에서 FND에 5634, LED 모두 OFF 값을 전송하며 ATMEGA128 보드에서 딥 스위치4번 OFF, CDS값 최대, 가변저항 값 최소, 로터리 스위치 값 3을 전송되면 아래와 같이 됩니다.

< WAT-IO&ADC에 연결한 윈도우 프로그램 >

윈도우 프로그램에서 FND에 5667, LED 3,5,7번 ON 값을 전송하며 ATMEGA128 보드에서 딥 스위치1,3,5,7,번 ON, CDS값 최대, 가변저항 값 최대, 로터리 스위치 값 9을 전송되면 아래와 같이 됩니다.


원문: http://whiteat.com/57035


 

Posted by WhiteAT

댓글을 달아 주세요

 


WAT-CURRENT 매뉴얼: 다운로드



제품 소개

 

 



WAT-CURRENT (V1) 모듈은 0 ~ 700mA 사이의 전류를 제어할 수 있는 모듈입니다. 주로 파워 LED 제어에 사용되며 MCU와 연결하여 밝기를 조절할 수 있습니다.

 

본 제품은 PWM없이 전원만으로 일정하게 전류를 출력하는 독립형과 PWM으로 실시간으로 전류출력량을 변경할 수 있는 PWM 형으로 나눠집니다. 사용하는데 약간의 차이가 있으므로 사용방법을 숙지한 후 사용하시기 바랍니다.

 

 

항목

내용

독립형

출력 전류

100 ~ 700mA

최대 입력전압

12V

PWM형

출력 전류

0 ~ 700mA

최대 입력전압

35V

크기

30 mm x 34 mm

 

 

 

 

구조

 

 

 

 

 

 

 

 

크기

 

 

    

 

 

 

 

인터페이스

 

 

 

  1. 커넥터




 

번호

핀명

설명

1

POWER

LED 전원

2

VCC

VCC (5~12V)

3

PWM

전류 출력 조절

4

GND

그라운드

< INPUT >

 

 

 

번호

핀명

설명

1

OUT+

전류 출력 +

2

OUT-

전류 출력-

< OUTPUT >

 

 

 

 

  1. 최대 출력전류 설정

 

 

가변저항으로 최대 출력전류를 설정할 수 있습니다. 가변저항을 반 시계방향으로 돌리면 최대 출력 전류는 100mA가 되고, 시계방향으로 돌리면 최대 출력 전류는 700mA가 됩니다.

 

최대 출력 전류는 100mA

최대 출력 전류는 700mA

< 최대 출력전류는 PWM값이 100% 일 때의 전류 크기입니다. >

 

 

 

 

  1. PWM으로 출력전류 제어(PWM용에만 해당)

 

출력 전류를 실시간으로 미세하게 조정하려면 PWM으로 제어해야 합니다.
출력 전류 값은 아래와 같이 계산 할 수 있습니다.

출력 전류 = 최대 출력전류 X PWM 듀티비


최대 출력전류를 400mA로 설정했을 때를 예로 든다면
0% PWM 입력시, 0A가 출력되고, (0mA = 400mA x 0)
30% PWM 입력시, 출력 전류는 120mA가 되고, (120mA = 400mA x 0.3)
90% PWM 입력시, 출력 전류는 360mA가 되고. (360mA = 400mA x 0.9)

100% PWM 입력시 출력 전류는 360mA가 됩니다. (400mA = 400mA x 1.0)

 

 

 

 

파워 LED 제어

 

  1. 독립형

 

PWM을 사용하지 않고 전원(5~12V)만으로 파워 LED를 켤 수 있습니다. 단 PWM을 사용하지 않는 경우라면 실시간으로 밝기 조절을 할 수 없습니다.

 

 

전원(5~12V)로 파워LED을 켜려면 입력 4개의 핀을 아래와 같이 연결합니다.

절대로 입력 전압이 12V를 넘어서는 안됩니다.

 

번호

핀명

설명

1

POWER

LED 전원 (전원의 +극)

2

VCC

VCC (전원의 +극)

3

PWM

사용안함

4

GND

그라운드 (전원의 –극)

  1. PWM형

 

ATEMGA128의 PWM 듀티비를 변경하여 파워 LED를 정밀하게 제어할 수 있습니다. ATMEGA128와 정 전류 모듈 입력을 아래와 같이 연결합니다. 이때 ATMEGA128 에서 사용하는 전압 5V를 LED 전압으로 사용하게 됩니다.

 

번호

핀명

설명

1

POWER

ATMEGA128 의 5V에 연결

2

VCC

사용 안함

3

PWM

PIN15 – PB5/OC1A 에 연결

4

GND

ATMEGA128 그라운드에 연결

 

 

최대 출력전압을 100mA로 하고 듀티(duty)를 변경하면 LED 밝기의 변화를 확인 할 수 있습니다. 가변저항을 반 시계방향으로 끝까지 돌리면 최대출력전압이 100mA로 됩니다.

< 듀티비 10% (약 10mA)일 때의 밝기 >

 

< 듀티비 40% (약 40mA)일 때의 밝기 >

 

< 듀티비 100% (약 100mA)일 때의 밝기 >

 

 








 

아래는 ATMEGA128에 연결하여 파워LED 밝기를 조절하는 예제입니다.

 

/*

    PB5 핀(ATMEGA128의15번핀)으로 PWM을 출력하여

    WAT-CURRENT 모듈에연결된파워LED 밝기를 조절하는예제입니다.

 

    듀티비가0~100%, 100~0%로계속변경되어

    LED 가밝아졌다가흐려졌다를반복하는예입니다.

    

    AVRStudio 4.18

 

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

 

unsigned int iDuty = 0;

BOOL bIncrease = TRUE;

 

int main()

{

 

    DDRB = 0xFF;

 

    TCCR1A = 0x82;

    TCCR1B = 0x13;

    TCCR1C = 0x00;

    ICR1 = 1000;

 

 

    while(1)

    {

         OCR1A = iDuty;

 

        if(bIncrease)

            iDuty++;

        else

            iDuty--;

 

        if(iDuty>= ICR1)

        {

            bIncrease = 0;

        }

        if(iDuty== 0)

        {

            bIncrease = 1;

        }        

        

        DelayMS(1);

 

    }

}

    

 

 

Posted by WhiteAT

댓글을 달아 주세요

 

 

16x2 라인의 캐릭터 LCD 를 제어해 보겠습니다.

 

 

< ATMEGA128 과 캐릭터 LCD 연결 회로도 일부 >

 

 

 

 

 

 

 

LCD 의 데이터 선은 ATMEGA128의 PORTB 에 연결하고, 컨트롤 선은 PORTC를 사용합니다.

VR1의 5K 가변 저항은 캐릭터 LCD의 백라이트 밝기를 조절할 수 있습니다.

 

 

캐릭터 LCD 우측 그림처럼 출력하는 예제입니다.

abcdefghijklmnop

0123456789ABCDEF

 

 

 

 

 

 

 

 

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

 

 

 

 

주요 코드

 

main.c 일부

/*

    EX_02_01.c

 

    필요한보드

    1. WAT-AVR128 (모듈)

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

    3. WAT-CLCD (캐릭터그래픽LCD)

 

    Character LCD에영문/숫자출력

    AVRStudio 4.18

    2011-10-04

 

    홈페이지: http://whiteat.com

    MCU자료실: http://avr128.com

    쇼핑몰: http://kit128.com

 

*/

 

#include <avr/io.h>

#include "WAT128.h"

 

int main()

{

 

    CLCD_Init();        // LCD 초기화

 

    CLCD_PutChar('a');

    CLCD_PutString(1,0,"bcdefghijklmnop");

    CLCD_PutString(0,1,"0123456789ABCDEF");

 

    while(1)

    {

    }

}

 

 

 

 

 

 

 

전체 소스 ( AVRStudio용)

EX_02_01.ZIP

 

 

Posted by WhiteAT

댓글을 달아 주세요

 

WAT-CLCD 매뉴얼:  WAT-CLCD.pdf    


 

제품 소개

 

WAT-CLCD 모듈은 16 x 2 배열 캐릭터 LCD 를 장착한 모듈로 AVR, ARM7, PIC, 8051 등의 MCU 와 10P Flat 케이블을 연결하여 영문, 한글, 도형, 그림 등을 출력할 수 있는 제품입니다

 

 

 

 

 

 

항목

내용

출력 문자수

16 x 2

보드 크기

85 mm x 85 mm

백라이트 밝기

가변저항으로 조절 가능

인터페이스

Digital Input/Output

푸쉬 스위치

5EA 제공

 

 

 

    

 

외형

 

 

 

 

 

 

회로도

 

 

 

 

 

 

외부 인터페이스

 

 



 

 

 

번호

핀명

설명

1

D0

DATA (bit 0)

2

D1

DATA (bit 1)

3

D2

DATA (bit 2)

4

D3

DATA (bit 3)

5

D4

DATA (bit 4)

6

D5

DATA (bit 5)

7

D6

DATA (bit 6)

8

D7

DATA (bit 7)

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< DATA PORT >

 

 

 

번호

핀명

설명

1

/CS1

스위치1

2

/CS2

Data/Instruction

3

/RST

스위치2

4

RW

GLCD Read/Write

5

RS

스위치3

6

E

Enable

7

SW2

스위치4

8

SW1

스위치5

9

VCC

전원 ( DC 5V)

10

GND

그라운드

< CONTROL PORT >

 

 

 

 

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

 


Posted by WhiteAT

댓글을 달아 주세요