Busan IT/AVR 컨트롤러2015. 5. 12. 12:34

스위치 입력 시간에 따른 차등 실행

================================ Outline ====================================

스위치 입력 시간에 따른 차등 실행

----------------------------------------------------------------------------

 

<스위치 입력 시간에 따른 차등 실행>

 

 

I. 서술

 

스위치를 입력 받아 3초 이하 시간을 입력하고 있을 경우와 3초 이상의 시간을 입력하고 있을 때의 실행 값이 다르도록 코딩을 해본다.

 

II. 작업 나누기

 

1. 인터럽트가 제대로 작동하는지 확인한다.

 

2. 시간 차등을 위해 시간을 설정하기 위한 코딩을 한다.

- 3초 이하는 PORTA 4ON

- 3초 이상은 PORTA 5ON

 

3. 조건문을 사용하여 스위치를 눌렀다가 떼었을 때 출력 값이 나오도록 한다.

 

 

III. 코딩 및 실행

 

1. 인터럽트 작동 확인 -> 작동한다.

 

2. 시간 차등을 위한 코딩

- 3초 이하: 4번핀 ON

- 3초 이상: 5번핀 ON

 

-> 4번 핀의 값에 불이 들어오는 것은 확인했지만 3초 이상 시 5번 핀에 불이 들어오지 않는다.

 

!!! PORT A초기화 설정에서 DDRA = 0xF0; 값을 입력한 결과 0~3번 핀이 모두 입력으로 되어 입력 값을 넣어주지 않은 핀은 floating 상태가 되어 카운터를 위한 조건문에 값이 입력되지 않았다.

 

/*** 회로도 ***/



 

/*** 소스 ***/

<main.c>

#include "SMART.h"
#include "LCD.h"

volatile unsigned int uiCnt;
volatile unsigned char ucPin;
volatile unsigned int uipCnt=0;
volatile unsigned char ucSign=0;

int main(void)
{
  /* 변수 설정 */

  
  /* PORT 설정 */
  DDRA = 0x3E;  // PORTA, 0~3핀은 입력 4~7은 출력 

  
  


  /*  레지스터 설정 */
  // Timer/Counter //
  SREG = 0x7F;    // Global Interrupt Disable
  TCCR0A = 0x00;  // Normal mode, PWM inactive
  TCCR0B = 0x05;  // 분주비 설정: 1024분주
  TCNT0 = 0x00;  // Counter 0부터 시작. 
  TIMSK0 = 0x01;  // Overflow interrupt enable
  TIFR0 = 0x00;    // Clear interrupt flag
  SREG |= 0x80;  // Global interrupt enable

  
  while(1)
  {
    while(ucPin >= 0x01)
    {
    
      
      while(1)
      {
        ucPin = PINA;
        while(ucPin == 0x00)
        {  
          if(ucSign>3)
          {
            PORTA = 0x20;

          }
          

          else
          {
            PORTA = 0x10;

          }
          


        }
        
      }
      
      
    
      
          
          
    }
    
    
    
    
    
    
  }
  return 0;
}

void __vector_23(void)
{
  ucPin = PINA;
  if(ucPin>=0x01)
    ++uipCnt;

  if(uipCnt >= 10)
    ++ucSign;

}

 

/*** 실행 ***/


반응형
Posted by newind2000