اطلاعیه

Collapse
No announcement yet.

کار با eeprom داخلی atmega16

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

    کار با eeprom داخلی atmega16

    سلام،دوستان برای ذخیره زمان در eeprom داخلی میکرو چه باید کرد؟مثلا یه تایمری نوشته شده این زمان در حافظه ذخیره بشه و وقتی برق رفت و باز اومد میکرو ادامه همون زمان رو پیش بگیره و کارشو ادامه بده،ممنون میشم اگه کدی،یا راهنمایی کنید تا اینو انجام بدم

    #2
    پاسخ : کار با eeprom داخلی atmega16

    سلام...تو چه کامپایلری؟

    دیدگاه


      #3
      پاسخ : کار با eeprom داخلی atmega16

      این راحل مناسبی نیست.زمان یک کمیت پیوسته است . خوب زمان ذخیره بشه برق هم بره و دوباره بیاد. خوب زمان ذخیره شده دقیقا چه مفهومی داره ؟ شما به یک واحد RTC نیاز دارید.
      تنها موردي كه همه آدما يقين دارن خدا در حقش زیاد لطف کرده
      داشتن عقله زيادتر از دیگر آدم ها است

      دیدگاه


        #4
        پاسخ : کار با eeprom داخلی atmega16

        کمی در مورد مدار توضیح بدید ، چون شما نمیتونید مدام در ایپرام چیزی ذخیره کنید ، به دلیل محدودیت عمر این حافظه ، باید یک راهکار بهتری انتخاب بشه ،

        دیدگاه


          #5
          پاسخ : کار با eeprom داخلی atmega16

          نوشته اصلی توسط aliila نمایش پست ها
          این راحل مناسبی نیست.زمان یک کمیت پیوسته است . خوب زمان ذخیره بشه برق هم بره و دوباره بیاد. خوب زمان ذخیره شده دقیقا چه مفهومی داره ؟ شما به یک واحد RTC نیاز دارید.
          خیلی ممنون،پس باید از rtc استفاده کنم،فک کردم میشه این کارو کرد و زمان و ذخیره کرد

          دلیل: ادغام دو پست برای جلوگیری از اسپم

          نوشته اصلی توسط Masood Ashoori نمایش پست ها
          کمی در مورد مدار توضیح بدید ، چون شما نمیتونید مدام در ایپرام چیزی ذخیره کنید ، به دلیل محدودیت عمر این حافظه ، باید یک راهکار بهتری انتخاب بشه ،
          میخواستم زمان رو ذخیره کنم که با رفتن برق میکرو کارای خودشو طبق زمان انجام بده

          دیدگاه


            #6
            پاسخ : کار با eeprom داخلی atmega16

            ببینید eeprom خای داخلی میکرو تقریبا 10000 بار قابلیت خوندن و نوشتن دارند به دلیل کلا ک بالا میکرو باید پروسه رو جوری تنظیم کنید که این 10000 بار زود تموم نشه. ای سی های EEPROM خارجی هم بین صدهزار بار تا یک میلیون بار متغیر هستند. برای نوشتن توی EEPROM داخلی در کد ویژن یک متغیر رو از نوع EEPROM تعریف کنید و مقدار رو بریزید داخلش دقیقا مثل یک متغیر مثلا int باهاش رفتار کنید. مثلا من متغیر زیر رو از نوع long انتخاب کردم و مقدارش رو هم صفر قرار دادم بعد توی برنامه ام میام و هرجا خواستم بهش مقدار جدید میدم. متغیر من هم توی برنامه ام از نوع گلوبال هست البته شما مختارید گلوبال یا لوکال تعریفش کنید فرقی هم نداره زیاد
            eeprom unsigned long I_EEPROM=0
            گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
            همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

            دیدگاه


              #7
              پاسخ : کار با eeprom داخلی atmega16

              نوشته اصلی توسط amin20107 نمایش پست ها
              ببینید eeprom خای داخلی میکرو تقریبا 10000 بار قابلیت خوندن و نوشتن دارند به دلیل کلا ک بالا میکرو باید پروسه رو جوری تنظیم کنید که این 10000 بار زود تموم نشه. ای سی های EEPROM خارجی هم بین صدهزار بار تا یک میلیون بار متغیر هستند. برای نوشتن توی EEPROM داخلی در کد ویژن یک متغیر رو از نوع EEPROM تعریف کنید و مقدار رو بریزید داخلش دقیقا مثل یک متغیر مثلا int باهاش رفتار کنید. مثلا من متغیر زیر رو از نوع long انتخاب کردم و مقدارش رو هم صفر قرار دادم بعد توی برنامه ام میام و هرجا خواستم بهش مقدار جدید میدم. متغیر من هم توی برنامه ام از نوع گلوبال هست البته شما مختارید گلوبال یا لوکال تعریفش کنید فرقی هم نداره زیاد
              eeprom unsigned long I_EEPROM=0
              والا این برنامه واسه دستگاه جوجه کشیه،که باید 21 روز رو طی کنه،حالا میخوام ببینم میشه مثلا هر ساعت مقدار روز و ساعت رو داخل حافظه ذخیره کنه؟که برق رفت و اومد از همون بخونه و ادامه کارشو بده،میشه هممچین کاری کرد؟

              دیدگاه


                #8
                پاسخ : کار با eeprom داخلی atmega16

                نوشته اصلی توسط mohammadgh1370 نمایش پست ها
                والا این برنامه واسه دستگاه جوجه کشیه،که باید 21 روز رو طی کنه،حالا میخوام ببینم میشه مثلا هر ساعت مقدار روز و ساعت رو داخل حافظه ذخیره کنه؟که برق رفت و اومد از همون بخونه و ادامه کارشو بده،میشه هممچین کاری کرد؟
                بله میشه همچین کاری کرد. توصیه می شود که از ای سی هایی که زمان دقیق رو برای میکرو فراهم می کنند برای ساختن ساعت استفاده کنید که خطا نداشته باشید. حتما از LCD استفاده کنید و زمان سپری شده رو چند بار چک کنید چون ای سی تقلبی هم تو بازار زیاده. برای سیو کردن اطلاعات قبل از رفتن برق هم توی انجمن تاپیکش هست سرچ کنید پیدا می کنید. مثلا هر ساعت یک بار اطلاعات رو سیو کنید
                گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                دیدگاه


                  #9
                  پاسخ : کار با eeprom داخلی atmega16

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

                  دیدگاه


                    #10
                    پاسخ : کار با eeprom داخلی atmega16

                    نوشته اصلی توسط amin20107 نمایش پست ها
                    بله میشه همچین کاری کرد. توصیه می شود که از ای سی هایی که زمان دقیق رو برای میکرو فراهم می کنند برای ساختن ساعت استفاده کنید که خطا نداشته باشید. حتما از LCD استفاده کنید و زمان سپری شده رو چند بار چک کنید چون ای سی تقلبی هم تو بازار زیاده. برای سیو کردن اطلاعات قبل از رفتن برق هم توی انجمن تاپیکش هست سرچ کنید پیدا می کنید. مثلا هر ساعت یک بار اطلاعات رو سیو کنید
                    [FONT=Yekan]#ifndef F_CPU[/FONT]#define F_CPU 1000000UL#endif




                    #include <avr/io.h>
                    #include <avr/interrupt.h>
                    #include <stdlib.h>
                    #include <stdio.h>
                    #include <avr/eeprom.h>
                    #include <util/delay.h>
                    #include "LCD_16x2_H_file.h"


                    #define ADDRESS_DAY 10
                    #define ADDRESS_HOUR 20


                    volatile int count = 0,sec = 0,min = 0,hour = 0,day = 0,i=0,j=0,first_run=0,power_down_flag=0;


                    ISR(TIMER1_COMPA_vect)
                    {
                    count++;
                    if (count >= 10)
                    {
                    sec++;
                    count = 0;
                    if (sec >= 60)
                    {
                    min++;
                    sec = 0;
                    if (min >= 60)
                    {
                    hour++;
                    power_down_flag = 1;
                    min = 0;
                    if (hour >= 24)
                    {
                    day++;
                    hour = 0;
                    }
                    }
                    }
                    }
                    }




                    ISR(TIMER0_COMP_vect)
                    {
                    if (power_down_flag == 1)
                    {
                    eeprom_update_byte (ADDRESS_DAY, day );
                    eeprom_update_byte (ADDRESS_HOUR, hour );
                    power_down_flag = 0;
                    }
                    }


                    ISR(INT1_vect)
                    {


                    if (TIMSK != TIMSK | (1 << OCIE1A))
                    {
                    TIMSK |= (1 << OCIE1A);
                    first_run = 1;
                    }


                    }


                    void timer1_init()
                    {
                    TCCR1B |= (1 << WGM12) | (1 << CS11);
                    OCR1A = 0x30D3;
                    }


                    void timer0_init()
                    {
                    TCCR0 |= (1 << WGM01) | (1 << CS00) | (1 << CS02);
                    OCR0 = 0x60;
                    TIMSK |= (1 << OCIE0);
                    }


                    void int1_init()
                    {
                    GICR |= 1<<INT1 ;
                    MCUCR |= 1<<ISC11;
                    }


                    int main(void)
                    {
                    LCD_Init();


                    timer1_init();
                    timer0_init();




                    int1_init();


                    sei();




                    day = eeprom_read_byte ( ADDRESS_DAY );
                    hour = eeprom_read_byte ( ADDRESS_HOUR );




                    while (1)
                    {
                    if (hour != 0 || day != 0)
                    {
                    TIMSK |= (1 << OCIE1A);
                    }
                    }
                    }



                    این روشی که من استفاده کردم درست هس؟ممنون میشم کمکم کنید
                    جدیدترین ویرایش توسط mohammadgh1370; ۰۰:۴۷ ۱۳۹۷/۰۳/۲۴.

                    دیدگاه


                      #11
                      پاسخ : کار با eeprom داخلی atmega16

                      حداقل توی برنامه کامنت بذارید اینطوری که نمیشه درست فهمید
                      گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                      همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                      دیدگاه


                        #12
                        پاسخ : کار با eeprom داخلی atmega16

                        نوشته اصلی توسط amin20107 نمایش پست ها
                        حداقل توی برنامه کامنت بذارید اینطوری که نمیشه درست فهمید
                        الان کدای اضافه رو حذف کردم،الان اولین بار که که برنامه اجرا میشه از حافظه میخونه روز و ساعت رو میریزه تو متغیراشون،تو وایل هم یه شرط واسه اینکه اگه مقدار متغییر ها مقدار داشت ینی یه باری میکرو ریست شده،و باید تایمر رو استارت کنه،واسه ذخیره زمان هم هر ساعت یه فلگی رو تعریف کردم که هر یه ساعت مقدار روز و ساعت رو ذخیره کنه،درسته؟

                        دیدگاه


                          #13
                          پاسخ : کار با eeprom داخلی atmega16

                          نوشته اصلی توسط mohammadgh1370 نمایش پست ها
                          الان کدای اضافه رو حذف کردم،الان اولین بار که که برنامه اجرا میشه از حافظه میخونه روز و ساعت رو میریزه تو متغیراشون،تو وایل هم یه شرط واسه اینکه اگه مقدار متغییر ها مقدار داشت ینی یه باری میکرو ریست شده،و باید تایمر رو استارت کنه،واسه ذخیره زمان هم هر ساعت یه فلگی رو تعریف کردم که هر یه ساعت مقدار روز و ساعت رو ذخیره کنه،درسته؟
                          درود ، حتما از مدار تشخیص قطع برق استفاده کنید ، ذخیره مداوم اعداد در ایپرام به اینصورت فقط عمر حافظه رو کم می*کنه . اصطلاحا به این مدار بلک اوت گفته میشه ، با بررسی برق ورودی به محض تشخیص قطع برق ، کافیه شما با مداری متشکل از چند خازن ظرفیت بالا ، چند لحظه میکرو رو روشن نگه دارید و با اینتراپت خارجی ، تابع ذخیره ایپرام رو اجرا کنید ،

                          دیدگاه


                            #14
                            پاسخ : کار با eeprom داخلی atmega16

                            در تکمیل صحبت های مهندس باید بگم که ولتاژ تغذیه میکرو رو با یکی از ADC ها بخونید و بعد هرموقع کمتر از 4.7 الی 4.5 ولت شده توی eeprom ذخیره کنید مقدار رو از این دو مقدار کمتر نذارید چون مشخصه دشارژ خازن سهمی شکل هست یه دفعه وسط کار سریعا خالی می کنه و میکرو نمیتونه کارش رو درست انجام بده. نمودار دشارژ خازن رو در شکل زیر مشاهده می کنید
                            گویند سنگ لعل شود در مقام صبر اری شود ولی به خون جگر شود
                            همیشه آخر همه چیز خوبه، اگر هم هنوز خوب نشده پس هنوز آخرش نشده(چارلی چاپلین)

                            دیدگاه


                              #15
                              پاسخ : کار با eeprom داخلی atmega16

                              نوشته اصلی توسط Masood Ashoori نمایش پست ها
                              درود ، حتما از مدار تشخیص قطع برق استفاده کنید ، ذخیره مداوم اعداد در ایپرام به اینصورت فقط عمر حافظه رو کم می*کنه . اصطلاحا به این مدار بلک اوت گفته میشه ، با بررسی برق ورودی به محض تشخیص قطع برق ، کافیه شما با مداری متشکل از چند خازن ظرفیت بالا ، چند لحظه میکرو رو روشن نگه دارید و با اینتراپت خارجی ، تابع ذخیره ایپرام رو اجرا کنید ،
                              ممنون،مداری دارین که که بتونم استفاده کنم؟ممنون میشم بفرستین

                              دلیل: ادغام دو پست برای جلوگیری از اسپم

                              نوشته اصلی توسط amin20107 نمایش پست ها
                              در تکمیل صحبت های مهندس باید بگم که ولتاژ تغذیه میکرو رو با یکی از ADC ها بخونید و بعد هرموقع کمتر از 4.7 الی 4.5 ولت شده توی eeprom ذخیره کنید مقدار رو از این دو مقدار کمتر نذارید چون مشخصه دشارژ خازن سهمی شکل هست یه دفعه وسط کار سریعا خالی می کنه و میکرو نمیتونه کارش رو درست انجام بده. نمودار دشارژ خازن رو در شکل زیر مشاهده می کنید
                              ممنون،تا حالا این کارو نکردم،نمونه کدی دارین با مدارش که بتونم استفاده کنم؟ممنون میشم

                              دیدگاه

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