관리 메뉴

드럼치는 프로그래머

[마이크로프로세서 응용설계] 실습자료 - AVR_TEST2 본문

★─Multi Media/☆─3학년 1학기

[마이크로프로세서 응용설계] 실습자료 - AVR_TEST2

드럼치는한동이 2008. 10. 13. 19:42

#include <iom128.h>
#include <ina90.h>

#define ON                 1
#define OFF                0
#define DEF_USE            1
#define DEF_NOTUSE         0
#define UINT8              unsigned char
#define UINT16             unsigned int

// input setting
#define get_sw0()          !PIND_Bit0
#define get_sw1()          !PIND_Bit5
#define get_sw2()          !PIND_Bit6

// output setting
#define set_led0(x)        PORTE_Bit3 = !x
#define set_led1(x)        PORTE_Bit4 = !x
#define set_led2(x)        PORTE_Bit5 = x
#define set_led3(x)        PORTE_Bit6 = x

#define Set_pullup(x)    {SFIOR_PUD = !x; }

void    delay_us(UINT16 time_us) // us 단위로 지연
{
 UINT16 i;
 for(i = 0; i < time_us; i++ ) // 4 cycle +
 {
  asm("NOP");  // 1 cycle +
  asm("NOP");  // 1 cycle +
  asm("NOP");  // 1 cycle +
  asm("NOP");  // 1 cycle += 8 cycle for 8MHZ
 }
} // 1초에 백만번

void delay_ms(UINT16 time_ms) // ms 단위로 지연
{
 UINT16    i;
 for ( i = 0; i < time_ms; i++ ) delay_us(1000);
}

void init_mcu()
{
    Set_pullup(DEF_USE); 
    DDRD = (UINT8) ~(0x61);   // ~(01100001) = (10011110) = 0x9e 
    DDRE = (UINT8) ~(0x87);   // ~(10000111) = (01111000) = 0x78
    PORTD = 0x61;             // 01100001
    PORTE = 0x18;             // 00011000
}

void main(void)
{
    int   pre_sw_status;        // 스위치의 이전 값 저장
    int   now_sw_status;        // 스위치의 현재 값 저장
    int   led_status;           // LED의 상태를 저장
    int   sw_on;                // 스위치의 값 변경을 위한 값
 
    init_mcu();               // mcu 초기화
   
    while (1)
    {   
        __watchdog_reset();
  
        now_sw_status = get_sw0();
  
        if ( now_sw_status == ON && pre_sw_status == OFF ) sw_on = ON; 
        pre_sw_status = now_sw_status;   // 다음을 위해 현재 값 저장
 
 delay_ms ( 10 );// 10 ms 지연  1초에 100번 스위치를 보고 led를 킨다
       
 if ( sw_on )
 {
            sw_on = OFF;
            if ( led_status == ON )
            {
                led_status = OFF;
  set_led0 ( OFF );
            }
            else
            {
                led_status = ON;
                set_led0 ( ON );
            }
        }
       
        if ( get_sw1() ) set_led1 ( ON );
        else set_led1 ( OFF );
       
        if ( get_sw2() ) set_led2 ( ON ); 
        else set_led2 ( OFF );
        
        set_led3 ( ON );
    };
}

Comments