Thứ Tư, 28 tháng 11, 2018

Bài 3. PIC 18F450 ON CHIP EEPROM

Giới thiệu

  • Bộ nhớ chỉ đọc có thể lập trình điện (EEPROM) là bộ nhớ dữ liệu không bay hơi. Dữ liệu EEPROM được sử dụng chủ yếu để lưu trữ thông tin (dữ liệu) đang thay đổi thường xuyên và cũng được sử dụng để lưu trữ dữ liệu dài hạn.
  • Chúng tôi có thể lưu trữ dữ liệu trong khi một ứng dụng đang chạy. Vì vậy, nếu có mất điện (cung cấp tắt), dữ liệu sẽ không bao giờ bị mất không giống như RAM dễ bay hơi và chúng tôi có thể thu hồi dữ liệu được lưu trữ trong EEPROM.
  • Về cơ bản nó được sử dụng cho các ứng dụng như đọc đồng hồ điện tự động, nơi đọc cần phải được lưu trữ để tính toán liên tục và cũng có thể xảy ra nếu mất điện sau đó cũng cần lưu trữ đọc hiện tại.
  • PIC18F4550 có sẵn EEPROM 256 byte dữ liệu. Địa chỉ của nó dao động từ 0h-FFh.
  • Nội dung mặc định của bộ nhớ dữ liệu EEPROM là 0xff.
EEPROM có 4 thanh ghi khác nhau
  1. EEADR : Đăng ký giữ địa chỉ 8 bit của vị trí EEPROM mà chúng tôi muốn truy cập. Nó có thể giải quyết tối đa 256 byte.
  2. EEDATA : Đăng ký giữ dữ liệu 8 bit cho hoạt động đọc / ghi.
  3. EECON1 : Đây là thanh ghi EEPROM Control cần được cấu hình cho hoạt động đọc / ghi.
  4. EECON2 : Nó không phải là một đăng ký vật lý. Nó được sử dụng trong xóa bộ nhớ và viết chuỗi.

Đăng ký EEPROM

Bây giờ hãy xem chi tiết đăng ký EEPROM.
EECON1 Đăng ký: Dữ liệu EEPROM kiểm soát Đăng ký 1
Đăng ký EECON1
Đăng ký EECON1



EEPGD: Chương trình Flash hoặc Bộ nhớ EEPROM dữ liệu Chọn Bit
            1 = Bộ nhớ chương trình flash
            0 = Truy cập dữ liệu Bộ nhớ EEPROM
CFGS: Chương trình Flash / Dữ liệu EEPROM hoặc Cấu hình Chọn Bit
            1 = Đăng ký cấu hình truy cập
            0 = Truy cập Chương trình Flash / Dữ liệu EEPROM
MIỄN PHÍ: Xóa hàng loạt flash Bật bit:
            Được sử dụng cho bộ nhớ Flash.
WRERR: Chương trình Flash hoặc dữ liệu EEPROM Memory ERROR flag Bit
            1 = ghi hoạt động được chấm dứt trước khi hoàn thành do bất kỳ thiết lập lại trong hoạt động bình thường hoặc do nỗ lực viết không đúng.
            0 = hoạt động ghi được hoàn tất thành công.
WREN: Chương trình Flash hoặc dữ liệu EEPROM Viết Bật Bit
            1 = Cho phép ghi chu trình dữ liệu EEPROM.
            0 = Ức chế ghi chu trình dữ liệu EEPROM.
Khi bật nguồn, nó sẽ bị xóa để bảo vệ chống lại viết sai hoặc viết giả.
WR: Viết Bit điều khiển
            1 = Nó bắt đầu hoạt động xóa / ghi dữ liệu EEPROM
            0 = Nó cho biết chu trình ghi EEPROM đã hoàn tất.
RD: Đọc bit điều khiển
            1 = Bắt đầu đọc EEPROM
            0 = Nó cho biết chu trình đọc EEPROM đã hoàn tất.
EECON2
  • Trước khi ghi dữ liệu vào EEPROM, một chuỗi ký tự cần được gửi đến thanh ghi EECON2.
  • Trình tự đưa ra dưới đây phải được ghi vào Sổ đăng ký EECON2
  1. Viết 0x55h
  2. Viết 0xAAh
  • Nó được khuyến khích để làm theo trình tự cho một hoạt động viết.
  • Điều này bắt đầu viết chuỗi và WREN bit với nhau giúp ngăn chặn một tình cờ viết trong quá trình ổn định quyền lực, brown-outs và phần mềm trục trặc.

Ngắt EEPROM

  • Ngoài ra, lưu ý rằng khi thao tác ghi hoàn thành cờ ngắt EEIF được thiết lập cho biết thao tác ghi hoàn tất.
  • Lá cờ này nằm trong Đăng ký PIR2 <bit 4>.
  • Nó phải được xóa trong phần mềm.
Lưu ý : EEPROM có độ bền tối thiểu là 1.000.000 chu kỳ ghi / đọc, do đó có chu kỳ ghi / đọc hữu hạn, không bao giờ đọc / ghi EEPROM trong một vòng lặp vô hạn liên tục.

Các bước lập trình

Viết thao tác
  1. Tải Đăng ký EEADR bằng địa chỉ.
  2. Nạp Đăng ký EEDATA bằng Dữ liệu.
  3. Cấu hình đăng ký EECON1 cho thao tác ghi bằng cách đặt EEPGD = 0, CFGS = 0 và WREN = 1.
  4. Tắt tất cả các ngắt.
  5. Nạp một chuỗi vào thanh ghi EECON2 (thứ nhất 55h và thứ 2 AAh) để thực hiện thao tác ghi.
  6. Bây giờ bắt đầu ghi hoạt động bằng cách đặt bit WR thành '1' trong thanh ghi EECON1.
  7. Ngoài ra, vô hiệu hóa ngắt toàn cục.
  8. Giám sát cờ EEIF (PIR2 <4>) cho đến khi nó là 0.

void EEPROM_Write (int address, char data)
{
    /* Write Operation*/
    EEADR=address;  /* Write address to the EEADR register */
    EEDATA=data;  /* Copy data to the EEDATA register for
    write to EEPROM location */
    EECON1bits.EEPGD=0;  /* Access data EEPROM memory */
    EECON1bits.CFGS=0;  /* Access flash program or data memory */
    EECON1bits.WREN=1;  /* Allow write to the memory */
    INTCONbits.GIE=0;  /* Disable global interrupt */
    
    /* Assign below sequence to EECON2 Register is necessary
       to write data to EEPROM memory */

    EECON2=0x55;
    EECON2=0xaa;
    
    EECON1bits.WR=1;  /* Start writing data to EEPROM memory */
    INTCONbits.GIE=1;  /* Enable interrupt*/
    
    while(PIR2bits.EEIF==0); /* Wait for write operation complete */
    PIR2bits.EEIF=0;  /* Reset EEIF for further write operation */
}

Hoạt động đọc
        1. Nạp Sổ đăng ký EEADR bằng địa chỉ (ví dụ 00h).
        2. Cấu hình Đăng ký EECON1 cho hoạt động đọc bằng cách cài đặt
            EEPGD = 0, CFGS = 0 và WREN = 0.
        3. Initiates Đọc hoạt động bằng cách thiết lập bit RD = 1 trong EECON1Register.
        4. Đọc dữ liệu trong EEDATA.
char EEPROM_Read(int address)
{
    /*Read operation*/
    EEADR=address; /* Read data at location 0x00*/
    EECON1bits.WREN=0; /* WREN bit is clear for Read operation*/  
    EECON1bits.EEPGD=0; /* Access data EEPROM memory*/
    EECON1bits.RD=1; /* To Read data of EEPROM memory set RD=1*/
    return(EEDATA);
}

Thí dụ

  • Chúng ta sẽ sử dụng dữ liệu EEPROM nội bộ mà trước tiên chúng ta ghi dữ liệu vào vị trí bộ nhớ EEPROM và sau đó đọc dữ liệu giống nhau từ vị trí bộ nhớ đó. Sau khi đọc, truyền chúng một cách thẳng thắn đến thiết bị đầu cuối để hiển thị.
  • Ghi dữ liệu vào vị trí thứ nhất tức là 0x00h và trở đi.
  • Ngoài ra, Đọc dữ liệu từ cùng một vị trí bộ nhớ.

#include <stdio.h>
#include <stdlib.h>
#include <p18f4550.h>
#include "eeprom_osc.h"
#include "USART_Header_File.h"


void EEPROM_Write(int,char);  /* Write byte to EEPROM */
char EEPROM_Read(int);   /* Read byte From EEPROM */
void EEPROM_WriteString(int,char*); /* Write String to EEPROM */

void main()
{
    int i;
    i=0;
    char Data_read;
    OSCCON=0x72;  /* Use internal Osc. with 8 Mhz Frequency */
    USART_Init(9600);  /* Initialize USART with 9600 baud rate */ 
    
    EEPROM_WriteString(0,"electronicWings");

    /* As EEPROM memory location set to 0xff default So while reading data
    from EEPROM memory we are comparing it with 0xff*/

    while(Data_read!=0xff)    
    {    
        Data_read=EEPROM_Read(i);
        USART_TransmitChar(Data_read); /* Transmit EPROM data serially */
        i++;
    }
    while(1);    
}

void EEPROM_Write (int address, char data)
{
    /*Write Operation*/
    EEADR=address; /* Write address to the EEADR register*/
    EEDATA=data; /* Copy data to the EEDATA register for write */
    EECON1bits.EEPGD=0; /* Access data EEPROM memory*/
    EECON1bits.CFGS=0; /* Access flash program or data memory*/
    EECON1bits.WREN=1; /* Allow write to the memory*/
    INTCONbits.GIE=0; /* Disable global interrupt*/
    
    /* Below sequence in EECON2 Register is necessary 
    to write data to EEPROM memory*/
    EECON2=0x55;
    EECON2=0xaa;
    
    EECON1bits.WR=1; /* Start writing data to EEPROM memory*/
    INTCONbits.GIE=1; /* Enable interrupt*/
    
    while(PIR2bits.EEIF==0);/* Wait for write operation complete */
    PIR2bits.EEIF=0; /* Reset EEIF for further write operation */
    
}

void EEPROM_WriteString(int address,char *data)
{
    /*Write Operation for String*/
    while(*data!=0)
    {
        EEPROM_Write(address,*data);
        address++;
        *data++;
    }    
}

char EEPROM_Read (int address)
{
    /*Read operation*/
    EEADR=address; /* Read data at location 0x00*/
    EECON1bits.WREN=0; /* WREN bit is clear for Read operation*/  
    EECON1bits.EEPGD=0; /* Access data EEPROM memory*/
    EECON1bits.RD=1; /* To Read data of EEPROM memory set RD=1*/
    return(EEDATA);
}

Code mô phỏng
Tệp đính kèm

Không có nhận xét nào:

Đăng nhận xét