.Serial 통신
시리얼은 거의 모든 PC에서 표준으로 사용되는 디바이스 통신 프로토콜입니다. 시리얼의 개념은 USB의 개념과는 다릅니다. 대부분의 컴퓨터에는 2개의 RS232 기반 시리얼 포트가 있습니다. 이포트를 활용합니다.

시리얼 통신의 개념은 간단합니다. 시리얼 포트는 정보의 바이트를 한번에 한 비트씩 순차적으로 송수신합니다. 한번에 전체 바이트를 동시에 전달하는 병렬 통신과 비교하면 시리얼 통신은 속도가 느리지만 훨씬 간단하며 장거리에도 사용할 수 있습니다. 예를 들어, 병렬 통신용 IEEE 488 스펙을 보면 기기간 케이블링은 총 20 m 미만이어야 하며, 두 개의 디바이스간은 2 m 미만이어야 합니다. 반면 시리얼 통신은 최대 1.2 Km의 통신거리를 보장합니다.

 

여기서는 Serial통신을 활용한 멀티플렝싱 데이터전송이라곤 했지만 말그대로 채팅과 데이터의 값을 헥사값으로 받아보기로 하겠습니다

.시리얼에서의 멀티플렉싱
:멀티플렉싱이란 인터럽트 + 폴링 이 합쳐진 것을 뜻하면 select문을 사용하여 인터럽트를 걸고 while문을 사용하여 무한으로 반복하면서 값을 하나하나비교하는 폴링방식으로 처리가 됩니다 소켓 통신에서의 멀티플렉싱과 차이가 있다면 서버와 클라이언트로 구성되어있는 소켓통신에 비해서는 서버의 개념이 없고 연결요청 허락등(accept bind connect)의 기타 부수적인 단계들이 없기 때문에 비교적 간단합니다

.Port간 통신 개념
: 포트통신은 소켓통신에 비해서는 간단합니다 한쪽포트에서 키보드를 입력하면 블록이 해제되면서 메세지를 써서 보내고 다른 포트에서는 들어오는 메세지를 감지하여 블록이 해제되고 메세지를 읽어 드립니다 

즉 메세지입력 -> 블록해제 -> 메세지전송 ====================> 메세지감지 -> 블록해제 -> 메세지출력
의 과정을 거치면 반대경우도 마찬가지입니다



.Virtual Serial Port Driver 6.0
: 앞에서 언급한것과 같이 시리얼 통신을 하기 위해서는 물리적인 포트가 2개 즉 컴퓨터가 2대가 필요합니다 하지만 컴퓨터 1대로도 테스트를 할수 있는데 Eltima에서 나온 Virtual Serial Port Driver 6.0라는 소프트웨어를 사용하면 1대의 컴퓨터 내부에 가상으로 포트를 만들어 줍니다

사용방법은 간단합니다 first second에 원하는 포트값을 넣고 오른편의 Add pair를 누르기만 하면됩니다


.Serial TEST
:하나의 소스 파일을 가지고 각각 포트가 다르도록 설정하여 줍니다

port.c
#define
 COMPORT "/dev/ttyS0"

port2.c
#define
 COMPORT "/dev/ttyS1"


그리고 실행!!

결과보기>> 문자가 전송되는 것을 확인 할 수 있습니다
 
 

하지만 약간의 문제가 발생하는 중간에 메세지가 끊어지는 것을 알수 있습니다


.문제점처리>>canonical
canonical이란 한줄단위로 eof가 올때까지 보내는 방식입니다 noncanonical이라 기타 다른 방법으로 통신을 하게되면 중간게 메세지가 끊어지는것을 확인 할 수 있습니다

소스보기>>

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<termios.h>
#include<sys/types.h>
#include<sys/time.h>
#include<sys/signal.h>

#define SPEED B19200
#define COMPORT "/dev/ttyS1"

int iRet;
char cBuff[255];
volatile int iBreak = 0;

void Handle_Serial_Sig(int Arg);

void Input_Incomming(int iPort);
void output(int iPort);

int main()
{
  
  int iMaxFD = 0;
  int iCom = 0;
   
  struct sigaction stSigAct;
  struct termios stOldSt2;
  struct termios stNewSt2;
  fd_set stRFd;
  
  iCom = open(COMPORT,O_RDWR|O_NOCTTY);
  if(0>iCom)
  {
    perror(COMPORT);  
    exit(-100);
  }

  bzero(&stSigAct,sizeof(stSigAct));
  stSigAct.sa_handler = Handle_Serial_Sig;
  sigaction(SIGINT,&stSigAct,NULL);
    
  tcgetattr(iCom,&stOldSt2);
  
  bzero(&stNewSt2,sizeof(stNewSt2));

  stNewSt2.c_cflag = SPEED|CRTSCTS|CS8|CLOCAL|CREAD;

  stNewSt2.c_iflag = IGNPAR|ICRNL;
  stNewSt2.c_oflag = 0;
  stNewSt2.c_cc[VMIN] = 1;
  
  stNewSt2.c_lflag = ICANON;
  tcflush(iCom,TCIFLUSH);
  tcsetattr(iCom,TCSANOW,&stNewSt2);
  
  iMaxFD = iCom+1;
  
  while(1)
  {
    FD_ZERO(&stRFd);
    FD_SET(iCom,&stRFd);
    FD_SET(0,&stRFd);
        
    select(iMaxFD,&stRFd,NULL,NULL,NULL);
    
    if(1 == iBreak)
    {      
      break;
    }
    
    if(FD_ISSET(iCom,&stRFd))
    {
      Input_Incomming(iCom);
    }

    if(FD_ISSET(0,&stRFd))
    {
      output(iCom);
    }

    
  }

  tcsetattr(iCom,TCSANOW,&stOldSt2);
  close(iCom);
    
  return 0;
}
void Input_Incomming(int iPort)
{
  int iCnt;
  iRet = read(iPort,cBuff,sizeof(cBuff));
  
  cBuff[iRet] = 0;
  printf("[port]:%s",cBuff);
}


void output(int iPort)
{
  iRet = read(0,cBuff,sizeof(cBuff));
  write(iPort,cBuff,iRet);
}

void Handle_Serial_Sig(int Arg)
{
  printf("Receive SIGIO\n");
  iBreak = 1;
}



'Hardware > Serial 통신' 카테고리의 다른 글

Serial통신을 활용한 멀티플렉싱 데이터전송  (0) 2011.10.27
00. Serial 통신(작성중)  (0) 2011.10.17
Posted by mantwo

Serial 통신이란?
:

'Hardware > Serial 통신' 카테고리의 다른 글

Serial통신을 활용한 멀티플렉싱 데이터전송  (0) 2011.10.27
00. Serial 통신(작성중)  (0) 2011.10.17
Posted by mantwo



예제>> 차례대로 위에서 아래로 불이 들어오고 다시 아래에서 위로 불이 들어오는 프로그램을 작성하고 테스트 하세요!!

#define PIOA_PER            (*(volatile unsigned int *)0xFFFFF400)

#define PIOA_OER            (*(volatile unsigned int *)0xFFFFF410)

#define PIOA_PPUDR        (*(volatile unsigned int *)0xFFFFF460)

#define PIOA_CODR         (*(volatile unsigned int *)0xFFFFF434)

#define PIOA_SODR         (*(volatile unsigned int *)0xFFFFF430)

 

int N = 0x00000001;

 

void LED_INIT(void)

{

             PIOA_OER           = N;

             PIOA_PER           = N;

             PIOA_PPUDR       = N;

}

int main(void)

{

             volatile unsigned int iCount = 0;

            

             for(;N <= 128;N *= 2)

             {

                           if(N == 128)

                           {

            

                                        for(;N >= 1;N /= 2)

                                        {

                                                     LED_INIT();

 

                                                     PIOA_CODR = N;

                                                     for(iCount=0;1000000 >= iCount; ++iCount);

 

                                                     PIOA_SODR = N;

                                                     for(iCount=0;1000000 >= iCount; ++iCount);

                                        }

 

                           }

                           LED_INIT();

 

                           PIOA_CODR = N;

                           for(iCount=0;1000000 >= iCount; ++iCount);

 

                           PIOA_SODR = N;

                           for(iCount=0;1000000 >= iCount; ++iCount);

             }

             return 0;

}


Posted by mantwo


ARM 칩의 하나인 AT91SAM7S256을 시작합니다

1. 먼저 DATASHEET SPEC을 준비하겠습니다


atmel사의 홈페이지를 방문합니다 www2.atmel.com


product에서 atmel arm based를 클릭합니다


SAM7S를 클릭합니다


Document에서 document type/datasheet를 선택하고

제일 페이지수가 많은 SAM7S가 SPEC입니다


클릭하여 다운로드 합니다!!


*추가로 tool에서 Install_AT91-ISP_v1.13.exe 받아서 설치하도록 합니다

2. window운영체제상에서 cygwin을 통해서 컴파일을 하기 위해서는 추가로 프로그램이 필요합니다

www.gnuarm.com 으로 가서  


상단 메뉴중 file 을 클릭하여 아래서 GCC-3.4 toolchain cygwin용을 클립합니다


컴퓨터에 저장하고 설치 합니다


설치후 make를 치고 엔터


메세지가 출력되는것으로 보아 정상적으로 설치되었습니다!!


Posted by mantwo

 

Posted by mantwo


가상 직렬 포트 생성


가상 직렬 포트 생성


통신 가능 포트 확인


통신 가능 포트 확인


통신 가능 포트 확인


가상 직렬포트 생성 방법


통신 가능 포트 확인


가상 포트 열기


포트 설정


하이퍼터미널을 통한 통신


단방향 직렬통신 프로그램 실행
Posted by mantwo


EEPROM


1. EECR(Control Register)



2. EEAR(Address Register)


3. EEDR(Data Register)



4. 한바이트 쓰기/읽기 절차


5. EEPROM관련 함수



예제>>1번 키 누르면 EEPROM에 데이터 기록, 8번 키 누르면 clear하는 프로그램

먼저 헤더파일을 만들었습니다
spec p362~363 register summary 와 p21 EEPROM을 참고하였습니다

<128io.h>

#define KEY_IN PINC
#define LED_DDR DDRE
#define LED_OUT PORTE
 
#define DDRE *((volatile unsigned char*)0x22)
#define PORTE *((volatile unsigned char*)0x23)
#define PINC *((volatile unsigned char*)0x33)
#define DDRC *((volatile unsigned char*)0x34)

#define TCCR0 *((volatile unsigned char*)0x53)
#define TCNT0 *((volatile unsigned char*)0x52)
//#define OCR0 *((volatile unsigned char*)0x51)
#define TIMSK *((volatile unsigned char*)0x57)
#define SREG *((volatile unsigned char*)0x5F)

#define EECR *((volatile unsigned char*)0x3C)
#define EEAR *((volatile unsigned int*)0x3E)
#define EEDR *((volatile unsigned char*)0x3D)
#define EEMWE 2
#define EEWE 1
#define EERE 0

#define I 7

#include<128io.h>

#define CPU_CLOCK  16000000
#define TICKS_PER_SEC  1000
#define PRESCALER  64

volatile unsigned int g_elapsed_time;
 
void initFND(void);
void initTC0(void);
void setTCCR0(void);
void initTCNT0(void);
void setTIMSK(void);
 
void eeprom_write(unsigned int uiAddress, unsigned char ucData);
unsigned char eeprom_read(unsigned int uiAddress);
void sleep(unsigned int elapsed_time);
void __vector_16(void) __attribute__ ((signal, used, externally_visible));
 
int main(void)
{
 unsigned char ch = 0;
 initFND();
 initTC0();
 setTCCR0();
 initTCNT0();
 setTIMSK();
 SREG = SREG | (1<<I);

 for(unsigned int i=0; ;i++)
 {
  ch = KEY_IN;
  if(ch == 0b11111110)
  {
   ch = 0;
   for(unsigned int i=0 ; i<10 ; i++)
   eeprom_write(i, ch++);
        
   ch = 9;
   for(unsigned int i=0 ; i<10 ; i++)
   eeprom_write(10+i, ch--);
   
  }
  if(ch == 0b01111111)
  {
   ch = 0;
   for(unsigned int i=0 ; i<20 ; i++)
   eeprom_write(i, ch);
  }
  ch = eeprom_read(i);
 
  FND_OUT = ch;
  if(i==19)i=0;
  sleep(200);
 } 
 return 1;
}

void initTC0(void)
 {
 DDRC = 0x00;
 }
void initFND(void)
 {
 FND_DDR = 0xFF;
 FND_OUT = 0xFF;
 }
 
void setTCCR0(void)
 {
 TCCR0 = 0x04;
 }
void initTCNT0(void)
 {
 TCNT0 = 6;
 }
 void setTIMSK(void)
 {
 TIMSK = 0x01;
 }
 void sleep(unsigned int elapsed_time)
 {
 g_elapsed_time = 0;
 while (g_elapsed_time < elapsed_time);
 }
 void __vector_16(void)
 {
 TCNT0 = 6;
 ++g_elapsed_time;
 }
void eeprom_write(unsigned int uiAddress, unsigned char ucData)
{
 while(EECR&(1<<EEWE));
 
 EEAR = uiAddress;
 EEDR = ucData;
 EECR |=(1<<EEMWE);
 EECR |=(1<<EEWE);
 
 return ;
}
unsigned char eeprom_read(unsigned int uiAddress)
{
 while(EECR&(1<<EEWE));
 
 EEAR = uiAddress;
 EECR |=(1<<EERE);
 
 return EEDR;
}

vector_16>>
spec p60 참고
signal 의 경우 assembly어를 직접가져와서 사용하였습니다
signal =  void __vector_16

실습문제>>
1. LED와 연결된 스위치를 누르면 불이 들어온다
2. 한번 들어온 불은 꺼지않고 유지된다
3. 모든 불이 켜지면 전부 off
4. 전원을 꺼도 이전값을 저장하고 있다

#include<128io.h>
#define CPU_CLOCK  16000000
#define TICKS_PER_SEC 1000
#define PRESCALER  64

volatile unsigned int g_elapsed_time;
 
void initLED(void);
void initTC0(void);
void setTCCR0(void);
void initTCNT0(void);
void setTIMSK(void);
 
void eeprom_write(unsigned int uiAddress, unsigned char ucData);
unsigned char eeprom_read(unsigned int uiAddress);
void sleep(unsigned int elapsed_time);
void __vector_16(void) __attribute__ ((signal, used, externally_visible));
 
int main(void)
{
 unsigned char ch = 0;
 initLED();
 initTC0();
 setTCCR0();
 initTCNT0();
 setTIMSK();
 SREG = SREG | (1<<I);
 
 
 LED_OUT = eeprom_read(0);

 for(;;)
 {
 ch = KEY_IN;
  if(ch != 0xFF)
  {
   LED_OUT=LED_OUT&ch;
      
   eeprom_write(0, LED_OUT);
   
  }
   else if(LED_OUT == 0x00)
  {
  LED_OUT = 0XFF; 
  }
 }
return 1;
 }
void initTC0(void)
 {
 DDRC = 0x00;
 }
void initLED(void)
 {
 LED_DDR = 0xFF;
 LED_OUT = 0xFF;
 }
 
void setTCCR0(void)
 {
 TCCR0 = 0x04;
 }
void initTCNT0(void)
 {
 TCNT0 = 6;
 }
 void setTIMSK(void)
 {
 TIMSK = 0x01;
 }
 void sleep(unsigned int elapsed_time)
 {
  g_elapsed_time = 0;
 while (g_elapsed_time < elapsed_time);
 }
 void __vector_16(void)
 {
 TCNT0 = 6;
 ++g_elapsed_time;
 }
void eeprom_write(unsigned int uiAddress, unsigned char ucData)
{
 while(EECR&(1<<EEWE));
 
 EEAR = uiAddress;
 EEDR = ucData;
 EECR |=(1<<EEMWE);
 EECR |=(1<<EEWE);
 
 return ;
}
unsigned char eeprom_read(unsigned int uiAddress)
{
 while(EECR&(1<<EEWE));
 
 EEAR = uiAddress;
 EECR |=(1<<EERE);
 
 return EEDR;
}

결과>>
1) EEPROM의 주소값 1개만 사용하여 저장하고 출력하였습니다
2) for문에 들어가기전에 이전의 값을 먼저 출력하게 하였습니다(전원 off해도 값을 저장)
3) &연산자를 사용하여 LED값을 계속 추가해주게 하였습니다
Posted by mantwo

조건>>
1. 랜덤하게 불이 켜지고 꺼지는 동작을 20회 반복한다
2. 불이 켜진 LED 아래에 스위치를 눌리면 점수 +5점 추가
3. 100점이되면 수회깜빡이며 다시 초기화
4. 5~1까지 카운터후 시작

 #include <avr/io.h>
 #include <avr/signal.h>
 #include <avr/interrupt.h>
 #include <stdlib.h>

 #define CPU_CLOCK  16000000
 #define TICKS_PER_SEC 1000
 #define PRESCALER  64
 
 volatile unsigned int g_elapsed_time;
 
 void initLED();
 void initFND();
 void setTCCR0();
 void initTCNT0();
 void setTIMSK();
 void sleep(unsigned int elapsed_time);
 void sleep2(unsigned int elapsed_time);
 SIGNAL(SIG_OVERFLOW0);
 unsigned char swit; //스위치 PINC의 값을 변수에 넣기위해 선언?
 unsigned char Ran;  //난수의 값을 저장?
 char score = 0x00;  //FND의 점수 값을 넣기위해
 char kam = 0x00;    //100점 스코어의 동작 깜빡깜빡?
 char i = 0x00;      //랜덤으로 20번 돌리기 위한 변수
 char A = 0x05;      //시작시 카운터 설정
 
 int main(void)
 {
 initLED();
 initFND();
 setTCCR0();
 initTCNT0();
 setTIMSK();
 SREG |= 1 << 7;

 while(0 < A)     //1~5까지 숫자를 출력?
 {
  PORTE = A;
  sleep (1000);
  --A;
 }
 
 PORTE = 0x00;    //FND 0으로 초기화
 
 sleep(1000);    
 
 for (i = 0; 20 > i; ++i)      //20번 실행?
 {
  
  Ran = (rand() % 8);       //1~8까지 난수생성
  Ran = ~ (0x01 << Ran);   
  PORTF = Ran;
  sleep(1000);     //불이 켜지는 시간동안 FND값을 받는 함수
  
  PORTF = 0xFF;
 sleep2(1000);
 }
 
 return 1;
 }
 void initLED(void)
 {
 DDRF = 0xFF;
 PORTF = 0XFF;
 }
   void initFND(void)
 {
 DDRE = 0xFF;
 PORTE = 0x00;
 DDRC = 0x00;
 }
   void setTCCR0(void)
 {
 TCCR0 = 1 << CS02;
 }
 void initTCNT0(void)
 {
 TCNT0 = 6;
 }
 
 void setTIMSK(void)
 {
 TIMSK = 1 << TOIE0;
 }
  void sleep(unsigned int elapsed_time)
 {
  g_elapsed_time = 0;
  unsigned char flag = 0x00;
  while (g_elapsed_time < elapsed_time)
 {
  
  if ((0xFF != PINC) && (flag == 0x00))  //버튼이 입력되면 들어간다
  { 
   flag = 0x01;      //다시 입력값을 받지 못하도록 01로 초기화 한다
   swit = PINC;      //스위치를 값을 입력해줄 swit를 선언해준다
   if (swit == Ran)
   {
    score += 0x05; //누를때마다 5점씩 증가
    
    if ((0x0A & score) == 0x0A) // 일의자리 점수
    {
     score = score + 0x06;
    }
    if (score == 0xA0)   //십의자리 점수
    {
     score = 0x00;
     PORTE = score;
     while (10 > kam)        //100점시에 깜빡이게 한다
     {
      PORTF = 0x00
      sleep2(100);
      PORTF = 0xFF;
      sleep2(100);
      kam ++;
     }
     i = 0x00;
    }
    PORTE = score;
   }
  }
  }
  }
 void sleep2(unsigned int elapsed_time)
 {
  g_elapsed_time = 0;
 while (g_elapsed_time < elapsed_time);
 }
  SIGNAL(SIG_OVERFLOW0)
 {
 TCNT0 = 6;
 ++g_elapsed_time;
 }

결과>>
잘작동됩니다 중요한 부분을 요약하자면

1) 버튼을 눌리는 시점을 sleep안에넣어야 합니다 처음에 main에 sleep에 선언을 했을때에는 정상적으로 작동을 하지 않는것을 확인하였습니다
2) PINC값을 그대로 쓰는것이 아니라 swit변수를 선언하여 값을 넣어주는것이 좋습니다
3) FND값 역시 score변수에 넣어주는것이 좋습니다
4) 변수는 모두 전역변수로 선언하여주었습니다 main에 변수를 선언할 경우 포인터를 활용하여야 합니다
5) 버튼을 누르는 순간 짧은 시간동안 여러번 반응을 하기 때문에 flag를 선언하여 한번반 입력 받도록 합ㄴ

'Hardware > ATmega128' 카테고리의 다른 글

13. PC기반 직렬 통신 기초  (0) 2011.06.10
12. EEPROM제어 와 128io.h 헤더파일 만들기  (0) 2011.05.17
11. 두더지게임(ATmega128)  (0) 2011.05.17
10. Timer/Counter 비교매치 인터럽트  (0) 2011.05.11
9. Timer/Counter 출력  (0) 2011.05.11
8. 적외선 센서 출력  (0) 2011.05.11
Posted by mantwo

CTC모드 - 비교매치 인터럽트 - 세팅하기 

1)TCNT0의 초기화를 하지 않기 때문에 삭제하고TCNT0자리에

OCR0를 넣는다

OCR0(비교매치 인터럽트)추가한다


2)initOCR0 = 250(초기값을 6으로 줄 필요가 없다)

-250까지 카운터하게되면 OCR이 비교하여 다시 0부터 카운터 한다

TCNT0와 OCR0의 값을 비교한다

-TCNT0의 값이 OCR0의 값과 같아지면 초기화된다


3)
TCCR0 = CTC모드, 프리스케일러64 = 1<<WGM01|1<<CS02;

(xxx|xxx = or연산자)

spec = 0100 0100


4)TIMSK = 0x02 = 1<<OCIE0

spec = 0000 0010


*overflow를 사용하지 않는다


5)SIGNAL(SIG_OUTPUT_COMPARE0)설정변경


SIGNAL(SIG_OUTPUT_COMPARE0)

{

        g_elapsed_time++; 

}

CTC를 활용하여 초단위로 컨트롤 가능한 Delay함수가 가능합니다

실습문제>>
난수를 발생하여 해당값을 반복적으로 LED에 하나에만 랜덤으로  ON/OFF를 각각 0.5초간 유지 하도록 하시오.

 #include <avr/io.h>

#include <avr/lib.h>             //rand()헤더 

#include <avr/signal.h>

#include <avr/interrupt.h>

        

#define DDR_FND DDRF

#define PORT_FND PORTF


#define DDR_LED DDRE

#define PORT_LED PORTE


#define CPU_CLOCK           16000000

#define TICKS_PER_SEC       1000

#define PRESCALER           64


void initLED(void);

void setTCCR0(void);

void initOCR0(void);

void setTIMSK(void);


volatile unsigned int g_elapsed_time;


void sleep(unsigned int elapsed_time);

SIGNAL(SIG_OUTPUT_COMPARE0);



int main(void)

{

        long seed;

        srand(seed);

                

        int a;

        

        initLED();

        setTCCR0();

        initOCR0();

        setTIMSK();

        sei();

        

        for(;;)

        {

                while(1)

                {

                        a = rand()%7;                // (1~7까지의 값을 랜덤하게 생성)

                        

                        PORTE = ~(1<<a);        //(비트연산을 이용하여 한곳에만 불이 들어오도록 한다)

                        sleep(500);

                        PORTE = 0xFF;            //0.5초후 LED OFF

                        sleep(500);

                }

        }       

        return 1;

}


void initLED(void)

{

        DDR_LED = 0xFF;

        PORT_LED = 0xFF;

}

void setTCCR0(void)

{

        TCCR0 = 1<<WGM01|1<<CS02;

}

void initOCR0(void)

{

        OCR0 = 250;

}

void setTIMSK(void)

{

        TIMSK = 1<<OCIE0;

}

void sleep(unsigned int elapsed_time)

{

        g_elapsed_time = 0;

        while(g_elapsed_time < elapsed_time); 

}


SIGNAL(SIG_OUTPUT_COMPARE0)

{

        g_elapsed_time++; 

}


'Hardware > ATmega128' 카테고리의 다른 글

12. EEPROM제어 와 128io.h 헤더파일 만들기  (0) 2011.05.17
11. 두더지게임(ATmega128)  (0) 2011.05.17
10. Timer/Counter 비교매치 인터럽트  (0) 2011.05.11
9. Timer/Counter 출력  (0) 2011.05.11
8. 적외선 센서 출력  (0) 2011.05.11
7. FND 출력  (0) 2011.05.03
Posted by mantwo

DK -128선 연결


사용 헤더파일 및 환경설정값


1. TCCR0(T/C Control Register)


2. TCNT0(Timer Counter Register)


3. TIMSK(Interrupt Mask Register)


4. 1초마다 깜빡이는 LED구현


5. 실습예제 1/2



5.실습예제 2/2


<타이머카운터 응용 실습문제>
1초마다 FND값을 증가시키다가 60초가 되는 순간 LED를 하나씩 ON 하시오.
FND는 0으로 초기화된 후 다시 증가합니다.
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
 
#define DDR_FND DDRF
#define PORT_FND PORTF
#define DDR_LED DDRE
#define PORT_LED PORTE

#define CPU_CLOCK  16000000
#define TICKS_PER_SEC  1000
#define PRESCALER  64
volatile unsigned int g_elapsed_time;

void initFND(void);
void initLED(void);
void setTCCR0(void);
void initTCNT0(void);
void setTIMSK(void);

void sleep(unsigned int elapsed_time);
SIGNAL(SIG_OVERFLOW0);

int main(void)
{
 int a = 0;
 int b = 0x01;
 
 initLED();
 setTCCR0();
 initTCNT0();
 setTIMSK();
 sei();
 
 for(;;)
 {
 a=0;
 while(a<=60)
 {
   PORTF = (a/ 10) * 16 + (a % 10);
   a++;
   sleep(100);
 }
 PORTE =~(b);
 b = b*2;
 
}
return 1;
}
void initLED(void)
{
 DDR_LED = 0xFF;
 PORT_LED = 0xFF;
}
void initFND(void)
{
 DDR_FND = 0xFF;
 PORT_FND = 0xFF;
}
void setTCCR0(void)
{
 TCCR0 = 0x04;
}
void initTCNT0(void)
{
 TCNT0 = 6;
}
void setTIMSK(void)
{
 TIMSK = 0x01;
}
void sleep(unsigned int elapsed_time)
{
 while(g_elapsed_time < elapsed_time); 
 g_elapsed_time = 0;
}
SIGNAL(SIG_OVERFLOW0)
{
 g_elapsed_time++; 
 initTCNT0(); 
}


'Hardware > ATmega128' 카테고리의 다른 글

11. 두더지게임(ATmega128)  (0) 2011.05.17
10. Timer/Counter 비교매치 인터럽트  (0) 2011.05.11
9. Timer/Counter 출력  (0) 2011.05.11
8. 적외선 센서 출력  (0) 2011.05.11
7. FND 출력  (0) 2011.05.03
6. LED 실습문제  (0) 2011.04.26
Posted by mantwo