Thông báo

Collapse
No announcement yet.

lưu vào bộ nhớ eeprom

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

  • lưu vào bộ nhớ eeprom

    em hỏi các bác tí :
    em làm đồ án đếm sản phẩm lưu vào eeprom trừ khi mất điện nó còn lưu lại được ,nhưng đang bị bế tắc chỗ lưu vào eeprom.
    em dùng codevision và mega16 eeprom=512bytes
    vd: em muốn lưu biến đếm i vào eeprom
    đây là bài code của em bác nào chỉ giáo em với nhá,,,,cảm ơn bác nào nhiệt tình.


    #include <mega16.h>
    #include <delay.h>

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    unsigned long int i=0;
    char flash *str="GIA TRI DEM : ";


    interrupt [EXT_INT1] void ext_int1_isr(void)
    {
    i++;

    }

    // Declare your global variables here
    void number(unsigned long int i){
    unsigned char a,b,c,d,e,f,g,h,l,m;
    m=i%10;
    i=i/10;
    l=i%10;
    i=i/10;
    h=i%10;
    i=i/10;
    g=i%10;
    i=i/10;
    f=i%10;
    i=i/10;
    e=i%10;
    i=i/10;
    d=i%10;
    i=i/10;
    c=i%10;
    i=i/10;
    b=i%10;
    i=i/10;
    a=i%10;
    lcd_gotoxy(6,1);
    lcd_putchar(a+48);
    lcd_putchar(b+48);
    lcd_putchar(c+48);
    lcd_putchar(d+48);
    lcd_putchar(e+48);
    lcd_putchar(f+48);
    lcd_putchar(g+48);
    lcd_putchar(h+48);
    lcd_putchar(l+48);
    lcd_putchar(m+48);

    }
    void main(void)
    {
    PORTA=0;
    DDRA=0xff;
    PORTD=0xff;
    DDRD=0;
    GICR|=0x80;
    MCUCR=0x08;
    MCUCSR=0x00;
    GIFR=0x80;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // LCD module initialization
    lcd_init(16);
    lcd_gotoxy(0,0);
    lcd_clear();
    lcd_putsf("HUAN-NGAN_SON");
    delay_ms(100);
    lcd_clear();
    lcd_putsf("DEM SAN PHAM BANG HONG NGOAI");
    delay_ms(200);
    lcd_clear();
    lcd_putsf(str);
    delay_ms(100);




    // Global enable interrupts
    #asm("sei")

    while (1)
    {
    number(i);

    };
    }

  • #2
    unsigned long i; bây giờ bạn sửa thành: eeprom unsigned long i;

    Làm như vậy thì khi mất điện nó sẽ lưu giá trị cuối cùng vào eeprom, nhưng làm cách này có nhược điểm là trong quá trình thực thi chuơng trình vi điều khiển sẽ mất 1 quãng thời gian để lưu i vào eeprom khi biến i thay đổi =>> giảm đi hiệu suất làm việc của vdk, đồng thời eeprom của atmega 16 chỉ đc ghi xóa 100.000 lần, khi hết 100.000 lần thì bộ nhớ eeprom sẽ bị hư, sẽ nhớ sai.

    Vậy giờ mình phải khắc phục bằng cách là khi nào mất điện thì vdk mới thực hiện lưu i vào eeprom. Vậy làm cách nào để vdk biết mất điện mà lưu, và lưu như thế nào. Cách của mình ngày trước là làm 1 cái mạch phát hiện mất điện, nguyên lý như sau: Khi mất điện thì 1 chân ngõ vào của vdk đc tác động mức 0. Khi PIN này ở mức 0(cũng giống như ta làm 1 cái nút nhấn thôi) thì vdk mới thực hiện lệnh lưu. Code như sau:

    eeprom unsigned long m;
    unsigned long i;

    void main ()
    {
    ...
    if(PINB.0==0) // giả sử khi mất điện thì PINB.0 đc tác động mức 0.
    {
    m=i;
    }
    }
    //
    Hôm nay viết thế đã, hy vọng là bạn hình dung sơ được. Hình dung được rồi mình sẽ hướng dẫn làm mạch phát hiện mất điện như thế nào hoặc bạn có thể nghiên cứu trước càng tốt.
    Chúc thành công.
    Nhận làm mạch, ĐAMH sử dụng vđk Pic & AVR tại tp.HCM
    Liên hệ sđt: 0902.808.371

    Comment


    • #3
      Nguyên văn bởi manh89 Xem bài viết
      unsigned long i; bây giờ bạn sửa thành: eeprom unsigned long i;

      Làm như vậy thì khi mất điện nó sẽ lưu giá trị cuối cùng vào eeprom, nhưng làm cách này có nhược điểm là trong quá trình thực thi chuơng trình vi điều khiển sẽ mất 1 quãng thời gian để lưu i vào eeprom khi biến i thay đổi =>> giảm đi hiệu suất làm việc của vdk, đồng thời eeprom của atmega 16 chỉ đc ghi xóa 100.000 lần, khi hết 100.000 lần thì bộ nhớ eeprom sẽ bị hư, sẽ nhớ sai.

      Vậy giờ mình phải khắc phục bằng cách là khi nào mất điện thì vdk mới thực hiện lưu i vào eeprom. Vậy làm cách nào để vdk biết mất điện mà lưu, và lưu như thế nào. Cách của mình ngày trước là làm 1 cái mạch phát hiện mất điện, nguyên lý như sau: Khi mất điện thì 1 chân ngõ vào của vdk đc tác động mức 0. Khi PIN này ở mức 0(cũng giống như ta làm 1 cái nút nhấn thôi) thì vdk mới thực hiện lệnh lưu. Code như sau:

      eeprom unsigned long m;
      unsigned long i;

      void main ()
      {
      ...
      if(PINB.0==0) // giả sử khi mất điện thì PINB.0 đc tác động mức 0.
      {
      m=i;
      }
      }
      //
      Hôm nay viết thế đã, hy vọng là bạn hình dung sơ được. Hình dung được rồi mình sẽ hướng dẫn làm mạch phát hiện mất điện như thế nào hoặc bạn có thể nghiên cứu trước càng tốt.
      Chúc thành công.
      hay quá bác a, em cam on e rat hieu y bac,nhung cai mạch phát hiện mất điện em chưa gặp bjo,,, mong bác chia sẻ thêm ạ.
      em nghe nói là chỉ dùng 1 tụ,may con diot ,trở xả ,24C02, nhưng e chả hình dung đc cai mạch ntn .bác dẫn giúp em nhá.
      Last edited by huancdt54; 27-10-2012, 21:32.

      Comment


      • #4
        Về nguyên lý mạch này chắc cũng dễ hiểu thôi, bạn tự suy nghĩ nhé. Nguồn VCC nối với điện trở R4(10K) là VCC_VDK nhé, quên chưa sửa.

        Nhận làm mạch, ĐAMH sử dụng vđk Pic & AVR tại tp.HCM
        Liên hệ sđt: 0902.808.371

        Comment


        • #5
          Nguyên văn bởi manh89 Xem bài viết
          Về nguyên lý mạch này chắc cũng dễ hiểu thôi, bạn tự suy nghĩ nhé. Nguồn VCC nối với điện trở R4(10K) là VCC_VDK nhé, quên chưa sửa.
          cho em hỏi cái :
          VCC_VDK là chân AVCC trong vi điều khiển ạ . chỗ diode có cần thiết cấp VCC_VDK ko bác?
          VCC_TAI là nguồn từ đâu ạ.?e chưa thông chỗ này.
          ak còn chân IN của LM7805 sao ko nối vs cái j để tự do ak bác..
          nếu có time bác ju'p e no'i qua nguyên li' vs nhé..cảm on bac nhìu nhìu đấy.

          Comment


          • #6
            Nguyên văn bởi huancdt54 Xem bài viết
            cho em hỏi cái :
            VCC_VDK là chân AVCC trong vi điều khiển ạ . chỗ diode có cần thiết cấp VCC_VDK ko bác?
            VCC_TAI là nguồn từ đâu ạ.?e chưa thông chỗ này.
            ak còn chân IN của LM7805 sao ko nối vs cái j để tự do ak bác..
            nếu có time bác ju'p e no'i qua nguyên li' vs nhé..cảm on bac nhìu nhìu đấy.
            Chân IN của 7805 tất nhiên phải có rồi, bạn tự thêm vào đi chứ. Còn VCC_TAI cái này cấp nguồn cho LCD chẳng hạn, còn VCC_VDK nối vào chân VCC của VDK. Mình làm mạch này có ý là như thế này: Khi mất điện thì VCC_TAI ( vcc cấp cho tải sẽ mất luôn) chỉ còn VCC_VDK nhờ vào điện đc nạp trên con tụ C4 (2200uF chẳng hạn). Con transistor Q3 bây giờ sẽ ngưng dẫn => chân B(chân kích) của con transistor Q4 sẽ ở mức 1 => PINB.0 của vdk lúc này sẽ ở mức 0. Lúc này thì bạn sẽ viết đoạn lệnh kiểm tra PINB.0: if(PINB.0==0) {m=i;}//Khi điều kiện này đúng thì vdk mới bắt đầu gán biến m=i và lưu giá trị m vào eeprom.
            Cái mạch này rất dễ hiểu và nó mô phỏng đc trên proteus, bạn nên làm thử để biết nguyên lý.

            Nếu chưa thông thì bạn nên xem lại nguyên tắc hoạt động của mấy con transistor. Xem xong là thông ngay thôi.

            Chúc thành công.
            Nhận làm mạch, ĐAMH sử dụng vđk Pic & AVR tại tp.HCM
            Liên hệ sđt: 0902.808.371

            Comment


            • #7
              thanh bac nha...the nay la on oy...ok.!

              Comment


              • #8
                Ngoài ra bạn còn phải làm mạch lưu điện(tụ hoặc pin, battery) để đủ thời gian ghi vào eeprom sau khi mất điện.
                AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
                Xem thêm tại Online Store ---> Click here
                Mob: 0982.083.106

                Comment


                • #9
                  Nguyên văn bởi VNarmy Xem bài viết
                  Ngoài ra bạn còn phải làm mạch lưu điện(tụ hoặc pin, battery) để đủ thời gian ghi vào eeprom sau khi mất điện.
                  em nghĩ cái tụ C4 là đủ để phóng điện cho vdk oy còn j ạ..
                  Last edited by huancdt54; 28-10-2012, 22:58.

                  Comment


                  • #10
                    Nguyên văn bởi VNarmy Xem bài viết
                    Ngoài ra bạn còn phải làm mạch lưu điện(tụ hoặc pin, battery) để đủ thời gian ghi vào eeprom sau khi mất điện.
                    Mạch này là mạch lưu điện luôn rồi bác ah, cho tụ C4=1000uF là dư thời gian để vdk ghi vào eeprom rồi.
                    Nhận làm mạch, ĐAMH sử dụng vđk Pic & AVR tại tp.HCM
                    Liên hệ sđt: 0902.808.371

                    Comment


                    • #11
                      7805 qua thêm 1 con đi ốt nữa liệu có đủ cho VDK hoạt động không bác, nhiều con nó chỉ ra có 4,8V thôi.

                      Nếu nguồn không mất hẳn mà chỉ yếu đi thôi( thí dụ khi dùng pin) thì nó không báo được.
                      sau.ph

                      Comment


                      • #12
                        Nguyên văn bởi T.L.M Xem bài viết
                        7805 qua thêm 1 con đi ốt nữa liệu có đủ cho VDK hoạt động không bác, nhiều con nó chỉ ra có 4,8V thôi.

                        Nếu nguồn không mất hẳn mà chỉ yếu đi thôi( thí dụ khi dùng pin) thì nó không báo được.
                        mega16A nếu dùng thạch anh dưới 8M thì chạy từ 2.7 tới 5.5 mà lo gì chứ.

                        Comment


                        • #13
                          Bạn dùng một con diode và một tụ hoá khoảng 2200uF cấp nguồn riêng cho con avr, avr có chân so sánh điện áp analog AN0, AN1.. Cho AN0 nối vào Vcc của avr và AN1 nối vào vị trí nguồn mà khi mất điện nó mất luôn. Chú ý làm sao điện áp của AN0<AN1. Sử dụng tính năng ngắt so sánh analog và khi mất điện sẽ có một ngắt sảy ra. Bạn cho lưu giá trị vào eeprom trong ngắt này. Điều chỉnh thêm tụ nếu cần thiết.
                          n
                          ĐT: 0986 492 489

                          Tham khảo:

                          Comment


                          • #14
                            các bác cho e hỏi tí..thầy giao cho em là đếm đến số có 12 chữ số nhưng e khai bao "unsigned long int i" nên chỉ đếm được đến số 4294967295(10 chữ số) , e đổi thành kiểu float i nhưng trong bài code của em nó báo lỗi đổi thành mấy cái khoảng dữ liệu cao hơn cũng thế..bác cho ý kiến jup em với..e cảm ơn.

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X