회원가입 ID/PW 찾기
AA
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h> 
#include <util/delay.h>
#define ENABLE  (PORTA |=  0x04)  // LCD ENable 또는 PORTA_Bit2=1;
#define DISABLE (PORTA &= 0xFB)   // LCD DIsable 또는 PORTA_Bit2=0;


volatile unsigned int count=0; //count는 1cm마다 증가하는 변수. 즉, count 값이 곧 물체와의 거리이다.
volatile unsigned int length; //거리를 저장 할 변수


void init_PORTA(void)
{
DDRA = 0xFF;    // PORTA 출력
PORTA=0xFF;     // 초기 값
}
void delay(int dly)
{
        while(dly--){
        int i,n;
        for(i=0;i<50;i++){
                n=600;
                while(n--);
                }
        }
}

void wait_busy_flag(void)
{
unsigned int i;
for(i=0;i<10000;i++);

  
void m_delay(unsigned int m) //딜레이 루틴
{
    cli();
unsigned int i, j;
 
for(i=0;i<m;i++)
  for(j=0;j<2650;j++);  //16MHz : 1msec
sei();
}

void ddelay(unsigned int p)
{
unsigned int i;

for(i=0;i<p;i++);
}

void instruction_out(unsigned char b)//명령어 쓰기 함수
{
PORTA=b&0xF0;                    //상위 4BIT 출력 

ENABLE;                          //ENABLE
DISABLE;                         //DISABLE
PORTA=(b<<4)&0xF0;               //하위 4BIT 출력
ENABLE;                          //ENABLE
DISABLE;                         //DISABLE
//명령어 수행이 완료될때까지 지연
_delay_ms(2);

}


void char_out(unsigned char b)  //LCD에 한문자 출력 함수
{
   
PORTA=(b&0xF0)|0x01;        //상위 4BIT 출력
ENABLE;                     //ENABLE
DISABLE;                    //DISABLE 
PORTA=((b<<4)&0xF0)|0x01;   //하위 4BIT 출력
ENABLE;                     //ENABLE
DISABLE;                    //DISABLE

   //명령어 수행이 완료될때까지 지연
    _delay_ms(2);
}


void string_out(unsigned char b, unsigned char *str) //문자열 출력 함수
{
unsigned int i=0;
instruction_out(b);   //LCD 위치 지정
do{
   char_out(str[i]);
  }while(str[++i]!='\0');   // NULL 문자를 만날 때 까지
}


void init_LCD(void)                //LCD초기화 루틴
{   
init_PORTA();    // LCD를 연결한 포트 초기화

  _delay_ms(15);                         
           
ddelay(600);  
instruction_out(0x28);   //LCD FUNCTION SET(16X2 LINE, 4 BIT, 5X8 DOT)            
    _delay_ms(2); 
    instruction_out(0x28);   //LCD FUNCTION SET(16X2 LINE, 4 BIT, 5X8 DOT)    
_delay_ms(2); 
instruction_out(0x0C);   //LCD DISPLAY ON, CURSOR OFF, BLINK OFF 
instruction_out(0x06);   //LCD ENTRY MODE SET
instruction_out(0x02);   //RETURN HOME
instruction_out(0x01);   //LCD CLEAR
instruction_out(0x01);   //LCD CLEAR 
}
void init_SERIAL(void)   // 시리얼 함수 초기화
{

     DDRE=0xFE;     // PE1(TXD) 출력(1), PE0(RXD) 입력(0)

     UCSR0A=0x00;
     UCSR0B=0x98;   // Receive enable, Transmitte enable
     UCSR0C=0x06;   // 비동기 방식, No parity bit, 1 stop bit   

     UBRR0H=0;
     UBRR0L=0x08;   // 16MHz에서 9600 bps  (10진수 103)
}

void lcd_decimal(unsigned int hex) //lcd  10진수 표기
{
     unsigned int h;
     //instruction_out(b); //lcd lotate
     h=(hex/10000);              //5자리수에서 첫째 자리 분리.
     if (h!=0) char_out(h+0x30);
     else char_out(0x30);
     h=((hex%10000)/1000);       //4
     if (h!=0) char_out(h+0x30);
     else char_out(0x30);
     h=(((hex%10000)%1000)/100);    //3
     if (h!=0) char_out(h+0x30);
     else char_out(0x30);
     h=((((hex%10000)%1000)%100)/10);  //2
     if (h!=0) char_out(h+0x30);
     else char_out(0x30);
     h=((((hex%10000)%1000)%100)%10);  //1
     if (h!=0) char_out(h+0x30);
     else char_out(0x30);
     }
// 시리얼 포트로 한문자를 송신한다. 
char getch(void)
{
unsigned char data;
while(!(UCSR0A & 0x80));
data=UDR0;
UCSR0A |=0x80;
return(data);
}
void putch(unsigned char data)
{
while(!(UCSR0A & 0x20));
UDR0=data;
    
UCSR0A |= 0x20;         // 클리어 UDRE0
}
SIGNAL(SIG_OVERFLOW0)//타이머 0번 인터럽트 함수부분.
{
     
    TCNT0 = 0x8b; //138; //(1/16us)*8분주*(256-138) =59us 마다 인터럽트를 발생 0x8a
    count++;  //cm 단위    srf04의 경우 59us가 1cm 이다 타이머 카운터0 레지스터 (읽기 쓰기가 가능)   // 이곳도 잘되고있는지 궁금해요..
}
SIGNAL(SIG_INTERRUPT1) //에코신호가 들어오면...
{
    SREG = 0x80; 
    DDRB= 0xff; //led입력

    TIMSK = 0x01;    // 타이머 정지
    length = count; //지금까지 잰 거리를 length변수에 넣음.
    EIMSK = 0;   // 외부 인터럽트1 정지
    if(length > 10){
       
PORTB =0x80;                    //  이곳이 작동이 안됨.
  
    }else {
PORTB = 0x11;  //물체가 그 사이에 없으면 led oFF
}
instruction_out(0xC1);
lcd_decimal(length);
    count = 0;  
cli();
}
int main(void)
{
    unsigned char data;
   
    DDRD = 0x02; //INT1(인터럽트)에 echo연결
    DDRD= 0x01; //trigger연결
     init_SERIAL();  //LCD 초기화
    init_LCD();
    instruction_out(0x01);     // LCD clear
    string_out(0x81,"USART0");
 
    

    while(1){

     EICRA = 0x02;    // 외부 인터럽트 제어 레지스터 하강에지설정 ok
     TCCR0 = 0x02; //8(8분주)   -> 타이머 카운터 0 제어 레지스터 ok

        SREG = 0x80; //set global interrupt enable 전역 인터럽트 인에이블 비트셋

        PORTD= 0x01; //트리거 신호를 10us만큼 보낸다.

        delay(1);
        PORTD= 0x00;
        //TCNT0 = 0x8b;
       //(1/16us)*8분주*(256-138) =59us 마다 인터럽트를 발생

        TIMSK = 0x01; //타이머 카운트 활성화 -> 이 때 부터 시간을 잰다.
        EIMSK = 0b00000001;  //오버플로우 인터럽트
        EIMSK = 0b00000010;    // 외부 인터럽트1 인에이블설정  
        delay(5);
 
    }
}

 

 
제가 지금 하는 초음파모듈 거리 값 받아오는 건데요 아무리 해봐도 도저히 안되네요
방법좀 알려주세요
led 도 안켜지구요 ㅠㅠ
댓글 1
  • No Profile

    초음파거리측정 인테넷에 자료는 많아도 다 거기서 거기죠 소스와 설명이....... 저도 애를먹었죠 아무것도 없는 상태에서 하려다가 ㅎㅎ

     

     

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
1704 중고장터 HOTAtmega128, ISP, 블루투스모듈, RS232케이블, 모터기어박스 등각각팝니다 btnim 8177 2011.06.11
1703 마이크로프로세서 HOTATMEGA64 전원 공급관련2 제갈군 2501 2011.06.11
1702 마이크로프로세서 HOTsrf-04 초음파 질문 혼합쥬스 2116 2011.06.11
1701 PADS HOTpads 9.2 설치 도중에 에러 발생. 하경철 2522 2011.06.13
1700 PADS HOTpads 9.3 설치 방법 문의 드립니다. 하경철 2538 2011.06.13
1699 Software & IDEs HOT펌웨어 하다가 막히는 부분이 있어서 질문 드립니다. 마모루 1549 2011.06.13
1698 PADS HOT인스톨 깔고,,,mentorKG.exe 실행하는데.... 부탁드립니다.1 하경철 3335 2011.06.14
1697 개발용역 HOT개발의뢰합니다.(파트타임,알바,기간제)3 아크로팰리스 7678 2011.06.14
1696 마이크로프로세서 HOT[Keil Uvision] 크랙버전이나 정품버전있으신분 보내주시면 감사하겟습니당1 developer 3769 2011.06.15
마이크로프로세서 HOT초음파 연동 uart led1 혼합쥬스 2003 2011.06.15
1694 마이크로프로세서 HOTAVR to MFC 시리얼통신 Gentlewolf 4464 2011.06.18
1693 자유주제 HOT블루투스 모듈에 관해서1 데이비스깽 17151 2011.06.18
1692 자유주제 HOT고소왕ㅋ5 데이비스깽 3232 2011.06.18
1691 마이크로프로세서 HOT89c51, L293B 사용해서 라인트레이서 제작중인데 소스 좀 수정부탁드려요.. 짜룡e 2241 2011.06.19
1690 Sensor 설계 HOT콘덴서 인덕터 코일 단위와 관련한 질문입니다.1 windjick 2956 2011.06.21
1689 펌웨어 & 코딩언어 HOTAtmega128에서 Reset 하는 방법 중 궁금한 점이 있습니다!!!4 공돌이의꿈 3147 2011.06.21
1688 자유주제 HOTDC-DC IC 관련 입니다. 무적쫑 15219 2011.06.22
1687 PADS HOTPADS 9.3 win7 64bit 에서 License.dat 설치문제.. 돌겠습니다.1 PDP70 4234 2011.06.22
1686 마이크로프로세서 HOTATmega128 Board 에 연결한 Bluetooth 의 페어링 문제 nrwnqsr 3096 2011.06.22
1685 마이크로프로세서 HOTADC 에 관한 질문2 고고고씽 1870 2011.06.22
  • 사람은 자기가 한 약속을 지킬만한 좋은 기억력을 가져야 한다.
    - 니체
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.