Tổng quan về EEPROM !
Có thể nói EEPROM là công nghệ
mới nhất của ROM mà điều khác biệt cơ bản là chúng có
khả năng xoá được bằng phương pháp lập trình mà chúng không cần đến các thiết bị
chuyên dụng như các thế hệ trước của nó. Bằng cách sử dụng EEPROM (hoặc flash
ROM) người ta có thể dễ dàng xoá bỏ các chương trình được nạp trên nó của các bo mạch chủ trong máy tính cá nhân mà không cần thêm một thao tác cơ học
nào khác kể cả tháo vỏ máy tính.
EEPROM còn giúp các thiết bị khác (bo mạch mạng, bo mạch đồ hoạ, wireless
access points, bộ định tuyến...hoặc trong điện thoại, thiết bị giải trí số cá
nhân...) có thể nâng cấp firmware mà không cần thay đổi chip nhớ, việc mà trước
kia người ta thường thực hiện gắn chip trên các đế để có thể thay thế sau này bằng
cách gỡ bỏ chúng và thay bằng chip khác.
1. Giới thiệu
- EEPROM là bộ nhớcó khả năng ghi đọc trong quá trình PIC hoạt động bình thường.
- EEPROM không được thiết lập trực tiếp từ không gian bộ nhớ mà thông qua các thanh ghi có chức năng đặc biệt:
+EECON1+EECON2
+ EEDATA + EEADR
+ EEDATH+ EEADRH
- EEDATA sẽ lưu giá trị 8bit được Ghi -Đọc.
- EEADR sẽ chứa địa chỉ của ô nhớ c ần truy xuất.
- Khi giao tiếp với bộ nhớ chương trình: 2 thanh ghi
EEDATA : EEDATH được kết hợp đểlưu14 bit mã lệnh ghi và đọc.
Và 2 thanh ghi EEADR : EEADRH kết hợp để lưu địa chỉ 13bit của ô nhớ đang truy xuất.
- Bộ nhớEEPROM chỉcho phép đọc và ghi1Byte.
- Bộn hớEEPROM sẽ tự động xóa trước khi Ghi.
2. Các thanh ghi
a. Thanh ghi EEADR và EEADRH
- Cặp thanh ghi này có thể địnhđịa chỉtốiđa 256 Byte hay tối đa 8K word của bộ nhớEEPROM.
- Khi truy xuất bộ nhớdữ liệu: chỉdùng EEADR để lưu Byte địa chỉ thấp.
- Khi truy xuất bộ nhớ chương trình: dùng EEADR để lưu byte địa chỉ thấp và EEADRH lưu Byte địa chỉcao.
b. Thanh ghi EECON1 và EECON2
- Thanh ghiEECON1chứa các bitđiều khiển.
- Thanh ghiEECON2chỉlà thanh ghiảo, chỉ được dùng riêng cho hoạ tđộng Ghi vào EEPROM.
Phần lý thuyết trên mình không soạn sẵn nên mình lấy của PIC16F luôn nha nên nó cũng không được chính xác lắm nên các bạn đọc Datasheet thêm nha !
- EEPROM là bộ nhớcó khả năng ghi đọc trong quá trình PIC hoạt động bình thường.
- EEPROM không được thiết lập trực tiếp từ không gian bộ nhớ mà thông qua các thanh ghi có chức năng đặc biệt:
+EECON1+EECON2
+ EEDATA + EEADR
+ EEDATH+ EEADRH
- EEDATA sẽ lưu giá trị 8bit được Ghi -Đọc.
- EEADR sẽ chứa địa chỉ của ô nhớ c ần truy xuất.
- Khi giao tiếp với bộ nhớ chương trình: 2 thanh ghi
EEDATA : EEDATH được kết hợp đểlưu14 bit mã lệnh ghi và đọc.
Và 2 thanh ghi EEADR : EEADRH kết hợp để lưu địa chỉ 13bit của ô nhớ đang truy xuất.
- Bộ nhớEEPROM chỉcho phép đọc và ghi1Byte.
- Bộn hớEEPROM sẽ tự động xóa trước khi Ghi.
2. Các thanh ghi
a. Thanh ghi EEADR và EEADRH
- Cặp thanh ghi này có thể địnhđịa chỉtốiđa 256 Byte hay tối đa 8K word của bộ nhớEEPROM.
- Khi truy xuất bộ nhớdữ liệu: chỉdùng EEADR để lưu Byte địa chỉ thấp.
- Khi truy xuất bộ nhớ chương trình: dùng EEADR để lưu byte địa chỉ thấp và EEADRH lưu Byte địa chỉcao.
b. Thanh ghi EECON1 và EECON2
- Thanh ghiEECON1chứa các bitđiều khiển.
- Thanh ghiEECON2chỉlà thanh ghiảo, chỉ được dùng riêng cho hoạ tđộng Ghi vào EEPROM.
Phần lý thuyết trên mình không soạn sẵn nên mình lấy của PIC16F luôn nha nên nó cũng không được chính xác lắm nên các bạn đọc Datasheet thêm nha !
- Ảnh mô phỏng protues.
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _XTAL_FREQ 8000000
// CONFIG1H
#pragma config OSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF // Internal External Oscillator Switchover bit (Internal External Switchover mode disabled)
// CONFIG2L
#pragma config PWRTEN = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled)
// BORV = No Setting
// CONFIG2H
#pragma config WDTEN = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDPS = 32768 // Watchdog Timer Postscale Select bits (1:32768)
#pragma config WINEN = OFF // Watchdog Timer Window Enable bit (WDT window disabled)
// CONFIG3L
#pragma config PWMPIN = OFF // PWM output pins Reset state control (PWM outputs disabled upon Reset (default))
#pragma config LPOL = HIGH // Low-Side Transistors Polarity (PWM0, 2, 4 and 6 are active-high)
#pragma config HPOL = HIGH // High-Side Transistors Polarity (PWM1, 3, 5 and 7 are active-high)
#pragma config T1OSCMX = ON // Timer1 Oscillator MUX (Low-power Timer1 operation when microcontroller is in Sleep mode)
// CONFIG3H
#pragma config FLTAMX = RC1 // FLTA MUX bit (FLTA input is multiplexed with RC1)
#pragma config SSPMX = RC7 // SSP I/O MUX bit (SCK/SCL clocks and SDA/SDI data are multiplexed with RC5 and RC4, respectively. SDO output is multiplexed with RC7.)
#pragma config PWM4MX = RB5 // PWM4 MUX bit (PWM4 output is multiplexed with RB5)
#pragma config EXCLKMX = RC3 // TMR0/T5CKI External clock MUX bit (TMR0/T5CKI external clock input is multiplexed with RC3)
#pragma config MCLRE = OFF // MCLR Pin Enable bit (Disabled)
// CONFIG4L
#pragma config STVREN = OFF // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset)
#pragma config LVP = OFF // Low-Voltage ICSP Enable bit (Low-voltage ICSP disabled)
// CONFIG5L
#pragma config CP0 = OFF // Code Protection bit (Block 0 (000200-000FFFh) not code-protected)
#pragma config CP1 = OFF // Code Protection bit (Block 1 (001000-001FFF) not code-protected)
#pragma config CP2 = OFF // Code Protection bit (Block 2 (002000-002FFFh) not code-protected)
#pragma config CP3 = OFF // Code Protection bit (Block 3 (003000-003FFFh) not code-protected)
// CONFIG5H
#pragma config CPB = OFF // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code-protected)
#pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM not code-protected)
// CONFIG6L
#pragma config WRT0 = OFF // Write Protection bit (Block 0 (000200-000FFFh) not write-protected)
#pragma config WRT1 = OFF // Write Protection bit (Block 1 (001000-001FFF) not write-protected)
#pragma config WRT2 = OFF // Write Protection bit (Block 2 (002000-002FFFh) not write-protected)
#pragma config WRT3 = OFF // Write Protection bit (Block 3 (003000-003FFFh) not write-protected)
// CONFIG6H
#pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write-protected)
#pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM not write-protected)
// CONFIG7L
#pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000200-000FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (001000-001FFF) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (002000-002FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (003000-003FFFh) not protected from table reads executed in other blocks)
// CONFIG7H
#pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from table reads executed in other blocks)
void EEPROM_Write();
void EEPROM_Write_String(unsigned char [],unsigned char address);
unsigned char EEPROM_Read();
unsigned char x,len,i;
void main()
{
EEPROM_Write_String("xcvn.blospot.com",0);
//Message String and Starting Address
EECON1bits.WREN = 0; //Disable Writing to EEPROM
//Reading the Data at 0x0 EEPROM Address
EEADR = 0x0;
x = EEPROM_Read();
while(1)
{
}
}
void EEPROM_Write()
{
EECON1bits.EEPGD = 0; //Points to EEPROM
EECON1bits.CFGS = 0; //Points to Flash and EEPROM
EECON1bits.WREN = 1; //EEPROM Write Enable bit
INTCONbits.GIE = 0; //Disable all Interrupts
EECON2 = 0x55;
EECON2 = 0xAA;
EECON1bits.WR = 1; //WR Control bit initiates Write Operation
INTCONbits.GIE = 1;
while(!PIR2bits.EEIF);
PIR2bits.EEIF = 0;
}
void EEPROM_Write_String(unsigned char msg[],unsigned char address)
{
len = strlen(msg);
for(i=0;i<len;i++)
{
EEADR = address + i;
EEDATA = msg[i];
EEPROM_Write(msg[i]);
}
}
unsigned char EEPROM_Read()
{
EECON1bits.EEPGD = 0; //Point to EEPROM
EECON1bits.CFGS = 0; //Points to Flash and EEPROM
EECON1bits.RD = 1; //EEPROM Read Enable Bit
return(EEDATA);
}
- Link download project Click here
EmoticonEmoticon