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

          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

            Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
            hôm nay, 14:51
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

            Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
            hôm nay, 14:39
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

            Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
            hôm nay, 14:28
          • bqviet
            Trả lời cho Tiếng Anh cho người Việt
            bởi bqviet
            Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
            Hôm qua, 20:26
          • mèomướp
            Trả lời cho Tiếng Anh cho người Việt
            bởi mèomướp
            Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
            Hôm qua, 12:32
          • vi van pham
            Trả lời cho Tiếng Anh cho người Việt
            bởi vi van pham
            Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

            Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
            20-02-2025, 21:31
          • bqviet
            Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
            bởi bqviet
            Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
            20-02-2025, 17:22
          • dinhthuong80
            Trả lời cho Tiếng Anh cho người Việt
            bởi dinhthuong80
            Tiếng Anh, Đình Thường phải nói là rất tệ, khiến việc giao tiếp đời thường thôi cũng khó chứ nói gì về kĩ thuật.

            Nhân tiện, nhờ các bạn, các bác xem giúp thư ĐT viết thế này liệu có thể gửi tới địa chỉ nhận hay chăng,...
            20-02-2025, 11:52
          • vi van pham
            Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
            bởi vi van pham
            Uống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?

            Cái khó bó cái...
            19-02-2025, 23:05
          • nhathung1101
            Trả lời cho Tiếng Anh cho người Việt
            bởi nhathung1101
            Nếu chú tâm thì học tiếng Việt cũng đủ rồi, thừa sức làm việc rồi.

            Học tiếng Anh cũng chỉ phụ trợ để đọc thêm tài liệu, hướng dẫn.

            Nhưng có hiểu điều đó không mới là vấn đề. Khi mà học ngoại ngữ để đi đạp xích lô đón khách???...
            19-02-2025, 21:27
          Đang tải...
          X