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

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 센서

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

페이지 정보

작성자 키트 작성일17-08-23 14:54 조회1,682회 댓글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

조회수 : 1,682

망고님의 댓글

망고 작성일

안녕하세요~ 인터럽트를 이용해서 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문 다음에 추가하면 될까요?

게시물 검색

센서 목록

게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전