PDA

View Full Version : lệnh ghi eeprom nội của pic ntn?


sandro_bk
06-11-2007, 02:58 AM
tôi viết = CCS,tôi dùng lệnh ghi lên eeprom nội của pic,thấy trong tài liệu CCS help nói lệnh này thực hiện trong vài mili giây,vậy nếu lệnh đang thực hiện mà xảy ra ngắt thì có ảnh hưởng gì ko?theo đúng lý thuyết chương trình sẽ nhảy vào ngắt và khi thực hiện ngắt xong thì quay lại làm tiếp,vấn đề tài ngắt tôi xài là ngắt pwm tần số 20Khz(50us),vậy thì nhảy ra nhảy vào mấy chục lần mới xong cái lệnh ghi eeprom,như vậy còn đảm bảo chuơng trình thực hiện chính xác ko?tôi xài con pic18f4331

Jerry
06-11-2007, 11:39 AM
Trước khi ghi vào EEPROM trong phải cấm tất cả các ngắt (xoá bit GIE đi). Ghi xong mới set lại nó =1. Trong datashet của PIC có nói đến việc này mà.

sandro_bk
07-11-2007, 12:53 AM
cảm ơn bác đã giải thích,cái chổ bác nói phải cấm ngắt trước khi ghi eeprom là trong tài liệu nào vậy?nếu có thể bác cho biết trang luôn nhé,điều này có bắt buộc ko?tức là nếu ghi eeprom mà ko cấm ngắt thì ko ghi được sao?cám ơn

namqn
07-11-2007, 12:59 AM
cảm ơn bác đã giải thích,cái chổ bác nói phải cấm ngắt trước khi ghi eeprom là trong tài liệu nào vậy?nếu có thể bác cho biết trang luôn nhé,điều này có bắt buộc ko?tức là nếu ghi eeprom mà ko cấm ngắt thì ko ghi được sao?cám ơn
Jerry đã nói là trong datasheet của PIC rồi mà. Với con PIC18F4331 mà bạn đang dùng, bạn hãy đọc ví dụ 7-2, trang 87 (theo như được đánh số trong tài liệu DS39616B của Microchip).

Thân,

namqn
07-11-2007, 01:04 AM
Trước khi ghi vào EEPROM trong phải cấm tất cả các ngắt (xoá bit GIE đi). Ghi xong mới set lại nó =1. Trong datashet của PIC có nói đến việc này mà.
Nói một cách chính xác hơn là phải cấm ngắt để đảm bảo thực hiện chuỗi lệnh kích hoạt ghi EEPROM (required sequence), một khi đã kích hoạt việc ghi thì có thể cho phép ngắt trở lại. Bản thân việc ghi EEPROM cũng có thể tạo một ngắt khi ghi xong (bit EEIF).

Thân,

tungtot_vl
12-11-2007, 10:39 AM
mình cũng đang tìm hiểu về eeprom. đã đọc trong help của ccs rồi mã vẫn không hiểu.
mình cũng đã tìm hết diễn đàn rồi mà cũng chưa có bài viết nào hoàn chỉnh về eeprom để tham khảo cả. ai có bài nào thì port lên cho mình tham khảo với. hi hi

Mr.Bi
13-11-2007, 11:00 PM
đây là 1 cái code ng bạn mới đưa cho tui !

void write_ext_eeprom(unsigned char address, unsigned char data)
{
start();
write(0xa0);
write(address);
write(data);
stop();
DelayMs(11);
}

/****************************** ****************************** ******************************/

unsigned char read_ext_eeprom(unsigned char address)
{
unsigned char data;

start();
write(0xa0);
write(address);
repStart();
write(0xa1);
data=read(0);
stop();
return(data);
}

/****************************** ****************************** ******************************/

void main()
{
unsigned char i=0;

PORTB=0x00; // port
PORTC=0x00; // port

TRISB=0x00; //portb out
TRISC=0x00; //portc out

init(); //

while(i<=10) /* Viet 10 so vao eeprom */ //dung yeu cau roi nhe
{
PORTB=i; // xuat ra cho nao do. de de nhan biet moi lan vietnao eprom cho xuat ra led
write_ext_eeprom(i,i); // viet vao eprom
i++;
DelayMs(255);
}


PORTB=0xff; // sang led
DelaySec(1);
PORTB=0x00;
DelaySec(1);

i=0;

while(i<=10)
{
PORTB=i; // dia chi nay se doc tu eprom den led
DelayMs(255);
PORTB=0x00; // leds tat
DelayMs(255);
PORTB=read_ext_eeprom(i); // bo nho se chi cho led sang
DelayMs(255);
i++;
}
}
/****************************** ****************************** ******************************/

Mr.Bi
13-11-2007, 11:01 PM
tungtot_vl thử & cho ý kiến

sandro_bk
14-11-2007, 05:43 AM
thật ra để ghi và đọc eeprom của pic chỉ cần dùng lệnh hàm write_eeprom(địa chỉ,giá trị);
read_eeprom(địa chỉ); đã được cung cấp sẵn,có điều như đã nói ở trên,khi ghi phải cấm tất cả các ngắt và ghi xong cho phép ngắt lại,tại sao phải như vậy thì coi bài bác Nam post ở trên

dongbka
14-11-2007, 03:30 PM
tui đang tìm hiểu về ghép nối pic6f877a với rom ngoài.
bạn nào có tài liệu gì về vấn đề này không pót lên cho tui tham khảo với.
nếu có sơ đồ ghép nối và code thì tốt quá.tôi định làm với con rom 256k
vẫn chưa biết làm thế nào cả

LeDuc
11-03-2008, 04:59 PM
cho em hỏi , em lưu 1 giá trị 8 bit vào eeprom con Pic 16f887 thì được , nhưng làm sao ghi 1 giá trị 10 bit hoặc lớn hơn vào eeprom vậy? ai có giải thuật giúp em với ..

namqn
11-03-2008, 05:10 PM
cho em hỏi , em lưu 1 giá trị 8 bit vào eeprom con Pic 16f887 thì được , nhưng làm sao ghi 1 giá trị 10 bit hoặc lớn hơn vào eeprom vậy? ai có giải thuật giúp em với ..
PIC16F887 là vi điều khiển 8-bit, do đó độ dài dữ liệu tự nhiên là 8-bit. Để lưu các giá trị dài hơn 8-bit vào EEPROM của PIC16F887 thì bạn có thể tách các giá trị này ra thành nhiều phần, mỗi phần dài nhất là 8-bit, và lưu vào PIC theo một quy ước nào đó (có thể do bạn tự đặt ra). Các trình biên dịch ngôn ngữ cấp cao thường xử lý việc này cho bạn, do đó không có lý do gì bạn phải tự xử lý, trừ khi bạn viết chương trình bằng hợp ngữ.

Thân,

LeDuc
11-03-2008, 05:48 PM
PIC16F887 là vi điều khiển 8-bit, do đó độ dài dữ liệu tự nhiên là 8-bit. Để lưu các giá trị dài hơn 8-bit vào EEPROM của PIC16F887 thì bạn có thể tách các giá trị này ra thành nhiều phần, mỗi phần dài nhất là 8-bit, và lưu vào PIC theo một quy ước nào đó (có thể do bạn tự đặt ra). Các trình biên dịch ngôn ngữ cấp cao thường xử lý việc này cho bạn, do đó không có lý do gì bạn phải tự xử lý, trừ khi bạn viết chương trình bằng hợp ngữ.

Thân,

Nhưng anh Nam ơi, khi đọc ra thì phải làm sao để lấy đủ giá trị 10 bit .
bài toán em đang làm là : xét AD của 8 kênh dữ liệu , lưu vào eeprom . Đọc dữ liệu của 8 kênh được lưu trong eeprom , và xử lý khi có ngắt AD ..
Bình thường khi ghi vào eeprom nếu giá trị lớn hơn 8bit , nó tự tách ra nhiều phần , mỗi phần là 8 bit . Nhưng khi đọc ra làm sao ta lấy dủ dữ liệu 10 để so sanh với giá trị AD 10 bit tức thời ...
Em vẫn ko nghĩ ra được giải thuật, rất mong các anh giúp em...
Thanks for all ..

caonam
11-03-2008, 10:56 PM
Nhưng anh Nam ơi, khi đọc ra thì phải làm sao để lấy đủ giá trị 10 bit .
bài toán em đang làm là : xét AD của 8 kênh dữ liệu , lưu vào eeprom . Đọc dữ liệu của 8 kênh được lưu trong eeprom , và xử lý khi có ngắt AD ..
Bình thường khi ghi vào eeprom nếu giá trị lớn hơn 8bit , nó tự tách ra nhiều phần , mỗi phần là 8 bit . Nhưng khi đọc ra làm sao ta lấy dủ dữ liệu 10 để so sanh với giá trị AD 10 bit tức thời ...
Em vẫn ko nghĩ ra được giải thuật, rất mong các anh giúp em...
Thanks for all ..

Chời ơi,
unsigned int temp;
temp = (ADRESH << 8) | ADRESL;
vậy là được mà.

Nếu bạn ghi 1 số kiểu integer (2 byte) vào địa chỉ 10H chẳng hạn thì đọc nó ra byte 10H và 11H, phần cao và phần thấp đó, xong làm như phép trên là được.
Bạn bảo trình biên dịch nó tự tách ra thì phải lưu theo thứ tự đó, byte đầu là phần cao, byte sau là phần thấp.