Thông báo

Collapse
No announcement yet.

[help] AVR đọc DS1307 sai??

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

  • [help] AVR đọc DS1307 sai??

    em đang làm đồng hồ dùng 4led.
    em có dùng timer để quét led, nhưng vấn đề là khi đọc DS1307 thì lại sai. (phần cừng hoàn toàn đúng, em có test ko dùng timer thì đã ok)
    Mong các bác góp ý.

    Code:
    #include <mega8.h>
    #include <delay.h>
    
    // I2C Bus functions
    #asm
       .equ __i2c_port=0x15 ;PORTC
       .equ __sda_bit=4
       .equ __scl_bit=5
    #endasm
    #include <i2c.h>
    
    // DS1307 Real Time Clock functions
    #include <ds1307.h>
    
    #define S1      PORTB.0
    #define S2      PORTB.1
    #define S3      PORTB.2
    
    unsigned char Font[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    unsigned char a[8];
    unsigned char i=0,n=0;
    unsigned char hour,min,sec;
    //unsigned char day,month,year;
    
    void Display_time()
    {
        rtc_get_time(&hour,&min,&sec);
        a[0] = hour/10;
        a[1] = hour%10;
        a[2] = min/10;
        a[3] = min%10;
             
    }
    //void Display_date()
    //{
    //    rtc_get_time(&day,&month,&year);
    //    a[4] = day/10;
    //    a[5] = day%10;
    //    a[6] = month/10;
    //    a[7] = month%10;     
    //}
    
    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    // Place your code here
    PORTC = 0xFF - (1<<i);
    PORTD = Font[a[i]];
    i++;
    if (i>3) i=0;
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=P State1=P State0=P 
    PORTB=0x07;
    DDRB=0xF8;
    
    // Port C initialization
    // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0x7F;
    
    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x0A;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x07;
    OCR1AL=0xD0;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x10;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // I2C Bus initialization
    i2c_init();
    
    // DS1307 Real Time Clock initialization
    // Square wave output on pin SQW/OUT: Off
    // SQW/OUT pin state: 0
    rtc_init(0,0,0);
    
    // Global enable interrupts
    #asm("sei")
    rtc_set_time(13,18,00);
    //rtc_set_date(20,10,9);
    
    while (1)
          {
          // Place your code here
          Display_time();
          delay_ms(50);
          //Display_date();
          //delay_ms(50);
    
          };
    }

  • #2
    Nguyên văn bởi soulasylum Xem bài viết
    em đang làm đồng hồ dùng 4led.
    em có dùng timer để quét led, nhưng vấn đề là khi đọc DS1307 thì lại sai. (phần cừng hoàn toàn đúng, em có test ko dùng timer thì đã ok)
    Mong các bác góp ý.

    Code:
    #include <mega8.h>
    #include <delay.h>
    
    // I2C Bus functions
    #asm
       .equ __i2c_port=0x15 ;PORTC
       .equ __sda_bit=4
       .equ __scl_bit=5
    #endasm
    #include <i2c.h>
    
    // DS1307 Real Time Clock functions
    #include <ds1307.h>
    
    #define S1      PORTB.0
    #define S2      PORTB.1
    #define S3      PORTB.2
    
    unsigned char Font[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
    unsigned char a[8];
    unsigned char i=0,n=0;
    unsigned char hour,min,sec;
    //unsigned char day,month,year;
    
    void Display_time()
    {
        rtc_get_time(&hour,&min,&sec);
        a[0] = hour/10;
        a[1] = hour%10;
        a[2] = min/10;
        a[3] = min%10;
             
    }
    //void Display_date()
    //{
    //    rtc_get_time(&day,&month,&year);
    //    a[4] = day/10;
    //    a[5] = day%10;
    //    a[6] = month/10;
    //    a[7] = month%10;     
    //}
    
    // Timer 1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    // Place your code here
    PORTC = 0xFF - (1<<i);
    PORTD = Font[a[i]];
    i++;
    if (i>3) i=0;
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port B initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=In Func1=In Func0=In 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=P State1=P State0=P 
    PORTB=0x07;
    DDRB=0xF8;
    
    // Port C initialization
    // Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTC=0x00;
    DDRC=0x7F;
    
    // Port D initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
    PORTD=0x00;
    DDRD=0xFF;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    TCCR0=0x00;
    TCNT0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer 1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x0A;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x07;
    OCR1AL=0xD0;
    OCR1BH=0x00;
    OCR1BL=0x00;
    
    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer 2 Stopped
    // Mode: Normal top=FFh
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;
    
    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    MCUCR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x10;
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    
    // I2C Bus initialization
    i2c_init();
    
    // DS1307 Real Time Clock initialization
    // Square wave output on pin SQW/OUT: Off
    // SQW/OUT pin state: 0
    rtc_init(0,0,0);
    
    // Global enable interrupts
    #asm("sei")
    rtc_set_time(13,18,00);
    //rtc_set_date(20,10,9);
    
    while (1)
          {
          // Place your code here
          Display_time();
          delay_ms(50);
          //Display_date();
          //delay_ms(50);
    
          };
    }
    Bạn phải nói dõ xem nó sai ntn, chứ chỉ bảo nó đọc sai thì khó giúp dc lắm. Mà đoạn code trên là code bạn test không có timer hả không thì mình nhìn qua thấy bạn còn thiếu việc đoc thời gian từ con DS ra đó. Không thì bạn đưa code và mạch nguyên lí len để mọi người giứp cho.

    Comment


    • #3
      đọc thời gian từ con DS thì có trong hàm Display_time() rồi, phần set time cũng có ở ngoài vòng while, lỗi đó là led chỉ hiển thị số 85 05 và đứng yên không chạy.

      Comment


      • #4
        Nguyên văn bởi soulasylum Xem bài viết
        đọc thời gian từ con DS thì có trong hàm Display_time() rồi, phần set time cũng có ở ngoài vòng while, lỗi đó là led chỉ hiển thị số 85 05 và đứng yên không chạy.


        Kiểm tra lại phần khai báo giao tiếp của các chân giữa AVR và DS1307 xem có sai chân không.

        Mạch của bạn sử dụng thạnh anh ngoài hay dùng dao động nội 1MHz cho AVR?
        Last edited by pctcom; 12-09-2010, 00:47.
        PCT COMPUTER
        (Để không làm ảnh hưởng đến thời gian và công việc cá nhân. Xin vui lòng không nhắn tin và điện thoại)

        Comment


        • #5
          Nguyên văn bởi soulasylum Xem bài viết
          đọc thời gian từ con DS thì có trong hàm Display_time() rồi, phần set time cũng có ở ngoài vòng while, lỗi đó là led chỉ hiển thị số 85 05 và đứng yên không chạy.
          mình cũng bị như thế này . ban đầu khi viết code khai báo thạch anh 1M thì chạy ngon lành nhưng khi viết code mới khai báo thạch anh 8M và copy đoạn code này sang thì DS1307 không đọc đúng nữa
          Never forget who you are!

          Comment


          • #6
            Nguyên văn bởi nhquangdt3k5 Xem bài viết
            mình cũng bị như thế này . ban đầu khi viết code khai báo thạch anh 1M thì chạy ngon lành nhưng khi viết code mới khai báo thạch anh 8M và copy đoạn code này sang thì DS1307 không đọc đúng nữa
            cái này do PROTEUS mô phỏng sai. khi làm mạch thật nó vẫn chạy đúng
            Never forget who you are!

            Comment


            • #7
              bị nhiễu đó bạn àh. mình cũng đã gặp trường hợp này
              bạn thử search trên mạng cách chống nhiễu cho ds1307 thử xem

              Comment


              • #8
                Bạn xem các khối khác trong mạch khi kết nối với AVR đã đúng chưa. Lần đầu mình làm vè đề tài hiện thị thời gian thực: dùng avr+ds1307+led7seg+lcd cũng gặp trường hợp đồng hồ không chạy cứ hiện thì số 85, với 65 gì đó, kiểm tra lại thằng bạn nối phần cứng PORT LCD bị sai ( mình làm mềm mà ^^) chỉnh lại đâu đấy, chạy ngon. Mình nghĩ code bạn ko lỗi, bạn xem lại phần cứng đi. chúc thành công!
                Đối với Tôi Đam mê là yếu tố không thể thiếu để quyết định sự Thành Công ...!
                Gmail: -Mobile: 0989.194.472

                Comment


                • #9
                  Nguyên văn bởi thegioi21mas Xem bài viết
                  bị nhiễu đó bạn àh. mình cũng đã gặp trường hợp này
                  bạn thử search trên mạng cách chống nhiễu cho ds1307 thử xem
                  mình dùng thạch anh ngoài 16M mà có bị nhiễu đâu chạy rất chính xác. 1 ngày chạy sai so với cái đồng hồ đeo tay của mình 2s. nếu sợ nhiễu thì nên phủ mát thật nhiều. thạch anh để gần nhất với chân dao động của IC. lọc nguồn tốt. cứ cạnh mỗi chân VCC lại để 1 con tụ 104 nối với GND.
                  Last edited by nhquangdt3k5; 06-06-2011, 15:02.
                  Never forget who you are!

                  Comment


                  • #10
                    Nguyên văn bởi nhquangdt3k5 Xem bài viết
                    mình dùng thạch anh ngoài 16M mà có bị nhiễu đâu chạy rất chính xác. 1 ngày chạy sai so với cái đồng hồ đeo tay của mình 2s. nếu sợ nhiễu thì nên phủ mát thật nhiều. thạch anh để gần nhất với chân dao động của IC. lọc nguồn tốt. cứ cạnh mỗi chân VCC lại để 1 con tụ 104 nối với GND.
                    Ặc,1 ngày sai tới 2s mà còn bảo là chính xác,đồng hồ của mình làm bằng 8952 chạy timer 2 ngày chậm có 1 s mà còn chưa thấy đạt chuẩn


                    email:
                    Giá mà mạch điện tử không có nhiễu (noise) thì mình bây giờ đã là ... đại gia

                    Comment


                    • #11
                      hix AVR hỗ trợ I2C rồi chỉ việc đọc ra và tống lên LCD sao lại không chính xác nhỉ. bạn vào xem ví dụ của ds1307 trong covision đó (ổ C: exsame) nó có đây

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      • mèomướp
                        Trả lời cho Sửa bộ nguồn DC 60V 45A
                        bởi mèomướp
                        Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                        Hôm qua, 13:11
                      • tuyennhan
                        Trả lời cho Sửa bộ nguồn DC 60V 45A
                        bởi tuyennhan
                        Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                        Hôm qua, 09:25
                      • tuyennhan
                        Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                        bởi tuyennhan
                        Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                        Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                        Hôm qua, 09:10
                      • Ng.Phuong.5
                        Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                        bởi Ng.Phuong.5
                        Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                        Mấy con...
                        09-01-2025, 19:44
                      • viettinh
                        Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                        bởi viettinh
                        Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                        Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                        09-01-2025, 18:12
                      • nguyendinhvan
                        Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                        bởi nguyendinhvan
                        Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                        Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                        Cách đơn giản...
                        09-01-2025, 00:04
                      • mèomướp
                        Trả lời cho Sửa bộ nguồn DC 60V 45A
                        bởi mèomướp
                        Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                        08-01-2025, 19:02
                      • tuyennhan
                        Trả lời cho Sửa bộ nguồn DC 60V 45A
                        bởi tuyennhan
                        Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                        08-01-2025, 15:43
                      • tuyennhan
                        Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                        bởi tuyennhan
                        Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                        08-01-2025, 15:28
                      • mèomướp
                        Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                        bởi mèomướp
                        Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                        08-01-2025, 11:44
                      Đang tải...
                      X