Mình đang làm đồ án mạch đồng hồ bằng AVR.Về cơ bản thì đã gần hoàn thiện.Đồng hồ của mình dùng ngắt Timer(ngắt tràn) chứ không dùng DS1307 như hay thấy trên mạng.Tuy nhiên mình đang gặp 2 vấn đề chưa giải quyết được mong các bro giúp đỡ:
1. Mạch của mình đã chạy thời gian ngon lành, tuy nhiên khi mình thiết kế 4 nút để căn chỉnh thời gian phòng khi bị sai giờ gồm có nút MODE (để chọn chế độ chỉnh giờ hay chỉnh phút); nút UP, DOWN để chỉnh tăng giảm; và nút OK để hoàn tất. 3 nút MODE,UP,DOWN hoạt động bình thường. Còn nút OK mỗi lần chỉnh xong bấm thì thấy đồng hồ lại trở về các giá trị mặc định ban đầu (đã set trong chương trình) (không hiểu sao nó hoạt động như 1 nút reset. Mình đã thử nhiều cách mà vẫn bị vậy. Theo mình đọc được thì sau khi xảy ra ngắt ngoài, chương trình trở về vị trí trước đó(trước khi ngắt), theo nguyên tắc đó thì đáng lẽ kết quả mình chỉnh phải được lưu lại chứ ? Mình cũng đã từng nghĩ là do mình đặt các biến có vấn đề nhưng chỉnh hoài cũng ko được
2. Mình set cho đồng hồ cứ đến 6h30 là có chuông. Tuy nhiên khi chạy mô phỏng thì chuông không có kêu mặc dù có tín hiệu ra(các bạn có thể chạy thử mô phỏng trên Proteus file mình đính kèm sẽ thấy). Mình đã kiểm tra bằng LED thì thấy LED có nhấp nháy, như vậy vấn đề nằm ở chuông( không biết có phải do tần số tín hiệu không phù hợp với chuông?)
Đây là toàn bộ projet của mình( gồm file C, file DNS, file hex). Mong các bạn chỉ giúp mình lỗi với.Cố gắng chi tiết hộ mình càng tốt. Mình xài trình biên dịch WinAVR. Cám ơn các bạn rất nhiều!
http://www.mediafire.com/?o5dhodwp34phf65
1. Mạch của mình đã chạy thời gian ngon lành, tuy nhiên khi mình thiết kế 4 nút để căn chỉnh thời gian phòng khi bị sai giờ gồm có nút MODE (để chọn chế độ chỉnh giờ hay chỉnh phút); nút UP, DOWN để chỉnh tăng giảm; và nút OK để hoàn tất. 3 nút MODE,UP,DOWN hoạt động bình thường. Còn nút OK mỗi lần chỉnh xong bấm thì thấy đồng hồ lại trở về các giá trị mặc định ban đầu (đã set trong chương trình) (không hiểu sao nó hoạt động như 1 nút reset. Mình đã thử nhiều cách mà vẫn bị vậy. Theo mình đọc được thì sau khi xảy ra ngắt ngoài, chương trình trở về vị trí trước đó(trước khi ngắt), theo nguyên tắc đó thì đáng lẽ kết quả mình chỉnh phải được lưu lại chứ ? Mình cũng đã từng nghĩ là do mình đặt các biến có vấn đề nhưng chỉnh hoài cũng ko được
2. Mình set cho đồng hồ cứ đến 6h30 là có chuông. Tuy nhiên khi chạy mô phỏng thì chuông không có kêu mặc dù có tín hiệu ra(các bạn có thể chạy thử mô phỏng trên Proteus file mình đính kèm sẽ thấy). Mình đã kiểm tra bằng LED thì thấy LED có nhấp nháy, như vậy vấn đề nằm ở chuông( không biết có phải do tần số tín hiệu không phù hợp với chuông?)
Đây là toàn bộ projet của mình( gồm file C, file DNS, file hex). Mong các bạn chỉ giúp mình lỗi với.Cố gắng chi tiết hộ mình càng tốt. Mình xài trình biên dịch WinAVR. Cám ơn các bạn rất nhiều!
http://www.mediafire.com/?o5dhodwp34phf65
Code:
// Luu Hoang Chung ------PFIEV08/BKHCM #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> volatile int8_t s=58; volatile int8_t p=29; volatile int8_t h=6; void disp1(int add, unsigned char dat)//////Ham con hien thi phut va giay { unsigned char num_led[5]={0,0x7f,0xbf,0xdf,0xef}; PORTC=dat; PORTD=num_led[add]; _delay_ms(1); PORTD|=1<<PD4; PORTD|=1<<PD5; PORTD|=1<<PD6; PORTD|=1<<PD7; } void disp2(int add, unsigned char dat)//////Ham con hien thi gio { unsigned char num_led[3]={0,0x40,0x80}; PORTC=dat; PORTB=num_led[add]; _delay_ms(1); PORTB|=1<<PB6; PORTB|=1<<PB7; } ISR (TIMER1_OVF_vect) ////////Ngat timer(ngat tran) { TCNT1=49911; s=s+1; if(s==60) { s=0; p=p+1; } if(p==60) { p=0; h=h+1; }; if(h==24) { h=0; } } ///////////////////////////////////////////////////////trinh phuc vu ngat ngoai ISR(INT0_vect) { int a=0; while(1) { if (bit_is_clear(PIND,2)) /////Bam nut MODE { a++; if (a>1) a=0; _delay_ms(100); } switch (a) { case 0: { if (bit_is_clear(PIND,0)) { h++; // up _delay_ms(100); } if (bit_is_clear(PIND,1)) { h--; // Down _delay_ms(100); } if (h==24) h=0; if (h<0) h=23; disp2(1,(h/10)%10); disp2(2,h%10); break; } case 1: { if (bit_is_clear(PIND,0)) { p++; // up if (p==60) p=0; _delay_ms(100); } if (bit_is_clear(PIND,1)) { p--; // Down if (p==0) p=59; _delay_ms(100); } disp1(1,(p/10)%10); disp1(2,p%10); break; } } if (bit_is_clear(PIND,3)) // Thoat chinh gio,phut(nut OK) { _delay_ms(10); disp1(1,(p/10)%10); disp1(2,p%10); disp1(3,(s/10)%10); disp1(4,s%10); disp2(1,(h/10)%10); disp2(2,h%10); break; } } } ////////////////////////////////////////////////////////////////////// int main(void){ DDRC=0xFF;//PORTC la ouput PORTC=0x00; PORTD=0x00;// su dung 4 chan dau tien cua PORTD lam input ngat DDRD=0xF0; PORTB=0x00;// su dung 2 chan cua PORTB de dieu khien led hien thi gio DDRB=0xFF; TCCR1B=(0<<CS12)|(1<<CS11)|(1<<CS10);//CHON PRESCALER=64 TCNT1=49911; TIMSK=(1<<TOIE1); sei(); MCUCR|=(1<<ISC11)|(1<<ISC01);// Ca 2 la ngat canh xuong GICR|=(1<<INT1)|(1<<INT0);//cho phep 2 ngat hoat dong sei();// set bit I cho phep ngat toan cuc while (1) { disp1(1,(p/10)%10); disp1(2,p%10); disp1(3,(s/10)%10); disp1(4,s%10); disp2(1,(h/10)%10); disp2(2,h%10); ///////////////////6h30 la bao chuong if(h==6) { if(p==30) { if(s<=15) { PORTB|=1<<PB0;} } } } }
Comment