Em mới học AVR, khởi đầu bằng em ATmega8, nhưng hiện đang gặp rắc rối khi dùng delay. Em viết code tạo xung trễ với 1 xung cho trước (100Hz) bằng AVRstudio, build, mô phỏng với proteus thì OK. Nhưng nạp vào ATmega8 thật (dùng STK500) thì không chạy như mô phỏng.
Đây là code của em:
Kết quả mô phỏng proteus:
Thực tế kiểm tra = oscilloscope không như mong muốn, xung tạo ra không trễ tí nào so với xung vào:
Em không hiểu tại sao cái tạo trễ 4000us "_delay_us(4000);" không làm việc trong khi các "_delay_us(400);" sau đó vẫn bình thường. Kính mong các cao nhân quan tâm giúp đỡ, em đang rất cần, xin đội ơn!!!
Đây là code của em:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
int main(void)
{
DDRC|=(1<<1)|(1<<3); //hai chan nay de tao xung
MCUCR|=(1<<ISC01); //bao ngat canh xuong chan INT0 (xung vao dat len chan nay)
GICR|=(1<<INT0); //cho phép ngat INT0
sei(); //65620 cho phep ngat VDK
while(1){}
return 0;}
ISR(INT0_vect)
{ PORTC=0;
_delay_us(4000); //tao tre 4000us
PORTC|=(1<<1)|(1<<3);
_delay_us(400);
PORTC=0;
_delay_us(400);
PORTC|=(1<<1)|(1<<3);
_delay_us(400);
PORTC=0; //tao chum 2 xung 400us
}
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
int main(void)
{
DDRC|=(1<<1)|(1<<3); //hai chan nay de tao xung
MCUCR|=(1<<ISC01); //bao ngat canh xuong chan INT0 (xung vao dat len chan nay)
GICR|=(1<<INT0); //cho phép ngat INT0
sei(); //65620 cho phep ngat VDK
while(1){}
return 0;}
ISR(INT0_vect)
{ PORTC=0;
_delay_us(4000); //tao tre 4000us
PORTC|=(1<<1)|(1<<3);
_delay_us(400);
PORTC=0;
_delay_us(400);
PORTC|=(1<<1)|(1<<3);
_delay_us(400);
PORTC=0; //tao chum 2 xung 400us
}
Thực tế kiểm tra = oscilloscope không như mong muốn, xung tạo ra không trễ tí nào so với xung vào:
Em không hiểu tại sao cái tạo trễ 4000us "_delay_us(4000);" không làm việc trong khi các "_delay_us(400);" sau đó vẫn bình thường. Kính mong các cao nhân quan tâm giúp đỡ, em đang rất cần, xin đội ơn!!!
Comment