Thông báo

Collapse
No announcement yet.

Giúp đỡ lỗi mạch đồng hồ số dùng ngắt Timer và ngắt ngoài (gấp)

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp đỡ lỗi mạch đồng hồ số dùng ngắt Timer và ngắt ngoài (gấp)

    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
    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;}
    		}
    	 }
    	 
       }
    }

  • #2
    Chào bạn!!! Bạn bỏ một cái ngắt ngoài đi nhá!!!
    MCUCR|=(1<<ISC11)|(1<<ISC01);// Ca 2 la ngat canh xuong
    GICR|=(1<<INT1)|(1<<INT0);//cho phep 2 ngat hoat dong


    thành
    MCUCR|=(1<<ISC01);// Ca 2 la ngat canh xuong
    GICR|=(1<<INT0);//cho phep 2 ngat hoat dong
    là OK thôi. Đúng là cái nút OK của bạn trở thành nút reset. Cái này là do trình dịch winavr quy định, nếu muốn biết tại sao thì xem http://www.nongnu.org/avr-libc/user-...nterrupts.html

    Comment


    • #3
      Nguyên văn bởi enter88 Xem bài viết
      Chào bạn!!! Bạn bỏ một cái ngắt ngoài đi nhá!!!
      MCUCR|=(1<<ISC11)|(1<<ISC01);// Ca 2 la ngat canh xuong
      GICR|=(1<<INT1)|(1<<INT0);//cho phep 2 ngat hoat dong


      thành
      MCUCR|=(1<<ISC01);// Ca 2 la ngat canh xuong
      GICR|=(1<<INT0);//cho phep 2 ngat hoat dong
      là OK thôi. Đúng là cái nút OK của bạn trở thành nút reset. Cái này là do trình dịch winavr quy định, nếu muốn biết tại sao thì xem http://www.nongnu.org/avr-libc/user-...nterrupts.html

      Bác quá pro, chuẩn luôn! Không biết thanks thế nào cho hết
      Vậy mà mình kiếm hoài ko ra lỗi, sơ suất sơ suất . Amateur mà

      Comment


      • #4
        Hì. Cám ơn bạn chung_pro_tb nhiều nha. Mình đang học phần timer và cũng đang làm một cái đồng hồ thời gian thực như bạn dùng timer và ngắt chứ ko dùng DS1307. Mình cũng đang gặp một số vướng mắc về code. Bạn lại cũng viết bằng AVR studio nữa chứ.hì. Thật là sướng quá.

        Comment


        • #5
          Nguyên văn bởi chung_pro_tb Xem bài viết
          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
          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;
          }
          
          
          
          
          }
          }
          b giải thích cho e cái chỗ PORTD|= được không

          Comment

          Về tác giả

          Collapse

          chung_pro_tb Tìm hiểu thêm về chung_pro_tb

          Bài viết mới nhất

          Collapse

          Đang tải...
          X