'Atmega 128'에 해당되는 글 5건

  1. 2010.04.21 양방향 통신(pc:atmega128)
  2. 2010.04.20 스탑와치
  3. 2010.04.19 타이머
  4. 2010.04.15 StopWatch 실습
  5. 2010.04.15 교육 자료(1장~5장)

//=====main.c===================
#include <avr/io.h>


#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK/(16l*BAUD_RATE))-1     
#define BAUD_RATE_H ((CPU_CLOCK/(16l*BAUD_RATE))-1)>>8

//통신속도의 결과 값을 입력하기 위해 상하위 비트로 구분
//16l(소문자L)은 16+L이며,연산시 값이 너무 커져 overflow가 발생하므로 32비트 연산을
//위해 16에 Long을 의미하는 l을 붙인다.


unsigned char USART_Receive(void)
{
 while(!(UCSR1A&(1<<RXC)));
 
 return UDR1;
}

unsigned char USART_Transmit(ch)
{
 while(!(UCSR1A&(1<<TXC)));
 
 return UDR1;
}

int main(void)
{
 
 DDRF=0xff;
 PORTF=0xff;
 PINC=0x00;
 
 
 UBRR1L=(unsigned char)BAUD_RATE_L; //BAUD RATE 설정
 UBRR1H=(unsigned char)BAUD_RATE_H;
 
 //no parity,1 stop bit,8bit 설정
 UCSR1C=(0<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
 
 //rx/tx interrupt 설정,8bit 설정
 
 UCSR1B=(1<<TXEN)|(1<<RXEN)|(0<<UCSZ2);
 
 /*
 for(i=0;i<sizeof(buf);i++) //문자단위로 전체 문자열 전송
 {
 uart_send_byte(buf[i]); //문자 1개를 직렬포트로 전송  
 }
 */
 
  
 
  while(1)
  {
   unsigned char ch=USART_Receive();
   PORTF=ch^0xff;
   USART_Transmit(ch);
   asm("NOP");
   
  }
  
 
 
 return 1;
}

//==============      c++    ======================
#include <stdio.h>
#include <windows.h>

int main(void)
{
 char szPort[15];
 wsprintf(szPort,"COM%d",1);

 HANDLE m_hComm=NULL;
 m_hComm=CreateFile(szPort,
      GENERIC_READ|GENERIC_WRITE,
      0,NULL,OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,NULL);
 if(m_hComm==INVALID_HANDLE_VALUE)
  {
   printf("(!) Failed to create a Comm Device file");
   return FALSE;
  }

 DCB dcb;
 dcb.DCBlength=sizeof(DCB);

 GetCommState(m_hComm,&dcb);

 dcb.BaudRate=19200;
 dcb.ByteSize=8;
 dcb.Parity=0;
 dcb.StopBits=0;

 SetCommState(m_hComm,&dcb);
 
 OVERLAPPED osRead;
 OVERLAPPED osWrite;
 osWrite.Offset=0;
 osWrite.OffsetHigh=0;
 osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

 char buf;
 
 
 while(1)
  {
   printf("input:");
   scanf("%d",&buf);
   WriteFile(m_hComm,&buf,sizeof(buf),NULL,&osWrite);
   Sleep(1000);
   fflush(stdin);
   ReadFile(m_hComm,&buf,sizeof(buf),NULL,&osRead);
   printf("output:%d\n",buf);

  }
 CloseHandle(m_hComm);

 return 0;
}

'Atmega 128' 카테고리의 다른 글

스탑와치  (0) 2010.04.20
타이머  (0) 2010.04.19
StopWatch 실습  (0) 2010.04.15
교육 자료(1장~5장)  (0) 2010.04.15
Posted by 지화명이
,

스탑와치

Atmega 128 2010. 4. 20. 11:58


//STOP SWATCH 실습 ..1번 누르면 시작...2번 누르면 스톱  //

#include "ddr.h"
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CLOCK     16000000  // cpu clodk = 16,000,000 Hz
#define TICKS_PER_SEC 1000      // Ticks per sec = 1,000
#define PRESCALER     64        // 클럭의 배수 (크기,오버헤드)
#define DDR_LED DDRF
#define DATA_TO_LED PORTF
#define DATA_TO_FND PORTE
#define DDR_SENSOR DDRD
#define DATA_FROM_SENSOR PIND
#define DDR_FND DDRE
#define DDR_SW DDRC
#define SWITCH_INPUT PORTC
#define INPUT_C PINC

volatile unsigned int g_elapsed_time;   //  시간 변수
volatile unsigned int led_state=0;


void initLED();                   // LED 초기화
void initFND();         //FND 초기화...
void setTCCR0();
void initTCNT0();
void setTIMSK();
sleep(unsigned int elapsed_time);  // 1초대기
SIGNAL(SIG_OVERFLOW0);

void ACT_FND();


int main()

 
 initLED(); 
 initFND();    
 setTCCR0();      
 initTCNT0();
 setTIMSK();
 sei();    // 인터럽트 활성화
 //DDR_SW=0x00;  //c포트를 스위치 입력으로 ...

 volatile unsigned char a;
   
 
 
 while(1)
 {
  
  char a;
  
  
  
  a=~PINC;  
  a=(a<<6);
  
  
  
  
  if(a==(0b01000000))
  {
   initLED(); 
   initFND(); 
   
   led_state=8;
   
   
   while(1)
   {  
    ACT_FND(); 
   
    DATA_TO_LED=(1<<led_state);
   
    a=~PINC;  
    a=(a<<6);
  
    if(a==(0b10000000))
    {
     break;
    }
   }
   
  }
  
 }
 
 return 1;
}

initLED()     //LED 초기화 함수

 DDR_LED=0xFF;
 DATA_TO_LED=0x00;  
}
initFND()    //FND 초기화 함수

 DDR_FND=0xFF;
 DATA_TO_FND=0xff;  //  전부 꺼짐....OFF..

setTCCR0()     //분주비 64로 설정
{
 TCCR0=0b00000100;  
}
initTCNT0()     // 카운터 6으로 초기화
{
 TCNT0=0b00000110;
}
setTIMSK()     // 오버플로우 사용하겠다.
{
 TIMSK=0b00000001;
}

sleep(unsigned int elapsed_time) // elapsed_time = 1000
{
 

 g_elapsed_time=0;
 
 while(1)
 {
  if(elapsed_time==g_elapsed_time)
  {  
   break; 
  }
 
 }
}

SIGNAL(SIG_OVERFLOW0)
{
 initTCNT0() ;
 g_elapsed_time=g_elapsed_time+1; 
}
    

ACT_FND()
{
 int iCount=0;
 int jCount=0;
 int FndCount=0;
 char a=0;
  
  for(iCount=0;iCount<=9;++iCount)
  {
   for(jCount=0;9>=jCount;++jCount)
   {
    DATA_TO_FND=FndCount;
    sleep(10);
    ++FndCount;
    
   }
   FndCount=FndCount+6;
   
   a=~PINC;  
   a=(a<<6);
  
    if(a==(0b10000000))
    {
     
     break;
    }
    
  }
  
  led_state++;
  if(led_state>=8)
  {
   led_state=0;
  }
  
}

 

'Atmega 128' 카테고리의 다른 글

양방향 통신(pc:atmega128)  (0) 2010.04.21
타이머  (0) 2010.04.19
StopWatch 실습  (0) 2010.04.15
교육 자료(1장~5장)  (0) 2010.04.15
Posted by 지화명이
,

타이머

Atmega 128 2010. 4. 19. 13:53


#include <ddr.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

#define CPU_CLOCK     16000000  // cpu clodk = 16,000,000 Hz
#define TICKS_PER_SEC 1000      // Ticks per sec = 1,000
#define PRESCALER     64        // 클럭의 배수 (크기,오버헤드)
#define DDR_LED DDRF
#define DATA_TO_LED PORTF
#define DDR_SENSOR DDRD
#define DATA_FROM_SENSOR PIND

volatile unsigned int g_elapsed_time;   //  시간 변수

initLED();               // LED 초기화
setTCCR0();
initTCNT0();
setTIMSK();
sleep(unsigned int elapsed_time);  // 1초대기
SIGNAL(SIG_OVERFLOW0);

int main()

 
 
 
 
 initLED();      
 setTCCR0();      
 initTCNT0();
 setTIMSK();
 sei();   // 인터럽트 활성화
 
 
 while(1)    
 {
  
     

  
  sleep(1000);

  
  
  DDR_LED=DDR_LED+1
 
 }
 return 1;
}

initLED()   //LED 초기화 함수

 DDR_LED=0xFF;
 DATA_TO_LED=0xFF;  // 전부켜져있음
}
setTCCR0()   //분주비 64로 설정
{
 TCCR0=0b00000100;  
}
initTCNT0()  // 카운터 6으로 초기화
{
 TCNT0=0b00000110;
}
setTIMSK()   // 오버플로우 사용하겠다.
{
 TIMSK=0b00000001;
}

sleep(unsigned int elapsed_time) // elapsed_time = 1000
{
 int a=0;

 g_elapsed_time=0;
 
 while(1)
 {
  if(elapsed_time==g_elapsed_time)
  {  
   break; 
  }

  
 
 DDR_LED=~a;
 a++;
  
 }
}

SIGNAL(SIG_OVERFLOW0)
{
 initTCNT0() ;
 g_elapsed_time=g_elapsed_time+1; 
}
    
  

'Atmega 128' 카테고리의 다른 글

양방향 통신(pc:atmega128)  (0) 2010.04.21
스탑와치  (0) 2010.04.20
StopWatch 실습  (0) 2010.04.15
교육 자료(1장~5장)  (0) 2010.04.15
Posted by 지화명이
,

StopWatch 실습

Atmega 128 2010. 4. 15. 13:55

<StopWatch 실습>


1분 내의 시간을 잴 수 있는 스톱와치 프로그램을 구현하시오.
(초/밀리초 = 00:00)

1번 스위치를 누르면 일시정지, 다시 누르면 재개.
2번 스위치를 누르면 리셋됨

밀리초 값은 FND, 초 값은 LED에 표시함.

'Atmega 128' 카테고리의 다른 글

양방향 통신(pc:atmega128)  (0) 2010.04.21
스탑와치  (0) 2010.04.20
타이머  (0) 2010.04.19
교육 자료(1장~5장)  (0) 2010.04.15
Posted by 지화명이
,

'Atmega 128' 카테고리의 다른 글

양방향 통신(pc:atmega128)  (0) 2010.04.21
스탑와치  (0) 2010.04.20
타이머  (0) 2010.04.19
StopWatch 실습  (0) 2010.04.15
Posted by 지화명이
,