اطلاعیه

Collapse
No announcement yet.

ارتباط XMEGA با DS1307 در Codevision

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ارتباط XMEGA با DS1307 در Codevision

    سلام
    ممکنه اساتید من رو راهنمایی کنند. هیچ دیتایی از DS1307 نمی گیرم :cry2:
    پین های ارتباطی رو هم با 10 کیلو به 3.3 ولت وصل کردم، به 5 ولت هم وصل کردم فرقی نکرد.
    اینم کل برنامه
    کد:
    /*****************************************************
    Chip type        : ATxmega32A4
    Program type      : Application
    AVR Core Clock frequency: 32.000000 MHz
    Memory model      : Small
    Data Stack size     : 1024
    *****************************************************/
    
    #include <io.h>
    #include <twix.h>
    #include <alcd.h>
    #include <delay.h>
    #include <bcd.h> 
    #include <stdio.h>
    
    #define byte unsigned char
    
    // Declare your global variables here
    struct {
      byte sec;
      byte minute;
      byte hour;
      byte day_week;
      byte day;
      byte month;
      byte year;
      }t_d;   
    
    // System Clocks initialization
    void system_clocks_init(void)
    {
    unsigned char n,s;
    
    // Optimize for speed
    #pragma optsize- 
    // Save interrupts enabled/disabled state
    s=SREG;
    // Disable interrupts
    #asm("cli")
    
    // Internal 32 kHz RC oscillator initialization
    // Enable the internal 32 kHz RC oscillator
    OSC.CTRL|=OSC_RC32KEN_bm;
    // Wait for the internal 32 kHz RC oscillator to stabilize
    while ((OSC.STATUS & OSC_RC32KRDY_bm)==0);
    
    // Internal 32 MHz RC oscillator initialization
    // Enable the internal 32 MHz RC oscillator
    OSC.CTRL|=OSC_RC32MEN_bm;
    
    // System Clock prescaler A division factor: 1
    // System Clock prescalers B & C division factors: B:1, C:1
    // ClkPer4: 32000.000 kHz
    // ClkPer2: 32000.000 kHz
    // ClkPer: 32000.000 kHz
    // ClkCPU: 32000.000 kHz
    n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) |
    	CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;
    CCP=CCP_IOREG_gc;
    CLK.PSCTRL=n;
    
    // Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
    OSC.DFLLCTRL&= ~(OSC_RC32MCREF_bm | OSC_RC2MCREF_bm);
    // Enable the autocalibration of the internal 32 MHz RC oscillator
    DFLLRC32M.CTRL|=DFLL_ENABLE_bm;
    
    // Wait for the internal 32 MHz RC oscillator to stabilize
    while ((OSC.STATUS & OSC_RC32MRDY_bm)==0);
    
    // Select the system clock source: 32 MHz Internal RC Osc.
    n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_RC32M_gc;
    CCP=CCP_IOREG_gc;
    CLK.CTRL=n;
    
    // Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
    OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);
    
    // Peripheral Clock output: Disabled
    PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | PORTCFG_CLKOUT_OFF_gc;
    
    // Restore interrupts enabled/disabled state
    SREG=s;
    // Restore optimization for size if needed
    #pragma optsize_default
    }
    
    
    TWI_MASTER_INFO_t twie_master;
    
    void twie_init(void)
    {
    // General TWIE initialization
    // External Driver Interface: Off
    // SDA Hold: Off
    twi_init(&TWIE,false,false);
    
    // TWIE Master initialization
    // Master interrupt: Low Level
    // System Clock frequency: 32000000 Hz
    // SCL Rate: 100000 bps
    // Real SCL Rate: 100000 bps, Error: 0.0 %
    twi_master_init(&twie_master,&TWIE,TWI_MASTER_INTLVL_LO_gc,
      TWI_BAUD_REG(32000000,100000));
    
    // TWIE Slave is disabled
    TWIE.SLAVE.CTRLA=0;
    }
    
    // TWIE Master interrupt service routine
    #pragma optsize- // optimize for speed
    interrupt [TWIE_TWIM_vect] void twie_master_isr(void)
    {
    twi_master_int_handler(&twie_master);
    }
    #pragma optsize_default
    
    
    void main(void)
    {
    unsigned char n;
    #pragma optsize- 
    #asm("cli")
    // Low level interrupt: On
    // Round-robin scheduling for low level interrupt: On
    // Medium level interrupt: Off
    // High level interrupt: Off
    // The interrupt vectors will be placed at the start of the Application FLASH section
    n=(PMIC.CTRL & (~(PMIC_RREN_bm | PMIC_IVSEL_bm | PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm))) |
    	PMIC_LOLVLEN_bm | PMIC_RREN_bm;
    CCP=CCP_IOREG_gc;
    PMIC.CTRL=n;
    // Set the default priority for round-robin scheduling
    PMIC.INTPRI=0x00;
    // Restore optimization for size if needed
    #pragma optsize_default
    
    system_clocks_init();
    twie_init();
    lcd_init(20);
    
    #asm("sei")
    
    PORTD.DIRSET=(1<<2); // led out
    
    lcd_putsf(" Microware\nThis is DS1307 Test");
    while (1)
       {  
       char buf[100],res;                
       res=twi_master_trans(&twie_master,0xd0,0,0,(byte*)&t_d,7);
       sprintf(buf," %02u/%02u/%02u %02u:%02u:%02u\n%p  ",bcd2bin(t_d.year),bcd2bin(t_d.month)
        ,bcd2bin(t_d.day),bcd2bin(t_d.hour),bcd2bin(t_d.minute),bcd2bin(t_d.sec),(res)?"ok":"error");
       lcd_gotoxy(0,2);
       lcd_puts(buf);
       PORTD.OUTTGL=(1<<2); //led blinking
       delay_ms(300); 
       }
    }
    زندگي را تو بساز ،
    نه بدان ساز که سازند و پذيري بي حرف ،
    زندگي يعني جنگ ، تو بجنگ ،
    زندگي يعني عشق ، تو بدان عشق بورز.

    #2
    پاسخ : ارتباط XMEGA با DS1307 در Codevision

    برنامه رو به این صورت هم تغییر دادم ولی فرقی نکرد
    کد:
    byte addr=0;                
    res=twi_master_trans(&twie_master,0xd0,&addr,1,(byte*)&t_d,5);
    جناب کی نژاد لطفا راهنمایی بفرمایید
    زندگي را تو بساز ،
    نه بدان ساز که سازند و پذيري بي حرف ،
    زندگي يعني جنگ ، تو بجنگ ،
    زندگي يعني عشق ، تو بدان عشق بورز.

    دیدگاه


      #3
      پاسخ : ارتباط XMEGA با DS1307 در Codevision

      صرف نظر از بقیه کد (که روی جزئیات آن دقت نکردم)، در تابع twi_master_trans برای ds1307 باید آدرس slave را بجای 0xd0 عدد 0x68 قرار دهید.
      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه


        #4
        پاسخ : ارتباط XMEGA با DS1307 در Codevision

        خدا خیرتون بده
        خیلی خیلی متشکرم از شما استاد مشکلم حل شد :wow:
        زندگي را تو بساز ،
        نه بدان ساز که سازند و پذيري بي حرف ،
        زندگي يعني جنگ ، تو بجنگ ،
        زندگي يعني عشق ، تو بدان عشق بورز.

        دیدگاه


          #5
          پاسخ : ارتباط XMEGA با DS1307 در Codevision

          سلام
          من این برنامه را در GCC نوشتم و فعلا برای تست میخوام پایه SQW/OUT را یک کنم . اما موفق نشدم.
          پایه های SCL و SDA و OUT را هم با مقاومت 4.7 کیلو به 3.3 ولت وصل کردم و با 330 اهم سری کردم.
          ممنون می‌شوم کمکم کنید
          کد:
          #include <avr/io.h>
          #define F_CPU 2000000UL
          #include <util/delay.h>
          int main(void)
          {
          	_delay_ms(1000);
          	TWIC.MASTER.BAUD=0x0F;
          	TWIC.MASTER.CTRLC=TWI_MASTER_CMD_REPSTART_gc;
          	TWIC.MASTER.CTRLA=TWI_MASTER_ENABLE_bm;
          	TWIC.MASTER.STATUS=0xff;
          	
          	TWIC.MASTER.ADDR=0b11010000;//write into DS1307
          	while(!(TWI_MASTER_WIF_bm&TWIC.MASTER.STATUS));
          	TWIC.MASTER.DATA=0x07;
          	while(!(TWI_MASTER_WIF_bm&TWIC.MASTER.STATUS));
          	TWIC.MASTER.DATA=0b10000000;	
          	while(!(TWI_MASTER_WIF_bm&TWIC.MASTER.STATUS));
          
            while(1)
            {
          		
            }
          }
          تغذیه خود DS1307 هم 5V هست.

          دیدگاه


            #6
            پاسخ : پاسخ : ارتباط XMEGA با DS1307 در Codevision

            من به جزئیات کد دقت نکردم. اما به احتمال زیاد پاسخی که به دوست قبلی داده شد شامل حال شما هم باشد:

            نوشته اصلی توسط طراح
            باید آدرس slave را بجای 0xd0 عدد 0x68 قرار دهید.
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              #7
              پاسخ : ارتباط XMEGA با DS1307 در Codevision

              خیلی ممنونم بخاطر جوابتان
              من در برنامه تغییراتی دادم
              العان می‌تونم در DS1307 بنویسم اما هنوز در خواندن مشکل دارم
              از درست بودن ادرس اطمینان دارم (در سری مگا جواب گرفتم)
              در زیر حلقه while رو که در آن قصد خواندن ثانیه از DS رو دارم قرار میدهم.
              ممنون میشم راهنماییم کنید.
              کد زیر یک بار از DS می خواند ، اما بعد از آن دیگر کار نمی کند. فکر می کنم مشکل از عدم ارسال STOP در انتهای خواندن می باشد. دقیقا نمی دانم برای ارسال STOP باید کدام رجیستر ها را مقدار دهی کنم؟
              کد:
                while(1)
                {
              		TWIC.MASTER.ADDR = 0b11010000;
              		while(!(TWIC.MASTER.STATUS & 64));
              		
              		TWIC.MASTER.DATA = 0x00;
              		while(!(TWIC.MASTER.STATUS & 64));
              		
              		TWIC.MASTER.CTRLC = 0X03;
              		
              		TWIC.MASTER.ADDR = 0b11010001;
              		while(!(TWIC.MASTER.STATUS & 128));
              		PORTA.OUT=TWIC.MASTER.DATA
              		//TWIC.MASTER.CTRLC = 0X03;
              		_delay_ms(500);
              	}
              تنظیمات TWI در ابتدای برنامه :
              TWIC.MASTER.BAUD = 0x90;
              TWIC.MASTER.CTRLA |= 0xD8;
              TWIC.MASTER.STATUS |= 0x01;

              __________________________________________________ __________________
              همان طور که حدث می زدم مشکل از ارسال STOP condition بود و مشکل برطرف شد.
              بزودی نمونه برنامه را در تاپیک نمونه کدها قرار میدم
              با تشکر از جناب طراح بخاطر راهنماییشان.

              دیدگاه


                #8
                پاسخ : ارتباط XMEGA با DS1307 در Codevision

                نوشته اصلی توسط microware نمایش پست ها
                سلام
                ممکنه اساتید من رو راهنمایی کنند. هیچ دیتایی از DS1307 نمی گیرم :cry2:
                پین های ارتباطی رو هم با 10 کیلو به 3.3 ولت وصل کردم، به 5 ولت هم وصل کردم فرقی نکرد.
                اینم کل برنامه
                کد:
                /*****************************************************
                Chip type        : ATxmega32A4
                Program type      : Application
                AVR Core Clock frequency: 32.000000 MHz
                Memory model      : Small
                Data Stack size     : 1024
                *****************************************************/
                
                #include <io.h>
                #include <twix.h>
                #include <alcd.h>
                #include <delay.h>
                #include <bcd.h> 
                #include <stdio.h>
                
                #define byte unsigned char
                
                // Declare your global variables here
                struct {
                  byte sec;
                  byte minute;
                  byte hour;
                  byte day_week;
                  byte day;
                  byte month;
                  byte year;
                  }t_d;   
                
                // System Clocks initialization
                void system_clocks_init(void)
                {
                unsigned char n,s;
                
                // Optimize for speed
                #pragma optsize- 
                // Save interrupts enabled/disabled state
                s=SREG;
                // Disable interrupts
                #asm("cli")
                
                // Internal 32 kHz RC oscillator initialization
                // Enable the internal 32 kHz RC oscillator
                OSC.CTRL|=OSC_RC32KEN_bm;
                // Wait for the internal 32 kHz RC oscillator to stabilize
                while ((OSC.STATUS & OSC_RC32KRDY_bm)==0);
                
                // Internal 32 MHz RC oscillator initialization
                // Enable the internal 32 MHz RC oscillator
                OSC.CTRL|=OSC_RC32MEN_bm;
                
                // System Clock prescaler A division factor: 1
                // System Clock prescalers B & C division factors: B:1, C:1
                // ClkPer4: 32000.000 kHz
                // ClkPer2: 32000.000 kHz
                // ClkPer: 32000.000 kHz
                // ClkCPU: 32000.000 kHz
                n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) |
                    CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;
                CCP=CCP_IOREG_gc;
                CLK.PSCTRL=n;
                
                // Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
                OSC.DFLLCTRL&= ~(OSC_RC32MCREF_bm | OSC_RC2MCREF_bm);
                // Enable the autocalibration of the internal 32 MHz RC oscillator
                DFLLRC32M.CTRL|=DFLL_ENABLE_bm;
                
                // Wait for the internal 32 MHz RC oscillator to stabilize
                while ((OSC.STATUS & OSC_RC32MRDY_bm)==0);
                
                // Select the system clock source: 32 MHz Internal RC Osc.
                n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_RC32M_gc;
                CCP=CCP_IOREG_gc;
                CLK.CTRL=n;
                
                // Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
                OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);
                
                // Peripheral Clock output: Disabled
                PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | PORTCFG_CLKOUT_OFF_gc;
                
                // Restore interrupts enabled/disabled state
                SREG=s;
                // Restore optimization for size if needed
                #pragma optsize_default
                }
                
                
                TWI_MASTER_INFO_t twie_master;
                
                void twie_init(void)
                {
                // General TWIE initialization
                // External Driver Interface: Off
                // SDA Hold: Off
                twi_init(&TWIE,false,false);
                
                // TWIE Master initialization
                // Master interrupt: Low Level
                // System Clock frequency: 32000000 Hz
                // SCL Rate: 100000 bps
                // Real SCL Rate: 100000 bps, Error: 0.0 %
                twi_master_init(&twie_master,&TWIE,TWI_MASTER_INTLVL_LO_gc,
                  TWI_BAUD_REG(32000000,100000));
                
                // TWIE Slave is disabled
                TWIE.SLAVE.CTRLA=0;
                }
                
                // TWIE Master interrupt service routine
                #pragma optsize- // optimize for speed
                interrupt [TWIE_TWIM_vect] void twie_master_isr(void)
                {
                twi_master_int_handler(&twie_master);
                }
                #pragma optsize_default
                
                
                void main(void)
                {
                unsigned char n;
                #pragma optsize- 
                #asm("cli")
                // Low level interrupt: On
                // Round-robin scheduling for low level interrupt: On
                // Medium level interrupt: Off
                // High level interrupt: Off
                // The interrupt vectors will be placed at the start of the Application FLASH section
                n=(PMIC.CTRL & (~(PMIC_RREN_bm | PMIC_IVSEL_bm | PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm))) |
                    PMIC_LOLVLEN_bm | PMIC_RREN_bm;
                CCP=CCP_IOREG_gc;
                PMIC.CTRL=n;
                // Set the default priority for round-robin scheduling
                PMIC.INTPRI=0x00;
                // Restore optimization for size if needed
                #pragma optsize_default
                
                system_clocks_init();
                twie_init();
                lcd_init(20);
                
                #asm("sei")
                
                PORTD.DIRSET=(1<<2); // led out
                
                lcd_putsf(" Microware\nThis is DS1307 Test");
                while (1)
                   {  
                   char buf[100],res;                
                   res=twi_master_trans(&twie_master,0xd0,0,0,(byte*)&t_d,7);
                   sprintf(buf," %02u/%02u/%02u %02u:%02u:%02u\n%p  ",bcd2bin(t_d.year),bcd2bin(t_d.month)
                    ,bcd2bin(t_d.day),bcd2bin(t_d.hour),bcd2bin(t_d.minute),bcd2bin(t_d.sec),(res)?"ok":"error");
                   lcd_gotoxy(0,2);
                   lcd_puts(buf);
                   PORTD.OUTTGL=(1<<2); //led blinking
                   delay_ms(300); 
                   }
                }

                سلام دوست عزیز
                شما در این کد یک structure تعریف کردین و در تابع twi عناصر این structure را مقدار دهی کردین.
                من از نمونه کد شما استفاده کرم و جواب گرفتم.
                حالا میخوام برای ارتباط سریال usart هم چنین تابعی بنویسم.
                یعنی تابعی بنویسم که با اون تابع تعداد بایت مورد نیاز را از اسلیو بگیرم و در یک structure ذخیره کنم.
                اما متاسفانه نحوه کد نویسی این تابع را نمیدونم.
                میشه راهنماییم کنین؟؟؟
                از دوستان دیگر هم اگر کسی چنین تابعی برای usart نوشته لطفا راهنماییم کنین

                با تشکر از زحمات همگی دوستان

                دیدگاه

                لطفا صبر کنید...
                X