Chào các bác!
Em đang làm việc với 1 con srf05 và muốn dùng nó để đo khoảng cách tới vật cản, Sau một thời gian lọ mọ thì em viết được 1 chương trình, do chưa hiểu cách tính toán khoảng cách nên code em viết chỉ cần hiển thị giá trị của thanh ghi TCNT. nhưng khi nạp vào chip thì nó cứ nhảy loạn cả lên, và làm đơ cả chip. em không biết code em sai ở chỗ nào, mong mọi người giup em với! hix
đây là code em viết.
-----------------------------------
#include <mega128.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#define Trig PORTD.1
#define Echo PIND.0
static unsigned int tH=0, tL=0, t=0;
char OK=0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
tH=TCNT1H;
tH=TCNT1L;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x00;
OK=1;
}
void HT(unsigned int so, char c, char h)
{
char chn, ngh, tr, ch, dv;
chn=so/10000;
ngh=so%10000/1000;
tr=so%1000/100;
ch=so%100/10;
dv=so%10;
lcd_gotoxy(c,h);
lcd_putchar(chn+48);
lcd_putchar(ngh+48);
lcd_putchar(tr +48);
lcd_putchar(ch +48);
lcd_putchar(dv +48);
}
// Declare your global variables here
void main(void)
{
PORTD=0x00;
DDRD=0x02;
TCCR1A=0x00;
TCCR1B=0x00; //02
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x02;
EICRB=0x00;
EIMSK=0x01;
EIFR=0x01;
lcd_init(16);
#asm("sei")
OK=0;
while (1)
{
if(OK==0)
{
OK=2;
delay_ms(200);
PORTD.1=1;delay_us(20);
PORTD.1=0;
while(Echo==0);
TCCR1B=0x02;
}
else
if(OK==1)
{
t=tH*256+tL;
HT(t,6,1);
OK=0;
}
};
}
Em đang làm việc với 1 con srf05 và muốn dùng nó để đo khoảng cách tới vật cản, Sau một thời gian lọ mọ thì em viết được 1 chương trình, do chưa hiểu cách tính toán khoảng cách nên code em viết chỉ cần hiển thị giá trị của thanh ghi TCNT. nhưng khi nạp vào chip thì nó cứ nhảy loạn cả lên, và làm đơ cả chip. em không biết code em sai ở chỗ nào, mong mọi người giup em với! hix
đây là code em viết.
-----------------------------------
#include <mega128.h>
#include <delay.h>
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include <lcd.h>
#define Trig PORTD.1
#define Echo PIND.0
static unsigned int tH=0, tL=0, t=0;
char OK=0;
interrupt [EXT_INT0] void ext_int0_isr(void)
{
tH=TCNT1H;
tH=TCNT1L;
TCNT1H=0x00;
TCNT1L=0x00;
TCCR1B=0x00;
OK=1;
}
void HT(unsigned int so, char c, char h)
{
char chn, ngh, tr, ch, dv;
chn=so/10000;
ngh=so%10000/1000;
tr=so%1000/100;
ch=so%100/10;
dv=so%10;
lcd_gotoxy(c,h);
lcd_putchar(chn+48);
lcd_putchar(ngh+48);
lcd_putchar(tr +48);
lcd_putchar(ch +48);
lcd_putchar(dv +48);
}
// Declare your global variables here
void main(void)
{
PORTD=0x00;
DDRD=0x02;
TCCR1A=0x00;
TCCR1B=0x00; //02
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x02;
EICRB=0x00;
EIMSK=0x01;
EIFR=0x01;
lcd_init(16);
#asm("sei")
OK=0;
while (1)
{
if(OK==0)
{
OK=2;
delay_ms(200);
PORTD.1=1;delay_us(20);
PORTD.1=0;
while(Echo==0);
TCCR1B=0x02;
}
else
if(OK==1)
{
t=tH*256+tL;
HT(t,6,1);
OK=0;
}
};
}
Comment