Thông báo

Collapse
No announcement yet.

[Hỏi] cách sử dụng EEPROM atmega16 trong codevisionavr

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

  • [Hỏi] cách sử dụng EEPROM atmega16 trong codevisionavr

    chào các bác!!!
    e đang gặp vấn đề về eeprom của thằng mega16. tình trạng là sau khi gán giá trị cho 1 biến eeprom và reset là nó lại =0. tuy nhiên nếu ở đầu chương trình nếu gán biến 1 giá trị nào đó thì khi reset lại ko =0. VD: r1[1]=5;
    e nạp bằng BurnE, đã set fuse cho eeprom ko bị xóa khi ngắt nguồn.
    thêm 1 điều ko hiểu nữa là sau khi biên dịch thì %Eeprom = 0 cho dù có khai báo biến eeprom.

    Khai báo biến:
    #include <eeprom.h>
    #define un unsigned;
    // Declare your global variables here
    eeprom un char r1[24];

    Ghi eeprom:
    #asm("cli");
    r1[1]++;
    #asm("sei");

    thanks các bác

  • #2
    void EEPROM_Write(unsigned int dchi, unsigned char dlieu)
    {
    while(EECR.1==1);
    EEAR = dchi;
    EEDR = dlieu;
    EECR.2 = 1;
    EECR.1 = 1;
    }

    //doc 1 byte du lieu tu dia chi cua eeprom//////////////////////////
    unsigned char EEPROM_Read(unsigned int dchi)
    {
    while(EECR.1);
    EEAR = dchi;
    EECR.0 = 1;
    return EEDR;
    }

    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      thanks bác nhiều!!!
      e đã làm đc rồi.
      tuy nhiên e vẫn có thắc mắc là tại sao khi biên dịch thì thằng EEPROM Usage vẫn là 0%.
      Và trong phần Help của codevision (và có nhiều người nói) là cách sử dụng biến EEPROM giống như 1 biến bình thường

      Comment


      • #4
        các bác cho em hỏi tại sao em viết chương trình ghi chuỗi vào eeprom , đã gán địa chỉ cho bít mà khi lưu chuỗi vô nó cứ gán vô bit đầu tiên. gửi lên máy tính thì chỉ hiển thị chuỗi đầu tiên. đây là code của em nhờ các bác mổ sẻ giùm coi lỗi ở đâu:

        #include <mega8.h>
        #include <alcd.h>
        #include <delay.h>
        #include <string.h>
        #include <stdio.h>
        #include <stdlib.h>
        #include <stdarg.h>

        unsigned char *a="01634709835";
        unsigned char *b="09179472770";
        unsigned char *c="09741413050";
        unsigned char *d="abcdefnhyk0";
        unsigned char a1[12],a2[12],a3[12],a4[12];

        /////////xu ly luu eeprom\\\\\\\\\\\\

        unsigned char Data[12];
        unsigned int uuu=0;
        //////ghi vao eeprom\\\\\\\\\\
        void ghi_eeprom(unsigned int Address, unsigned char Data[12])
        {
        unsigned int nnn=0;
        nnn=Address;
        while(nnn<=(Address+12))
        {
        /* Wait for completion of previous write */
        while(EECR & (1<<EEWE))
        ;
        /* Set up address and data registers */
        EEAR = nnn;
        EEDR = Data[nnn];
        /* Write logical one to EEMWE */
        EECR |= (1<<EEMWE);
        /* Start eeprom write by setting EEWE */
        EECR |= (1<<EEWE);
        nnn++;
        }
        while(uuu<=12)
        {
        Data[uuu]=' ';
        uuu++;
        }
        }
        //////////doc tu eeprom\\\\\\\\\\\\\\\\

        unsigned char doc_eeprom(unsigned int Address)
        {
        unsigned int aaa=0;
        aaa=Address;
        while(aaa<=(Address+12))
        {
        /* Wait for completion of previous write */
        while(EECR & (1<<EEWE))
        ;
        /* Set up address register */
        EEAR = aaa;
        /* Start eeprom read by writing EERE */
        EECR |= (1<<EERE);
        /* Return data from data register */
        Data[aaa]=EEDR;
        aaa++;
        }
        return aaa;
        }

        void main(void)
        {

        PORTB=0x00;
        DDRB=0x00;
        PORTC=0x00;
        DDRC=0x00;
        PORTD=0x00;
        DDRD=0x00;

        UCSRA=0x00;
        UCSRB=0x98;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x33;


        lcd_init(16);

        #asm("sei")
        ghi_eeprom(0,a);
        doc_eeprom(0);
        strcpy(a1,Data);
        ghi_eeprom(12,b);
        doc_eeprom(12);
        strcpy(a2,Data);
        ghi_eeprom(24,c);
        doc_eeprom(24);
        strcpy(a3,Data);
        ghi_eeprom(36,d);
        doc_eeprom(36);
        strcpy(a4,Data);


        while (1)
        {

        printf("%s",a1);
        printf("\r\n");
        delay_ms(1000);

        printf("%s",a2);
        printf("\r\n");
        delay_ms(1000);

        printf("%s",a3);
        printf("\r\n");
        delay_ms(1000);

        printf("%s",a4);
        printf("\r\n");
        delay_ms(1000);
        }
        }

        Comment


        • #5
          đây là hình ảnh tren mô phong

          Comment

          Về tác giả

          Collapse

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

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

          Collapse

          • nguyendinhvan
            Trả lời cho Vấn đề về tốc độ quay
            bởi nguyendinhvan
            Sử dụng động cơ servor, hoặc lắp thêm một cái encoder vào động cơ bước. Encoder sẽ kiểm soát động cơ có quay hoặc đứng im.
            Hôm qua, 19:50
          • Andrea14
            Vấn đề về tốc độ quay
            bởi Andrea14
            Chào mọi người,

            Tôi muốn mô phỏng sự thay đổi các mùa bằng cách từ từ nghiêng một quả địa cầu 16 inch bằng một động cơ bước nhỏ. Một động cơ bước khác sẽ quay quả địa cầu theo thời gian thực. Hệ thống truyền động...
            12-12-2025, 12:42
          • bqviet
            Trả lời cho Đấu tắt điện cho máy tính bảng
            bởi bqviet
            Bqv cáo lỗi vì chưa đủ khả năng diễn giải để người đọc hiểu. Người làm kỹ thuật sâu đôi khi như thế đó. Về việc nạp pin không vào dù cell mới, khả năng cái mạch quản lý đó đã hỏng - cũng chính là nguyên nhân đám cell cũ hỏng từ đầu.
            06-12-2025, 17:17
          Đang tải...
          X