회원가입 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
번호 분류 제목 글쓴이 조회 수 날짜
14 구인구직 HOT사람인 - 월급 1000만원 프로젝트, 프로그래머 모집 쭈니닷 5053 2012.06.18
13 구인구직 HOT(주)엑스큐어넷 - 소프트웨어 개발자(프로그래머) 채용 쭈니닷 4922 2012.06.12
12 구인구직 HOT(주)시뮬라인 - 기술개발본부 소프트웨어 팀 신입/경력사원 채용공고 쭈니닷 5484 2012.06.11
11 구인구직 HOT㈜엔써즈 - 시스템엔지니어 신입사원 모집 쭈니닷 6360 2012.06.08
10 구인구직 HOT㈜고우넷 - unix 엔지니어 채용 콘마개마 3843 2012.06.05
9 구인구직 HOT전액무료 자바(java)기반 하이브리드 프레임웍개발 안드로이드 개발교육과정 cocoa13 3406 2012.05.14
8 구인구직 HOT[교육부담 0%] 이공계 전액무료 하이브리드 앱 개발자 취업확정자 교육연수과정 cocoa13 4074 2012.05.01
7 구인구직 HOT[전액무료교육] 구로디지털 단지 자바개발 업체 채용확정자 취업교육” 안드로이드 개발 및 프로젝트 과정 cocoa13 3634 2012.04.30
6 구인구직 HOT[전액무료과정] 웹디자이너 양성교육 비주얼 컨텐츠 디자인 과정 안내 cocoa13 4625 2012.04.26
5 구인구직 HOTPOWER설계 및 하드웨어 경력자 찾아요. 박우종 5001 2012.03.07
4 구인구직 HOT회로수리 및 수땜, ECO작업등 필요하시면 연락주세요. 세윤파파 8663 2012.01.27
3 구인구직 HOT실력있는 펌웨어 엔지니어를 모집합니다. JamesHan 8121 2011.12.27
2 구인구직 HOT(주)로벤 연구소에서 연구원을 모집합니다. maddog 6501 2011.11.10
1 구인구직 HOT[급구] PCB 설계 경력자 & H/W 및 펌웨어 엔지니어 모집 용가리3 13458 2010.12.23
Prev 1 ... 5 6 7 8 9 10 11 12 13 14 Next
  • 나의 음악은 어린아이들과 동물들이 가장 잘 이해한다.
    - 스트라빈스키
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.