뉴티씨



  • HOME
  • 고객지원
  • 질문답변


 
kd-128all 과제
 글쓴이 : 관리자
작성일 : 19-01-09 23:40
조회 : 10  
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용해 주셔서 감사합니다.

우선 논리에서 잘못된 부분은 delay를 하는 동안은 스위치 감지를 하지.않기 때문에 일어나는 일들입니다.

정말 잘 하려면 오버플로우타이머 등을 이용하여 시간 시간계산을 하고 그것으로 led를 일정시간마다 껏다 켰다 하는겁니다.

아직은 때가 아니니 넘어가고 담에 타이머 나오면 좀 유심히 봤다가 응용해서 해보세요.
열심히 하셔요.


>
>
> 안녕하세요....
>
> #include <iom128v.h>
> #include <macros.h>
> #include <stdio.h>
>
> #define SWITCH_IN PINA
>
> /* 해당포트의 비트별 hex값 */
> #define BIT7 0x80
> #define BIT6 0x40
> #define BIT5 0x20
> #define BIT4 0x10
> #define BIT3 0x08
> #define BIT2 0x04
> #define BIT1 0x02
> #define BIT0 0x01
>
> #define BIT(x)            (1 << (x))  // 해당 비트에 1을 세팅
> #define SETBIT(x, y)        (x |= y)    // 해당 비트를 1로 세팅
> #define CLEARBIT(x, y)      (x &= ~y)  // 해당 비트를 0으로 클리어
> #define CHECKBIT(x, y)      (x & y)    // 해당 비트의 0값 체크
>
> // 전역 변수 선언
> unsigned char i, led;
> volatile unsigned    char keyin;
>
> /* led_on/off 지연시간 관련 function */
> void delay(int dt)
> {
>    int i, j;
>    for(i=0; i<=100; i++)
>    {
>        for(j=0; j<=dt; j++);
>    }
> }
>
> /* a. 순서대로 1초에 한번씩 꺼졌다 켜지기 - turn_led function */
> void turn_led(void)
> {
>      unsigned char port_a=0;
>      while(1)
>    {
>                if((PINA & 0xff) != 0x00)
>                {
>                    PORTD = 0x00;
>                    break;
>                }
>          while((PINA & 0xff) == 0x00)
>          {
>                led = BIT0; // 0번 led를 점등 시킴
>                for(i=0; i<=7; i++)
>                {
>                    PORTD = led;
>                    led <<= 1;  // 한비트씩 왼쪽으로 이동하며 led 점등 시킴
>                    delay(1000);
>                }
>
>                led = 0x80; // 7번 led를 점등 시킴
>                for(i=0; i<=7; i++)
>                {
>                    PORTD = led;
>                    led >>= 1;  // 한비트씩 오른쪽으로 이동하며 led 점등 시킴
>                    delay(1000);
>                }
>          }
>    }
> }
>
>
> void main (void)
> {
>    DDRA = 0x00;
>    DDRD = 0xff;
>    while(1)
>    {
>        keyin = (PINA&0xff);
>        switch(keyin)
>        {
>        case BIT0 : turn_led();  break;
>       
>        default : PORTD = 0x00; break;
>        }
>    }
> }
>
> -------------------작동 구성-----------------------------
> 1. porta에 연결된 스위치의 동작 감지를 위해 porta의 값을 계속 확인한다.
>
> 2. 스위치를 입력 받으면 해당 함수로 진입해서 porta의 값이 0x00가 될 때가지 무한 루프를 돌며 대기한다.
>
> 3. porta의 값이 0x00가 되면 해당함수의 로직을 구현한다.
>
> 4. 해당함수의 로직이 구현되는 동안 porta의 값이 변하면, 함수를 빠져나와 1. 번동작부터 반복한다.
>
> ------------> 위와 같이 로직을 구현
> 일단 기본 동작은 작동 구성한 상태로 작동이 되는 것 같습니다.
>
> 그런데 문제는 수위치를  짧게 누루거나 다른 스위치를 누르면 동작이 않되고 조금 길게 누르면 되는 경우가
> 있습니다.
> 위의 로직상에 문제가 있는건지요?
>
> 또한 제가 생각할때 로직을 더욱 간결하게 하는 방법이 있지 않을까 하는데 어떻게 해야 하는지 감을 잡지
> 못하겠습니다.
>
> 혹 다른 로직으로 구현이 가능하거나 간단하게 구성할수 있는 다른 방법이 있을지 지도 부탁드립니다.
>