1. 외부 인터럽트
INT0 번 2번핀 change 인터럽트시
falling edge 인터럽트
void setup() {
// put your setup code here, to run once:
cli();
DDRD = DDRD | (1<<7)| (1<<6)| (1<<5);
EIMSK = EIMSK|1; // INT0 인터럽트 허용
EICRA = EICRA|(1<<1)&(~1);
sei();
}
void loop() {
// put your main code here, to run repeatedly:
}
int togle = 1;
ISR(__vector_1)
{
if (1 == togle )
{
PORTD = (1<<7);
togle = 0;
}
else
{
PORTD = (1<<6);
togle = 1;
}
}
change 인터럽트
void setup() {
cli();
DDRD = DDRD | (1<<7)| (1<<6)| (1<<5);
EIMSK = EIMSK|1; // INT0 인터럽트 허용
//EICRA = EICRA|3; // rising
//EICRA = EICRA|(1<<1)&(~1); // falling
//EICRA = EICRA&0; // lowlevel
EICRA = EICRA|1;
sei();
}
void loop()
{
}
int togle = 1;
ISR(__vector_1)
{
if (1 == togle )
{
PORTD = (1<<7);
togle = 0;
}
else
{
PORTD = (1<<6);
togle = 1;
}
}
falling , rising change 인터럽트
void setup() {
// put your setup code here, to run once:
cli();
DDRD = DDRD | (1<<7)| (1<<6)| (1<<5);
EIMSK = EIMSK|1; // INT0 인터럽트 허용
EICRA = EICRA|3; //상승
sei();
}
void loop() {}
ISR(__vector_1)
{
if(1 == (EICRA&1))
{
PORTD = (1<<7);
EICRA = (EICRA|(1<<1))&(~1);
}
else
{
PORTD = (1<<6);
EICRA = EICRA|3;
}
}
2. tiemr , timer 2 로 1초마다 7번 6번 번갈아서 LED 출력
volatile uint16_t count = 0;
char toggle = 1;
void setup()
{
cli();
DDRD =DDRD |(1<<7)|(1<<6)|(1<<5);
//ASSR = ASSR|(1<<5);
while(ASSR&(1<<4));// register is bussy?
TCNT2 = 0x06;
while(ASSR&(1<<0)); // register is bussy?
TCCR2A = 0x00; // 노멀모드 초기화
TCCR2B = 0x04; //분주비 64
TIMSK2 = 0x01; // overflow 인터럽트 발생가능
sei(); // 인터럽트 사용
}
void loop()
{
}
ISR(__vector_9)
{
count++;
if(count>999)
{
if(toggle)
{
PORTD = (1<<7);
toggle = 0;
}
else
{
PORTD = (1<<6);
toggle = 1;
}
count=0;
}
while(ASSR&(1<<4));
TCNT2 = 0x06;
}
burst delay ( 10us 지연 timer 0 사용 )
unsigned int count = 0;
unsigned int tick = 0;
unsigned int clck = 0;
volatile unsigned int flag = 1;
void setup()
{
init_timer2();
init_externINT();
DDRD = (1<<7); // 7번을 trigger 로 사용
DDRD = DDRD|(1<<6)|(1<<5);
Serial.begin(9600);
}
void init_timer2()
{
cli();
while(ASSR&(1<<0)); // register is bussy?
TCCR2A = 0x00; // 노멀모드 초기화
TCCR2B = 0x04; //분주비 64
TIMSK2 = 0x01; // overflow 인터럽트 발생가능
sei(); // 인터럽트 사용
}
void init_externINT()
{
cli();
EIMSK = EIMSK|1; // INT0 인터럽트 허용
EICRA = EICRA|3; //상승
sei();
}
unsigned int distanceCalulate()
{
clck = 0;
tick = 0;
PORTD = PORTD|(1<<7);
delayMicroseconds(10);
PORTD = PORTD &(~(1<<7));
while(flag); // echo 대기
flag = 1;
return (clck*14 + tick*3482) ;
}
void loop()
{
unsigned int result;
result = distanceCalulate();
Serial.print(result/100);
Serial.print(".");
Serial.print(result%100);
Serial.println(" cm");
delay(1000);
}
ISR(__vector_1)
{
if(1 == (EICRA&1))
{
EICRA = (EICRA|(1<<1))&(~1);
while(ASSR&(1<<4));
TCNT2 = 0; // 카운터 0 으로초기화
count = 0;
}
else
{
flag = 0;
tick = count;
clck = TCNT2;
EICRA = EICRA|3;
}
}
ISR(__vector_9)
{
count++;
}
'공부,일 > atmega328P' 카테고리의 다른 글
timer1 , 1초 깜빡이 코드 (0) | 2021.10.05 |
---|---|
캐릭터 LCD 프로그래밍 (0) | 2021.09.22 |
atmel studio 에서 printf, scanf 사용 (0) | 2021.08.11 |
atmega328P TWI(I2C) 통신 (3) 실습 (0) | 2021.08.07 |
atmega328P TWI(I2C) 통신 (2) (0) | 2021.08.05 |
댓글