اطلاعیه

Collapse
No announcement yet.

کمک در راه اندازی AT24C64 با xmega32a4

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

    #16
    پاسخ : پاسخ : کمک در راه اندازی AT24C64 با xmega32a4

    کد:
    #include<ioavr.h>
    #include<intrinsics.h>
    #include"lcd_4bit.h"
    int a=0,s=0;
    char str[12];
    int main(){
     lcd_init(16,2);
     lcd_clear();
     TWIE_MASTER_CTRLA=0x38;
     TWIE_MASTER_STATUS|=0x01;
     TWIE_MASTER_DATA=0x11;
     TWIE_MASTER_ADDR=0xA3;
     __delay_cycles(1000);
     while((TWIE_MASTER_STATUS&0x50)!=0x40){
      TWIE_MASTER_CTRLC=0x03;
      TWIE_MASTER_DATA=0x11;
      TWIE_MASTER_ADDR=0xA3;
      __delay_cycles(1000);
     }
     lcd_puts_ram("lag");
     while((TWIE_MASTER_STATUS&0x80)!=0x80){
      TWIE_MASTER_ADDR=0xA2;
      __delay_cycles(1000);
     }
     a=TWIE_MASTER_DATA;
     sprintf(str,"data=%d",a);
     lcd_puts_ram(str);
     return 0;
    }

    سلام میشه یه بررسی کلی بکنید بگید اشکال این برنامه چیه؟
    اگه 4-5 بار بورد رو تو همون حالت پروگرام کنم اول 0 و بعد 4 تا عدد نشون میده که همیشه هم ثابته بعدش 0 میشه تو ایپرام پر هست اما نمیدونم چه مقداری توشه مربوط به یه ماژول هست
    حالا نمیدونم این اعداد درسته یا نه اصلا چرا اینطوری میشه
    اگه میشه یه توضیحی در ارتباط با نحوه استفاده از twi این میکرو ها و زمان بندی در مقدار دهی به این رجیستر ها رو توضیح بدید
    با تشکر

    دیدگاه


      #17
      پاسخ : کمک در راه اندازی AT24C64 با xmega32a4

      با کتابخانه twi خود اتمل اگه کار کنی خیلی راحت تر میشه کارت
      یک نگاش بنداز
      هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
      بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
      میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

      تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

      دیدگاه


        #18
        پاسخ : کمک در راه اندازی AT24C64 با xmega32a4

        سلام دوباره
        من مصمم هستم که TWI رو با رجیستر راه اندازی کنم ولی نتیجه عجیب غریبی گرفتم oo:
        کد:
        int main(){
         //configure
         lcd_init(16,2);
         lcd_clear();
         PORTE_PIN0CTRL=0x18;//pull-up
         PORTE_PIN1CTRL=0x18;//pull-up
         TWIE_MASTER_BAUD=5;
         TWIE_MASTER_CTRLA=0x78;//low level/write-read/enable
         TWIE_MASTER_CTRLB=0x01;//smart mode
         //end of configure
         //write
         TWIE_MASTER_STATUS|=0x21;//force idle
         TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
         TWIE_MASTER_DATA=0x11;//eeprom software address
         __delay_cycles(1000);
         while((TWIE_MASTER_STATUS&0x5C)==0x40){
          TWIE_MASTER_CTRLC=0x03;//stop
          TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
          TWIE_MASTER_DATA=0x11;//eeprom software address
          __delay_cycles(1000);
         }
         lcd_puts_ram("TrW1OK");
          TWIE_MASTER_STATUS|=0x21;//force idle
         TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
         TWIE_MASTER_DATA=0x11;//eeprom software address
         __delay_cycles(1000);
         while((TWIE_MASTER_STATUS&0x5C)==0x40){
          TWIE_MASTER_CTRLC=0x03;//stop
          TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
          TWIE_MASTER_DATA=0x11;//eeprom software address
          __delay_cycles(1000);
         }
         lcd_puts_ram("TrW2OK");
          TWIE_MASTER_STATUS|=0x21;//force idle
         TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
         TWIE_MASTER_DATA=83;//eeprom software address
         __delay_cycles(1000);
         while((TWIE_MASTER_STATUS&0x5C)==0x40){
          TWIE_MASTER_CTRLC=0x03;//stop
          TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
          TWIE_MASTER_DATA=83;//eeprom software address
          __delay_cycles(1000);
         }
         lcd_puts_ram("data tarnsfered");
         //end of write
         //read
         __delay_cycles(10000000);
         TWIE_MASTER_STATUS|=0x21;//force idle
         TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
         TWIE_MASTER_DATA=0x11;//eeprom software address
         __delay_cycles(1000);
         while((TWIE_MASTER_STATUS&0x5C)==0x40){
          TWIE_MASTER_CTRLC=0x03;//stop
          TWIE_MASTER_ADDR=0xA3;//eeprom hardware address
          TWIE_MASTER_DATA=0x11;//eeprom software address
          __delay_cycles(1000);
         }
         lcd_puts_ram("TrROK");
         TWIE_MASTER_ADDR=0xA2;
         __delay_cycles(1000);
         while((TWIE_MASTER_STATUS&0xA0)==0xA0){
          TWIE_MASTER_ADDR=0xA2;
          __delay_cycles(1000);
         }
         a=TWIE_MASTER_DATA;
         sprintf(str,"data=%d",a);
         lcd_puts_ram(str);
         //end of read
         return 0;
        }

        راستش من یه سنسور دارم که روش یه ایپرام هست که باید 4 بایت برای کالیبراسیون رو خوند
        برای این کار فقط از قسمت read استفاده کردم
        بار اول دیتای 0 میگرفتم اما بعد از آن بدون خاموش کردن مدار در همان حال میکرو را دوباره پروگرام کردم و با همین پروگرام کردن های پشت سر هم به یه سری عدد و 0 بین اینها رسیدم که مدام تکرار میشوند
        25-72-27-108 بعد یه تعداد 0 و بعد 80-29-83
        از هر آدرسی هم شروع میکنم این نتایج به دست میاد
        قسمت write هم فکر کنم مشکل داره اما نمیدونم کجا و چرا
        کسی میتونه به من کمک کنه تا با register های xmega قسمت i2c رو راه اندازی کنم؟
        با تشکر
        حافظه ها
        24c02
        24c04

        دیدگاه


          #19
          پاسخ : کمک در راه اندازی AT24C64 با xmega32a4

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

          دیدگاه


            #20
            پاسخ : کمک در راه اندازی AT24C64 با xmega32a4

            نوشته اصلی توسط طراح
            یک روش سریع برای به نتیجه رسیدن این است که بررسی کنید کدهای منطبق بر کتابخانه اتمل، روی چه رجیسترهایی عمل می کنند و شما هم بر همان اساس رجیسترها را برنامه ریزی کنید.
            راستش کتابخانه های اتمل از یه سری struct استفاده میکرد که جاشو پیدا نکردم در عوض کلا کدم رو پاک کردم و از اول نوشتم بالاخره هم جواب داد
            این دو تا تابع خدمتتون باشه فعلا:



            برای نوشتن یک بایت توی یه آدرس مشخص
            کد:
            void eeprom_bytewrite(uint8_t SlaveAddress,uint8_t MemoryAddress,uint8_t Data){
             TWIC_MASTER_STATUS|=0x01;
             SlaveAddress=SlaveAddress<<1;
             TWIC_MASTER_ADDR=SlaveAddress;
             while(!(TWIC_MASTER_STATUS & 0x40));
             TWIC_MASTER_DATA=MemoryAddress;
             while(!(TWIC_MASTER_STATUS & 0x40));
             TWIC_MASTER_DATA=Data;
             while(!(TWIC_MASTER_STATUS & 0x40));
             TWIC_MASTER_CTRLC=0x03;
            }



            برای خواندن یک بایت از یه آدرس مشخص
            کد:
            uint8_t eeprom_byteread(uint8_t SlaveAddress,uint8_t MemoryAddress){
             TWIC_MASTER_STATUS|=0x01;//force idle
             SlaveAddress=SlaveAddress<<1;
             TWIC_MASTER_ADDR=SlaveAddress;
             while(!(TWIC_MASTER_STATUS & 0x40));
             TWIC_MASTER_DATA=MemoryAddress;
             while(!(TWIC_MASTER_STATUS & 0x40));
             TWIC_MASTER_ADDR=(SlaveAddress | 1);
             while(!(TWIC_MASTER_STATUS & 0xC0));
             return TWIC_MASTER_DATA;
             TWIC_MASTER_CTRLC=0x06;
            }


            [hr]
            اینم یه نمونه برنامه با این توابع(قسمت main)
            کد:
            int main()
            {
             lcd_init(16,2);
             lcd_clear();
             PORTC_PIN0CTRL=0x18;
             PORTC_PIN1CTRL=0x18;
             TWIC_MASTER_BAUD=5;
             TWIC_MASTER_CTRLA|=0x38;//enable/WIF/RIF
             eeprom_bytewrite(0x50,0,12);
             eeprom_bytewrite(0x50,1,24);
             eeprom_bytewrite(0x50,2,36);
             //read
             a=eeprom_byteread(0x50,1);
             sprintf(str,"data=%d",a);
             lcd_puts_ram(str);
             return 0;
            }

            میتونید اون C رو به D یا E تغییر بدید و از twi روی پورت های دیگه استفاده کنید
            در ضمن دیگه به مقاومت pull-up خارجی نیازی نیست تو برنامه اصلی تعریف کردم(اگر از این برنامه استفاده میکنید)
            امیدوارم مفید بوده باشه

            دیدگاه

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