초음파 센서를 이용하여 10cm 이하에서는 led에 불이 들어 오게 할려고 하는데....
잘 않되네여...
소스 해석이랑 어디가 잘 못 되었는지 분석좀 부탁 드림 니다....ㅜ
atmega128과 srf-05를 이용하였습니다. .
#include <avr\io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <avr\signal.h>
#include <avr\interrupt.h>
#include <math.h>
typedef unsigned char u08;
volatile long TempTime,distance;
unsigned long TimeCnt;
void TX0_char(u08 );
SIGNAL(SIG_OVERFLOW3)
{
TimeCnt++;
}
SIGNAL(SIG_INTERRUPT4) /* forward UI Sensor Interrupt */
{
TempTime=TimeCnt*4369+TCNT3/15;
}
void Delay_us(unsigned char time_us) /* time delay for us */
{
register unsigned char i;
for(i = 0; i < time_us; i++) // 4 cycle +
{
asm volatile(" PUSH R0 "); // 2 cycle +
asm volatile(" POP R0 "); // 2 cycle +
asm volatile(" PUSH R0 "); // 2 cycle +
asm volatile(" POP R0 "); // 2 cycle +
asm volatile(" PUSH R0 "); // 2 cycle +
asm volatile(" POP R0 "); // 2 cycle = 16 cycle = 1 us for 16MHz
}
}
void Delay_ms(unsigned int time_ms) /* time delay for ms */
{
register unsigned int i;
for(i = 0; i < time_ms; i++) //C - > A (입력) , E -> D (출력)
{
Delay_us(250);
Delay_us(250);
Delay_us(250);
Delay_us(250);
}
}
void MCU_initialize(void) /* initialize ATmege128 MCU */
{
MCUCR = 0xC0; // enable external memory and I/O
XMCRA = 0x00; // 0x1100-0xFFFF=1 wait
XMCRB = 0x84; // enable bus keeper, use PC7-PC4 as I/O port
//DDRB = 0xFF; // PORTB = output, PB5 = OCR1A , PB6 = OCR1B
//PORTB = 0x00;
DDRA = 0xFF; // PORTc = output, PC7~PC4 : UI Output
PORTA = 0x00;
//DDRD = 0x1F; // PD4 = CW, PD0 = CCW
//PORTD = 0x00;
DDRD = 0x00; // PORTE = input, PE7~PE4 : UI Interrupt Input
PORTD = 0x00;
//DDRF = 0xff; // PORTF = input
//PORTF = 0x01;
TCCR1A = 0xAA; // Fast PWM mode of timer1
TCCR1B = 0x1A;
TCCR1C = 0x00;
ICR1 = 19999; // f(PWM) = 16MHz/8/20000 = 100Hz, T(PWM) = 10ms
TCCR3A=0x00; // Normal mode of timer3
TCCR3B=0x02; // f(PWM) = 16MHz/8 = 2MHz
TCCR3C=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
OCR1A =0;
OCR1B =0;
OCR1C =0;
ETIMSK=0x00;
EIMSK=0x00;
sei(); // global interrupt enable
}
long calc_distance(long val) /* Calculate UI Distance */
{
long distance;
distance=(val*340*0.001/2);
return (distance);
}
void ready_uisensor(void) /* UI transmit */
{
int i,j;
ETIMSK=0x40;
EIMSK=0x70;
Delay_ms(10);
PORTA |= 0x10;
for(i=0;i<800;i++){}
PORTA &=~(0x10);
for(j=0;j<20;j++)
{
for(i=0;i<800;i++){}
}
TCNT3H=0x00;
TCNT3L=0x00;
}
void Ultra_check(void) /* UI Receive & transmit */
{
if(TempTime)
{
ETIMSK=0x00;
EIMSK=0X00;
distance=calc_distance(TempTime);
}
if(distance < 10)
{
PORTC = 0x01^PORTC;
ready_uisensor();
}
}
int main(void)
{
MCU_initialize();
Delay_ms(1000);
while(1){
ready_uisensor();
Delay_ms(50);
Ultra_check();
Delay_ms(50);
}
return 0;
}
led 를 켰다 껏다 하려고 한건가요??
사용법을 알고 하신건지요?????
정확히 분석하지 않았지만
프로그램에서 사용하는 단위가 10미터인지 10cm인지 확인해보세요.
cal_distance 계산법확인해보시고요
이런부분이 다 맞다면 avr 레지스트리 세팅이 잘못된거겠지요.