Feb 202010
 

기본적으로 하위비트에서 상위비트로 LED가 shift되는 실험이다. 만약 인터럽트가 발생하면 반대방향으로 작동된다. 책의 예제에서는 한 주기를 마친다음에 적용되었었는데, 바로바로 방향이 바뀌도록 수정한 코드이다.

 

  

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h> 

typedef unsigned char byte;

volatile byte state = 0;

ISR(INT0_vect)
{
    state = !state;
}

int main(void)
{
    byte count = 0xfe;
    EICRA = 0x02; /* 하강앳지 인터럽트 */
    EIMSK = 0x01; /* int0 사용 */
    DDRD = 0x00;
    SREG = 0x80; /* sei */
    DDRB = 0xff;

    while(1)
    {
        if (state)
        {
            count = count << 1;
            count |= 0x01;
            if (count == 0xff)
            {
                count = 0xfe;
            }
        }
        else
        {
            count = count >> 1;
            count |= 0x80;
            if (count == 0xff)
            {
                count = 0x7f;
            }
        }

        PORTB = count;

        _delay_ms(200);
    }

    return 0;
}


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

This site uses Akismet to reduce spam. Learn how your comment data is processed.