센서 > 초음파센서 8개 - 인터럽트

TODAY1,059 TOTAL1,247,360
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 센서 | 초음파센서 | 초음파센서 8개 - 인터럽트

페이지 정보

작성자 키트 작성일2017-08-23 14:54 조회738회 댓글3건

본문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <mega128.h> 
#include <delay.h>
//
unsigned int  buf[8],dist[8],start=0,end=0;
unsigned char cnt=0,flag[8]={0,};
//
interrupt [EXT_INT0] void ext_int0_isr(void){ if(EICRA==0x03)start=TCNT1; else{ end=TCNT1; buf[0]=end-start; EIMSK=0; flag[0]=1; } EICRA^=0x01; }
interrupt [EXT_INT1] void ext_int1_isr(void){ if(EICRA==0x0C)start=TCNT1; else{ end=TCNT1; buf[1]=end-start; EIMSK=0; flag[1]=1; } EICRA^=0x04; }
interrupt [EXT_INT2] void ext_int2_isr(void){ if(EICRA==0x30)start=TCNT1; else{ end=TCNT1; buf[2]=end-start; EIMSK=0; flag[2]=1; } EICRA^=0x10; }
interrupt [EXT_INT3] void ext_int3_isr(void){ if(EICRA==0xC0)start=TCNT1; else{ end=TCNT1; buf[3]=end-start; EIMSK=0; flag[3]=1; } EICRA^=0x40; }
interrupt [EXT_INT4] void ext_int4_isr(void){ if(EICRB==0x03)start=TCNT1; else{ end=TCNT1; buf[4]=end-start; EIMSK=0; flag[4]=1; } EICRB^=0x01; }
interrupt [EXT_INT5] void ext_int5_isr(void){ if(EICRB==0x0C)start=TCNT1; else{ end=TCNT1; buf[5]=end-start; EIMSK=0; flag[5]=1; } EICRB^=0x04; }
interrupt [EXT_INT6] void ext_int6_isr(void){ if(EICRB==0x30)start=TCNT1; else{ end=TCNT1; buf[6]=end-start; EIMSK=0; flag[6]=1; } EICRB^=0x10; }
interrupt [EXT_INT7] void ext_int7_isr(void){ if(EICRB==0xC0)start=TCNT1; else{ end=TCNT1; buf[7]=end-start; EIMSK=0; flag[7]=1; } EICRB^=0x40; }
//
interrupt [TIM1_COMPA] void timer1_compa_isr(void){
    switch(cnt){
      case 0: PORTA|=0x01; delay_us(10); PORTA&=~0x01; EICRA=0x03; EICRB=0x00; EIFR=0xFF; EIMSK=0x01break;
      case 1: PORTA|=0x02; delay_us(10); PORTA&=~0x02; EICRA=0x0C; EICRB=0x00; EIFR=0xFF; EIMSK=0x02break;
      case 2: PORTA|=0x04; delay_us(10); PORTA&=~0x04; EICRA=0x30; EICRB=0x00; EIFR=0xFF; EIMSK=0x04break;
      case 3: PORTA|=0x08; delay_us(10); PORTA&=~0x08; EICRA=0xC0; EICRB=0x00; EIFR=0xFF; EIMSK=0x08break;
      case 4: PORTA|=0x19; delay_us(10); PORTA&=~0x10; EICRA=0x00; EICRB=0x03; EIFR=0xFF; EIMSK=0x10break;
      case 5: PORTA|=0x20; delay_us(10); PORTA&=~0x20; EICRA=0x00; EICRB=0x0C; EIFR=0xFF; EIMSK=0x20break;
      case 6: PORTA|=0x40; delay_us(10); PORTA&=~0x40; EICRA=0x00; EICRB=0x30; EIFR=0xFF; EIMSK=0x40break;
      case 7: PORTA|=0x80; delay_us(10); PORTA&=~0x80; EICRA=0x00; EICRB=0xC0; EIFR=0xFF; EIMSK=0x80break;
    }
    if(++cnt>7)cnt=0;
}
//
void main(void){
    DDRA=0xFF// 트리거
    DDRB=0xff;
    TCCR1B=0x0C; OCR1A=3124; TIMSK=0x10//16000000/256/(1+ 3124)=20Hz=50ms
    SREG=0x80;
    while(1){
        if(flag[0]){ flag[0]=0; dist[0]=(int)((float)buf[0]/14.5); }
        if(flag[1]){ flag[1]=0; dist[1]=(int)((float)buf[1]/14.5); }
        if(flag[2]){ flag[2]=0; dist[2]=(int)((float)buf[2]/14.5); }
        if(flag[3]){ flag[3]=0; dist[3]=(int)((float)buf[3]/14.5); }
        if(flag[4]){ flag[4]=0; dist[4]=(int)((float)buf[4]/14.5); }
        if(flag[5]){ flag[5]=0; dist[5]=(int)((float)buf[5]/14.5); }
        if(flag[6]){ flag[6]=0; dist[6]=(int)((float)buf[6]/14.5); }
        if(flag[7]){ flag[7]=0; dist[7]=(int)((float)buf[7]/14.5); }
    }
}
cs

//---------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define  F_CPU 16000000UL // 16 MHz
#include <avr/io.h>
#include <util/delay.h> 
#include <avr/interrupt.h>
//
volatile unsigned int  buf[8],dist[8],start=0,end=0;
volatile unsigned char cnt=0,flag[8]={0,};
//
ISR(INT0_vect){ if(EICRA==0x03)start=TCNT1; else{ end=TCNT1; buf[0]=end-start; EIMSK=0; flag[0]=1; } EICRA^=0x01; }
ISR(INT1_vect){ if(EICRA==0x0C)start=TCNT1; else{ end=TCNT1; buf[1]=end-start; EIMSK=0; flag[1]=1; } EICRA^=0x04; }
ISR(INT2_vect){ if(EICRA==0x30)start=TCNT1; else{ end=TCNT1; buf[2]=end-start; EIMSK=0; flag[2]=1; } EICRA^=0x10; }
ISR(INT3_vect){ if(EICRA==0xC0)start=TCNT1; else{ end=TCNT1; buf[3]=end-start; EIMSK=0; flag[3]=1; } EICRA^=0x40; }
ISR(INT4_vect){ if(EICRB==0x03)start=TCNT1; else{ end=TCNT1; buf[4]=end-start; EIMSK=0; flag[4]=1; } EICRB^=0x01; }
ISR(INT5_vect){ if(EICRB==0x0C)start=TCNT1; else{ end=TCNT1; buf[5]=end-start; EIMSK=0; flag[5]=1; } EICRB^=0x04; }
ISR(INT6_vect){ if(EICRB==0x30)start=TCNT1; else{ end=TCNT1; buf[6]=end-start; EIMSK=0; flag[6]=1; } EICRB^=0x10; }
ISR(INT7_vect){ if(EICRB==0xC0)start=TCNT1; else{ end=TCNT1; buf[7]=end-start; EIMSK=0; flag[7]=1; } EICRB^=0x40; }
//
ISR(TIMER1_COMPA_vect){
    switch(cnt){
      case 0: PORTA|=0x01; _delay_us(10); PORTA&=~0x01; EICRA=0x03; EICRB=0x00; EIFR=0xFF; EIMSK=0x01break;
      case 1: PORTA|=0x02; _delay_us(10); PORTA&=~0x02; EICRA=0x0C; EICRB=0x00; EIFR=0xFF; EIMSK=0x02break;
      case 2: PORTA|=0x04; _delay_us(10); PORTA&=~0x04; EICRA=0x30; EICRB=0x00; EIFR=0xFF; EIMSK=0x04break;
      case 3: PORTA|=0x08; _delay_us(10); PORTA&=~0x08; EICRA=0xC0; EICRB=0x00; EIFR=0xFF; EIMSK=0x08break;
      case 4: PORTA|=0x19; _delay_us(10); PORTA&=~0x10; EICRA=0x00; EICRB=0x03; EIFR=0xFF; EIMSK=0x10break;
      case 5: PORTA|=0x20; _delay_us(10); PORTA&=~0x20; EICRA=0x00; EICRB=0x0C; EIFR=0xFF; EIMSK=0x20break;
      case 6: PORTA|=0x40; _delay_us(10); PORTA&=~0x40; EICRA=0x00; EICRB=0x30; EIFR=0xFF; EIMSK=0x40break;
      case 7: PORTA|=0x80; _delay_us(10); PORTA&=~0x80; EICRA=0x00; EICRB=0xC0; EIFR=0xFF; EIMSK=0x80break;
    }
    if(++cnt>7)cnt=0;
}
//
int main(void){
    DDRA=0xFF// 트리거
    DDRB=0xff;
    TCCR1B=0x0C; OCR1A=3124; TIMSK=0x10//16000000/256/(1+ 3124)=20Hz=50ms
    SREG=0x80;
    while(1){
        if(flag[0]){ flag[0]=0; dist[0]=(int)((float)buf[0]/14.5); }
        if(flag[1]){ flag[1]=0; dist[1]=(int)((float)buf[1]/14.5); }
        if(flag[2]){ flag[2]=0; dist[2]=(int)((float)buf[2]/14.5); }
        if(flag[3]){ flag[3]=0; dist[3]=(int)((float)buf[3]/14.5); }
        if(flag[4]){ flag[4]=0; dist[4]=(int)((float)buf[4]/14.5); }
        if(flag[5]){ flag[5]=0; dist[5]=(int)((float)buf[5]/14.5); }
        if(flag[6]){ flag[6]=0; dist[6]=(int)((float)buf[6]/14.5); }
        if(flag[7]){ flag[7]=0; dist[7]=(int)((float)buf[7]/14.5); }
    }
}
cs


테스트 해보지 않은 예제입니다.
참고하세요

댓글 3

조회수 738

망고님의 댓글

망고작성일

안녕하세요~ 인터럽트를 이용해서 3개의 초음파를 사용하려고 하는데요~ PORTD를 이용해서 제어하고 싶습니다
위에 소스를 이용하려면 PORTA라고 되어있는 부분을 PORTD로 바꾸고,  트리거핀은 PORTD 4,5,6 에코핀은 PORTD 0,1,2 에 연결해서 사용하면 될까요?
main 함수에 DDRB = 0xff는 어떤부분을 초기화 하려고 사용하시는 건가요?
질문이 길지만 답변 부탁드리겠습니다ㅠㅠ

master님의 댓글

master댓글의 댓글작성일

DDRB = 0xff
포트B를 사용하지 않으니 이 코드는 삭제하세요
//
PORTA라고 되어있는 부분을 PORTD로 바꾸고,  트리거핀은 PORTD 4,5,6 에코핀은 PORTD 0,1,2 에 연결해서 사용하면 되지만
DDRD=0x70; // 트리거
DDRx 설정은 위처럼 변경하고
외부 인터럽트는 3개만 동작하도록 코드를 조정하시고
트리거 출력 시 비트마스크 방법으로 출력해야지 다른 핀이 영향을 받지 않습니다.

망고님의 댓글

망고댓글의 댓글작성일

답변 감사합니다! 죄송하지만.. 알려주신대로 바꿨는데 잘 안 돼서용 혹시 timer3을 쓰고 싶으면 TIMER1_COMPA_vect 이부분을 TIMER3_COMPA_vect로 바꾸고,
TCCR1B=0x0C; OCR1A=3124; 이부분을 TCCR3B=0x0C; OCR3A=3124; 이렇게 바꾸면 될까요? led로 초음파센서 인식하는걸 하고 싶은데
led코드는 while문 if문 다음에 추가하면 될까요?

센서HOME > 센서 > 전체 목록

게시물 검색

2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기