Thông báo

Collapse
No announcement yet.

Giao tiếp i2c với Atmega16/32 bị đứng...

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

  • Giao tiếp i2c với Atmega16/32 bị đứng...

    Các cao thủ không biết có gặp hiện tượng này chưa...
    Mình giao tiếp DS1307 với Atmeg32 , sd trinh biên dịch codevision 2.3.0 khi sử dụng hàm trong thư viện ds1307(vd rtc_get_time(&hour,&min,&sec), rtc_int()...) thì các PORT xuất nhập không còn sử dụng được nữa .
    Đã kiểm tra nhiều khả năng VD: thay chíp mơí , dùng mạch mới , set lại các fúe bit nhưng vẫn không tìm được nguyên nhân..
    Code:
    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.03.4 Standard
    Automatic Program Generator
    © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com
    
    Project : 
    Version : 
    Date    : 8/7/2012
    Author  : 
    Company : 
    Comments: 
    
    
    Chip type           : ATmega32L
    Program type        : Application
    Clock frequency     : 8.000000 MHz
    Memory model        : Small
    External RAM size   : 0
    Data Stack size     : 512
    *****************************************************/
    
    #include <mega32.h>
    
    // I2C Bus functions
    #asm
       .equ __i2c_port=0x1B ;PORTA
       .equ __sda_bit=0
       .equ __scl_bit=1
    #endasm
    #include <i2c.h>
    
    // DS1307 Real Time Clock functions
    #include <ds1307.h>
     unsigned char hour,min,sec;
    // Timer 0 overflow interrupt service routine
    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
    {
    // Reinitialize Timer 0 value
    TCNT0=0x83;
    // Place your code here
    
    }
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    
    // Input/Output Ports initialization
    // Port A initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTA=0x00;
    DDRA=0x00;
    
    // Port B 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 
    PORTB=0x00;
    DDRB=0xFF;
    
    // Port C initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTC=0x00;
    DDRC=0x00;
    
    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
    PORTD=0x00;
    DDRD=0x00;
    
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x83;
    OCR0=0x00;
    
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer 1 Stopped
    // Mode: Normal top=FFFFh
    // 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: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    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
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;
    
    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x01;
    
    // 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: On
    // Square wave frequency: 1Hz
    
    
    // Global enable interrupts
    #asm("sei")
    rtc_init(0,1,0);
    while (1)
          {
           rtc_get_time(&hour,&min,&sec);
            PORTB=0xFF;
          };
    }
    nếu bỏ rtc_get_time(&hour,&min,&sec);rtc_init(0,1,0); thì PORTB xuất đúng PORTB xuất mức 1,...
    Last edited by hohoanganhfu; 08-08-2012, 00:58.

  • #2
    nếu code của bác chính là cái code kia thì nó đứng yên là chuẩn rồi. vòng while có mỗi lênh PORTB=0xff.kết thúc while có dấu ; nó xuất giá trị 0xff trên B rồi ko làm gì nữa.
    Bạn xem lại code nhé
    Nguyễn Huy Biên - 01649 802 694
    gmail :

    Comment


    • #3
      code này để mình test thui...
      dấu kết thúc while bằng dấu ";" vòng lặp While(1) vẫn lặp vô tận.

      Mình khó hiểu là khi bỏ rtc_get_time(&hour,&min,&sẹc);rtc_init(0,1,0); thì xuất nhập bình thường, lúc trước mình cũng làm cái này nhưng bằng con atmega8 thì bình thường....

      Comment


      • #4
        Nếu bản codevison mới nó thì hàm rtc_get_time() nó có thêm biến tuần. bạn thử thêm 1 biến nữa vào đi rtc_get_time(&h,&m,&s,&w)
        0
        Nguyễn Huy Biên - 01649 802 694
        gmail :

        Comment


        • #5
          không ăn thua, mình sài bản 2.3.4 không có biến tuần, biên dịch thì không có lổi gì, mô phỏng protúe ok...
          Cứ sd ìc là các PORT không xuất nhập được...điên đầu thật, lúc trước làm giao tiếp DS1307 với Atmega8 thì không có vấn đề gì...
          không biết phải fúe bit không. mình thử nhiều khả năng rùi mà không được..
          Last edited by hohoanganhfu; 08-08-2012, 17:14.

          Comment


          • #6
            Nguyên văn bởi hohoanganhfu Xem bài viết
            Các cao thủ không biết có gặp hiện tượng này chưa...
            Mình giao tiếp DS1307 với Atmeg32 , sd trinh biên dịch codevision 2.3.0 khi sử dụng hàm trong thư viện ds1307(vd rtc_get_time(&hour,&min,&sec), rtc_int()...) thì các PORT xuất nhập không còn sử dụng được nữa .
            Đã kiểm tra nhiều khả năng VD: thay chíp mơí , dùng mạch mới , set lại các fúe bit nhưng vẫn không tìm được nguyên nhân..
            Code:
            /*****************************************************
            This program was produced by the
            CodeWizardAVR V2.03.4 Standard
            Automatic Program Generator
            © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
            http://www.hpinfotech.com
            
            Project : 
            Version : 
            Date    : 8/7/2012
            Author  : 
            Company : 
            Comments: 
            
            
            Chip type           : ATmega32L
            Program type        : Application
            Clock frequency     : 8.000000 MHz
            Memory model        : Small
            External RAM size   : 0
            Data Stack size     : 512
            *****************************************************/
            
            #include <mega32.h>
            
            // I2C Bus functions
            #asm
               .equ __i2c_port=0x1B ;PORTA
               .equ __sda_bit=0
               .equ __scl_bit=1
            #endasm
            #include <i2c.h>
            
            // DS1307 Real Time Clock functions
            #include <ds1307.h>
             unsigned char hour,min,sec;
            // Timer 0 overflow interrupt service routine
            interrupt [TIM0_OVF] void timer0_ovf_isr(void)
            {
            // Reinitialize Timer 0 value
            TCNT0=0x83;
            // Place your code here
            
            }
            
            // Declare your global variables here
            
            void main(void)
            {
            // Declare your local variables here
            
            // Input/Output Ports initialization
            // Port A initialization
            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTA=0x00;
            DDRA=0x00;
            
            // Port B 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 
            PORTB=0x00;
            DDRB=0xFF;
            
            // Port C initialization
            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTC=0x00;
            DDRC=0x00;
            
            // Port D initialization
            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTD=0x00;
            DDRD=0x00;
            
            // Timer/Counter 0 initialization
            // Clock source: System Clock
            // Clock value: Timer 0 Stopped
            // Mode: Normal top=FFh
            // OC0 output: Disconnected
            TCCR0=0x00;
            TCNT0=0x83;
            OCR0=0x00;
            
            // Timer/Counter 1 initialization
            // Clock source: System Clock
            // Clock value: Timer 1 Stopped
            // Mode: Normal top=FFFFh
            // 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: Off
            // Compare B Match Interrupt: Off
            TCCR1A=0x00;
            TCCR1B=0x00;
            TCNT1H=0x00;
            TCNT1L=0x00;
            ICR1H=0x00;
            ICR1L=0x00;
            OCR1AH=0x00;
            OCR1AL=0x00;
            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
            // INT2: Off
            MCUCR=0x00;
            MCUCSR=0x00;
            
            // Timer(s)/Counter(s) Interrupt(s) initialization
            TIMSK=0x01;
            
            // 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: On
            // Square wave frequency: 1Hz
            
            
            // Global enable interrupts
            #asm("sei")
            rtc_init(0,1,0);
            while (1)
                  {
                   rtc_get_time(&hour,&min,&sec);
                    PORTB=0xFF;
                  };
            }
            nếu bỏ rtc_get_time(&hour,&min,&sec);rtc_init(0,1,0); thì PORTB xuất đúng PORTB xuất mức 1,...
            Với code của bạn viết thì bạn đã chắc chắn là lấy được thời gian chưa? Theo mình thì code của bạn đang dừng ở lệnh rtc_get_time(&hour,&min,&sec);
            Khi giao tiếp I2C có đoạn code đợi bit TWINT=1. Có thể con DS1307 bị lỗi nên chưa thoát ra khỏi đoạn này. Cho nên chưa thực hiện đc lệnh xuất PORTB.
            Sống là để chiến đấu

            Comment


            • #7
              Để mình xem lại coi sao, khi mình sd bất kỳ lệnh nào liên quan tới i2c thì các PORT đều bị đứng, không xuất nhập được...
              Mình giao tiếp i2c sd toàn thư viện của cvs nên còn chưa hiểu về cách thức truyền nhận lắm...
              Last edited by hohoanganhfu; 10-08-2012, 01:41.

              Comment

              Về tác giả

              Collapse

              hohoanganhfu Trường ĐH khoa Hoc Tự Nhiên Tìm hiểu thêm về hohoanganhfu

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

              Collapse

              Đang tải...
              X