PDA

View Full Version : lưu dữ liệu ở ROM....?


nguyenquoctoan
04-11-2008, 11:47 PM
Để lưu dữ liệu ở rom dùng các hàm như sau:
write_eeprom(địa chỉ,giá trị);
read_eeprom(địa chỉ);
trong khi lưu và đọc cấm tất cả các ngắt
+ai có thể giải thích dùm cách khai báo địa chị trong lệnh trêm dùm tiểu đệ kô
+tiểu đệ lưu một mãng dữ liệu rất nhiều số sau đó đọc ra từ từ ai làm rồi xin chỉ giáo

namqn
05-11-2008, 12:23 AM
Để lưu dữ liệu ở rom dùng các hàm như sau:
write_eeprom(địa chỉ,giá trị);
read_eeprom(địa chỉ);
trong khi lưu và đọc cấm tất cả các ngắt
+ai có thể giải thích dùm cách khai báo địa chị trong lệnh trêm dùm tiểu đệ kô
+tiểu đệ lưu một mãng dữ liệu rất nhiều số sau đó đọc ra từ từ ai làm rồi xin chỉ giáo
Bạn đang nói về EEPROM của PIC/dsPIC. Dung lượng EEPROM của các chip có thể khác nhau, nhưng địa chỉ luôn bắt đầu bằng 0 khi sử dụng hai hàm trên. Nếu bạn khai báo các dữ liệu hằng trong tập tin nguồn thì phải tùy vào chip bạn đang dùng mới có thể biết được địa chỉ vùng nhớ EEPROM là bao nhiêu.

Thân,

nguyenquoctoan
05-11-2008, 07:54 PM
thưa bác namq em dùng pic 18f4550,lưu 10 số vào địa chỉ add1,10 số vào địa chỉ add2,10 số vào add3,dau đó đọc số 1 từ add1,ra tiếp số 2,...được truyền từ máy tính xuống,em chưa biết phải khai báo và viết như thế nào,
nhân tiện hỏi bác namq chương trìng test các post của píc 18f4550 của em như vậy ổn kô
#include <18f4550.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#byte porta=0xf80
#byte portb=0xf81
#byte portc=0xf82
#byte portd=0xf83
#byte porte=0xf84 ///khai bao dia chi port
void main(void)
{set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);
while (1)
{ porta=0;
delay_ms(250);
porta=255;
delay_ms(250);

portb=0;
delay_ms(250);
portb=255;
delay_ms(250);


portb=0;
delay_ms(250);
portb=255;
delay_ms(250);

portc=0x00;
delay_ms(250);
portc=0xff;
delay_ms(250);


portd=0x00;
delay_ms(250);
portd=0xff;
delay_ms(250);


porte=0x00;
delay_ms(250);
porte=0xff;
delay_ms(250);

}}
sao postc có một chân kô sáng đèn,pic mới mua kô thể chết được
nhờ bác xem dùm em

namqn
05-11-2008, 08:02 PM
thưa bác namq em dùng pic 18f4550,lưu 10 số vào địa chỉ add1,10 số vào địa chỉ add2,10 số vào add3,dau đó đọc số 1 từ add1,ra tiếp số 2,...được truyền từ máy tính xuống,em chưa biết phải khai báo và viết như thế nào,
nhân tiện hỏi bác namq chương trìng test các post của píc 18f4550 của em như vậy ổn kô
#include <18f4550.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=20000000)
#byte porta=0xf80
#byte portb=0xf81
#byte portc=0xf82
#byte portd=0xf83
#byte porte=0xf84 ///khai bao dia chi port
void main(void)
{set_tris_a(0x00);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
set_tris_e(0x00);
while (1)
{ porta=0;
delay_ms(250);
porta=255;
delay_ms(250);

portb=0;
delay_ms(250);
portb=255;
delay_ms(250);


portb=0;
delay_ms(250);
portb=255;
delay_ms(250);

portc=0x00;
delay_ms(250);
portc=0xff;
delay_ms(250);


portd=0x00;
delay_ms(250);
portd=0xff;
delay_ms(250);


porte=0x00;
delay_ms(250);
porte=0xff;
delay_ms(250);

}}
sao postc có một chân kô sáng đèn,pic mới mua kô thể chết được
nhờ bác xem dùm em
Làm thế nào lưu 10 số vào một địa chỉ? Tôi không rõ ý của bạn. Nếu ô nhớ của bạn có độ dài 8-bit thì bạn chỉ có thể lưu 1 số 8-bit vào nó.

Bài viết có code kiểm tra port I/O của PIC18F4550 đã được tôi tách thành 1 luồng riêng, bạn xem danh sách các bài viết mới sẽ thấy bài viết của bạn (đã được tôi trả lời).

Thân,

nguyenquoctoan
05-11-2008, 08:10 PM
ý em là như vậy ta khai báo các địa chỉ như sau:
#define add1 0x06 // 30 byte
#define add2 0x25 // 34 byte
#define add3 0x49 // 80 byte
#define add4 0x9f // 100 byte
#define add5 0x9f //...?
trong add1 ta có 30byte,số 1 tâ lưu vào add1 nhưng ở byte1, sau đó tiếp số 2...(kô biết đúng kô),ý em muốn hỏi là sau khi lưu như vậy thì cách thức đọc ra như thế nào,

namqn
05-11-2008, 08:54 PM
ý em là như vậy ta khai báo các địa chỉ như sau:
#define add1 0x06 // 30 byte
#define add2 0x25 // 34 byte
#define add3 0x49 // 80 byte
#define add4 0x9f // 100 byte
#define add5 0x9f //...?
trong add1 ta có 30byte,số 1 tâ lưu vào add1 nhưng ở byte1, sau đó tiếp số 2...(kô biết đúng kô),ý em muốn hỏi là sau khi lưu như vậy thì cách thức đọc ra như thế nào,
Tài liệu hướng dẫn của CCS C đã có các ví dụ về cách sử dụng các hàm đọc/ghi EEPROM bên trong PIC rồi. CCS C cũng cung cấp một số ví dụ liên quan đến việc đọc/ghi EEPROM bên trong PIC, đề nghị bạn tìm đọc.

Với ví dụ của bạn, tôi có thể đọc dữ liệu như sau:
for (i = add1; i <= (add1 + 30); i++) {
bien = read_EEPROM(i);
//Thực hiện công việc gì đó với bien
}


Thân,

nguyenquoctoan
05-11-2008, 09:05 PM
em cũng làm như thế nhưng chương trinh chạy ko ok,để xem lại cái đã,cảm ơn bác namq

xuanhiendk2
13-02-2009, 02:10 PM
Cho em hỏi nếu lưu một mảng char const a[10]="XINCHAO" trong EEPROM thì khi đọc từ EEPROM ra sẽ có dạng như thế nào ạ?

namqn
13-02-2009, 06:08 PM
Cho em hỏi nếu lưu một mảng char const a[10]="XINCHAO" trong EEPROM thì khi đọc từ EEPROM ra sẽ có dạng như thế nào ạ?
Khi đọc từ EEPROM ra sẽ có dạng như bạn đã ghi vào: a[0] = 'X', a[1] = 'I', ...

Thân,

xuanhiendk2
16-02-2009, 12:19 PM
Khi đọc từ EEPROM ra sẽ có dạng như bạn đã ghi vào: a[0] = 'X', a[1] = 'I', ...

Thân,
Như thế thì nó là dạng ASCII phải ko bác?

namqn
16-02-2009, 04:23 PM
Như thế thì nó là dạng ASCII phải ko bác?
Đúng vậy. Thực ra trình biên dịch chẳng quan tâm nó là dạng gì, chỉ lặp lại 8 bit dữ liệu mà bạn đã mô tả trong phần khai báo.

Thân,

xuanhiendk2
17-02-2009, 02:39 PM
Hiển thị tiếng anh trên Led matrix thì em làm được rồi. Em dùng bảng mã ASCII sẵn có. Giờ em muốn hiển thị tiếng Việt thì làm thế nào ạ? Các bác có thể nêu thuật toán giúp em được không? Lưu ý là tất cả các mã phải được lưu trong eeprom để tiện cho việc thay đổi. Ví dụ em đang hiển thị " I LOVE YOU" muốn thay thành " ANH YÊU EM" chẳng hạn em chỉ cần khai báo Char const a[]="ANH YEEU EM"

namqn
17-02-2009, 05:49 PM
Hiển thị tiếng anh trên Led matrix thì em làm được rồi. Em dùng bảng mã ASCII sẵn có. Giờ em muốn hiển thị tiếng Việt thì làm thế nào ạ? Các bác có thể nêu thuật toán giúp em được không? Lưu ý là tất cả các mã phải được lưu trong eeprom để tiện cho việc thay đổi. Ví dụ em đang hiển thị " I LOVE YOU" muốn thay thành " ANH YÊU EM" chẳng hạn em chỉ cần khai báo Char const a[]="ANH YEEU EM"
Bạn tự tạo bảng font tiếng Việt thôi, có thể dựa vào các font 1-byte trên máy tính để tạo bảng font cho LED ma trận. Sau đó bạn mã hóa thông điệp tương thích với bảng font mới của bạn.

Thân,

xuanhiendk2
18-02-2009, 10:35 AM
Thế nhưng ví dụ chữ A, B, C... thì đều có mã ASCII để nhận biết. Còn vi dụ chữ Â thì làm gì có mã ASCII để nhận biết hả anh. Ví dụ như chữ Â được mã hóa như thế nào trong MCU ạ? Ví dụ như em muốn hiển thị chữ Â ra LMD thì em phải xuất 5 byte mã hóa của chữ Â. Vậy làm sao đê biết đó là chữ Â được?
Các chữ đã được mã hóa ASCII thì đơn giản rồi. Ví dụ chữ A chẳng hạn em trỏ đến địa chỉ 32 trong eeprom và xuất liên tiếp 5 byte a[32].b[j]

namqn
18-02-2009, 04:17 PM
Thế nhưng ví dụ chữ A, B, C... thì đều có mã ASCII để nhận biết. Còn vi dụ chữ Â thì làm gì có mã ASCII để nhận biết hả anh. Ví dụ như chữ Â được mã hóa như thế nào trong MCU ạ? Ví dụ như em muốn hiển thị chữ Â ra LMD thì em phải xuất 5 byte mã hóa của chữ Â. Vậy làm sao đê biết đó là chữ Â được?
Các chữ đã được mã hóa ASCII thì đơn giản rồi. Ví dụ chữ A chẳng hạn em trỏ đến địa chỉ 32 trong eeprom và xuất liên tiếp 5 byte a[32].b[j]
Bạn cho biết đoạn code mà bạn đã dùng để hiển thị tiếng Anh trên LED ma trận, tôi sẽ dựa vào đó mà giúp bạn ý tưởng (bạn chưa nắm được ý tưởng về việc tự tạo bảng font để dùng với LED ma trận).

Thân,

xuanhiendk2
18-02-2009, 04:25 PM
Đây là bảng mã:
typedef struct {
int8 b[5]; /* Data */
}T_font;
const T_font font[]={
//******************BANG MA ASCII****************
//ascii_code:
0xFF,0xFF,0xFF,0xFF,0xFF,//SPACE 0
0xFF,0xFF,0xA0,0xFF,0xFF,//! 1
0xFF,0xFF,0xF8,0xF4,0xFF,//' 2
0xEB,0x80,0xEB,0x80,0xEB,//# 3
0xDB,0xD5,0x80,0xD5,0xED,//$ 4
0xD8,0xEA,0x94,0xAB,0x8D,//% 5
0xC9,0xB6,0xA9,0xDF,0xAF,//& 6
0xFF,0xFF,0xF8,0xF4,0xFF,//' 7
0xFF,0xE3,0xDD,0xBE,0xFF,//( 8
0xFF,0xBE,0xDD,0xE3,0xFF,//) 9
0xD5,0xE3,0x80,0xE3,0xD5,//* 10
0xF7,0xF7,0xC1,0xF7,0xF7,//+ 11
0xFF,0xA7,0xC7,0xFF,0xFF,//, 12
0xF7,0xF7,0xF7,0xF7,0xF7,//- 13
0xFF,0x9F,0x9F,0xFF,0xFF,//x 14
0xFF,0xC9,0xC9,0xFF,0xFF,/// 15
0xC1,0xAE,0xB6,0xBA,0xC1,//0 16
0xFF,0xBD,0x80,0xBF,0xFF,//1 17
0x8D,0xB6,0xB6,0xB6,0xB9,//2 18
0xDD,0xBE,0xB6,0xB6,0xC9,//3 19
0xE7,0xEB,0xED,0x80,0xEF,//4 20
0xD8,0xBA,0xBA,0xBA,0xC6,//5 21
0xC3,0xB5,0xB6,0xB6,0xCF,//6 22
0xFE,0x8E,0xF6,0xFA,0xFC,//7 23
0xC9,0xB6,0xB6,0xB6,0xC9,//8 24
0xF9,0xB6,0xBE,0xD6,0xE1,//9 25
0xFF,0xC9,0xC9,0xFF,0xFF,//: 26
0xFF,0xA4,0xC4,0xFF,0xFF,//// 27
0xF7,0xEB,0xDD,0xBE,0xFF,//< 28
0xEB,0xEB,0xEB,0xEB,0xEB,//= 29
0xFF,0xBE,0xDD,0xEB,0xF7,//> 30
0xFD,0xFE,0xAE,0xF6,0xF9,//? 31
0xCD,0xB6,0x8E,0xBE,0xC1,//@ 32
0x83,0xF5,0xF6,0xF5,0x83,//A 33
0xBE,0x80,0xB6,0xB6,0xC9,//B 34
0xC1,0xBE,0xBE,0xBE,0xDD,//C 35
0xBE,0x80,0xBE,0xBE,0xC1,//D 36
0x80,0xB6,0xB6,0xB6,0xBE,//E 37
0x80,0xF6,0xF6,0xFE,0xFE,//F 38
0xC1,0xBE,0xB6,0xB6,0xC5,//G 39
0x80,0xF7,0xF7,0xF7,0x80,//H 40
0xFF,0xBE,0x80,0xBE,0xFF,//I 41
0xDF,0xBF,0xBE,0xC0,0xFE,//J 42
0x80,0xF7,0xEB,0xDD,0xBE,//K 43
0x80,0xBF,0xBF,0xBF,0xFF,//L 44
0x80,0xFD,0xF3,0xFD,0x80,//M 45
0x80,0xFD,0xFB,0xF7,0x80,//N 46
0xC1,0xBE,0xBE,0xBE,0xC1,//O 47
0x80,0xF6,0xF6,0xF6,0xF9,//P 48
0xC1,0xBE,0xAE,0xDE,0xA1,//Q 49
0x80,0xF6,0xE6,0xD6,0xB9,//R 50
0xD9,0xB6,0xB6,0xB6,0xCD,//S 51
};
//Phan tu hai
const T_font font2[]={
0xFE,0xFE,0x80,0xFE,0xFE,//T 52
0xC0,0xBF,0xBF,0xBF,0xC0,//U 53
0xE0,0xDF,0xBF,0xDF,0xE0,//V 54
0xC0,0xBF,0xCF,0xBF,0xC0,//W 55
0x9C,0xEB,0xF7,0xEB,0x9C,//X 56
0xFC,0xFB,0x87,0xFB,0xFC,//Y89 24 57
0x9E,0xAE,0xB6,0xBA,0xBC,//Z90 25 58
0xFF,0x80,0xBE,0xBE,0xFF,//[ 59
0xFD,0xFB,0xF7,0xEF,0xDF,//\ 60
0xFF,0xBE,0xBE,0x80,0xFF,//] 61
0xFB,0xE1,0xE0,0xE1,0xFB,//^ 62
0x7F,0x7F,0x7F,0x7F,0x7F,//_ 63
0xFF,0xFF,0xF8,0xF4,0xFF,//' 64
0xDF,0xAB,0xAB,0xAB,0xC7,//a 65
0x80,0xC7,0xBB,0xBB,0xC7,//b
0xFF,0xC7,0xBB,0xBB,0xBB,//c
0xC7,0xBB,0xBB,0xC7,0x80,//d
0xC7,0xAB,0xAB,0xAB,0xF7,//e 69
0xF7,0x81,0xF6,0xF6,0xFD,//f
0xF7,0xAB,0xAB,0xAB,0xC3,//g 71
0x80,0xF7,0xFB,0xFB,0x87,//h 72
0xFF,0xBB,0x82,0xBF,0xFF,//i 73
0xDF,0xBF,0xBB,0xC2,0xFF,//j 74
0xFF,0x80,0xEF,0xD7,0xBB,//k 75
0xFF,0xBE,0x80,0xBF,0xFF,//l 76
0x83,0xFB,0x87,0xFB,0x87,//m 77
0x83,0xF7,0xFB,0xFB,0x87,//n 78
0xC7,0xBB,0xBB,0xBB,0xC7,//o 79
0x83,0xEB,0xEB,0xEB,0xF7,//p 80
0xF7,0xEB,0xEB,0xEB,0x83,//q 81
0x83,0xF7,0xFB,0xFB,0xF7,//r 82
0xB7,0xAB,0xAB,0xAB,0xDB,//s 83
0xFF,0xFB,0xC0,0xBB,0xBB,//t 84
0xC3,0xBF,0xBF,0xDF,0x83,//u 85
0xE3,0xDF,0xBF,0xDF,0xE3,//v 86
0xC3,0xBF,0xCF,0xBF,0xC3,//w 87
0xBB,0xD7,0xEF,0xD7,0xBB,//x 88
0xF3,0xAF,0xAF,0xAF,0xC3,//y 89
0xBB,0x9B,0xAB,0xB3,0xBB,//z 90
0xFB,0xE1,0xE0,0xE1,0xFB,//^ 92
0xE3,0xE3,0xC1,0xE3,0xF7,//->93
0xF7,0xE3,0xC1,0xE3,0xE3,//<-94
0xEF,0xC3,0x83,0xC3,0xEF,//95
0xFF,0xFF,0xFF,0xFF,0xFF//BLANK CHAR 96
};
// End of code table
Đây là đoạn code lấy mã chữ và dịch Ram:

void copy_2_ram2(int8 index_char) {

int8 i,j;

for (j=0;j<=5;j++)
{
for (i=90;i>0;i--) // Dich RAM
buff_disp[i]= buff_disp[i-1]; //Dich RAM sang trai
buff_disp[0]=font2[index_char].b[j]; //Luu ma ascii vao RAM
display(); // Goi hien thi
}
buff_disp[0]=0xff; // Them mot khoang trang giua hai ky tu
}

void copy_2_ram1(int8 index_char) {
int8 i,j;

for (j=0;j<=5;j++)
{ // Dich RAM
for (i=90;i>0;i--)
buff_disp[i]= buff_disp[i-1]; // Dich RAM sang trai
buff_disp[0]=font[index_char].b[j]; // Luu ma ascii vao RAM
display(); // Goi hien thi

}
buff_disp[0]=0xff;
}
Mong bác giúp đỡ

namqn
19-02-2009, 05:23 PM
Như vậy là bạn đã biết cách tạo font cho LED ma trận. Vấn đề còn lại là chọn phương pháp hiện thực font 1-byte tiếng Việt cho thuận lợi khi viết code thôi.

Với font 1-byte, bạn có thể có tối đa 256 ký tự trong một bảng font, và phần bảng mã ASCII mà bạn đã hiện thực mới chiếm có 97 ký tự, do đó bạn vẫn còn một số mã chưa dùng để hiện thực các ký tự tiếng Việt có dấu.

Các lý do mà tôi khuyên bạn dựa vào bảng font tiếng Việt 1-byte trên máy tính:
- Thuận lợi khi viết code trên máy tính, vì bạn có thể chọn bảng mã font với bộ gõ tiếng Việt để nhập các chuỗi hằng vào chương trình
- Tương thích với các host PC, khi bạn muốn dùng một chương trình trên host PC để truyền các thông điệp cần hiển thị lên LED (qua một giao tiếp nào đó như RS-232, USB, ...)

Tham khảo trang web sau về các bảng mã tiếng Việt: http://vietunicode.sourceforge.net/charset/, xét ví dụ bảng mã VISCII (là bảng mã chỉ sử dụng 1 byte. Giả sử bây giờ bạn muốn hiện thực ký tự "â" (mã 0xE2 = 226 trong bảng mã VISCII). Bạn chỉ cần lấy 5 byte cho ký tự "a" trong bảng font của bạn, sửa lại để hiển thị "â" trên LED, và đặt vào vị trí tương ứng với địa chỉ 226 trong bảng font của bạn, là có thể hiển thị ký tự đó trên LED ma trận của bạn.

Làm tương tự cho các ký tự khác, theo như bảng mã VISCII, và sau đó bạn có thể dùng một host PC để gửi các thông điệp tiếng Việt mã hóa theo bảng mã VISCII từ máy tính đến vi điều khiển để hiển thị lên LED ma trận.

Thân,

xuanhiendk2
20-02-2009, 11:36 AM
Như vậy là bạn đã biết cách tạo font cho LED ma trận. Vấn đề còn lại là chọn phương pháp hiện thực font 1-byte tiếng Việt cho thuận lợi khi viết code thôi.

Với font 1-byte, bạn có thể có tối đa 256 ký tự trong một bảng font, và phần bảng mã ASCII mà bạn đã hiện thực mới chiếm có 97 ký tự, do đó bạn vẫn còn một số mã chưa dùng để hiện thực các ký tự tiếng Việt có dấu.

Các lý do mà tôi khuyên bạn dựa vào bảng font tiếng Việt 1-byte trên máy tính:
- Thuận lợi khi viết code trên máy tính, vì bạn có thể chọn bảng mã font với bộ gõ tiếng Việt để nhập các chuỗi hằng vào chương trình
- Tương thích với các host PC, khi bạn muốn dùng một chương trình trên host PC để truyền các thông điệp cần hiển thị lên LED (qua một giao tiếp nào đó như RS-232, USB, ...)

Tham khảo trang web sau về các bảng mã tiếng Việt: http://vietunicode.sourceforge.net/charset/, xét ví dụ bảng mã VISCII (là bảng mã chỉ sử dụng 1 byte. Giả sử bây giờ bạn muốn hiện thực ký tự "â" (mã 0xE2 = 226 trong bảng mã VISCII). Bạn chỉ cần lấy 5 byte cho ký tự "a" trong bảng font của bạn, sửa lại để hiển thị "â" trên LED, và đặt vào vị trí tương ứng với địa chỉ 226 trong bảng font của bạn, là có thể hiển thị ký tự đó trên LED ma trận của bạn.

Làm tương tự cho các ký tự khác, theo như bảng mã VISCII, và sau đó bạn có thể dùng một host PC để gửi các thông điệp tiếng Việt mã hóa theo bảng mã VISCII từ máy tính đến vi điều khiển để hiển thị lên LED ma trận.

Thân,

Anh namqn ơi. Trong Pic mình có khai báo chữ tiếng việt được ko? Và nếu sử dụng bảng mã VISCII như anh nói thì Pic có nhận biết được nó không? Hay Pic chỉ nhận biết được mã ASCII thôi?

namqn
20-02-2009, 05:07 PM
Anh namqn ơi. Trong Pic mình có khai báo chữ tiếng việt được ko? Và nếu sử dụng bảng mã VISCII như anh nói thì Pic có nhận biết được nó không? Hay Pic chỉ nhận biết được mã ASCII thôi?
PIC chỉ coi chúng là dữ liệu 8-bit, ASCII hay VISCII gì đều chỉ là các giá trị 8-bit. Việc hiển thị là để người dùng đọc và hiểu được, chứ đối với bản thân vi điều khiển thì mọi thứ chỉ đều là một chuỗi các giá trị '0' và '1'.

Thân,

xuanhiendk2
21-02-2009, 11:53 AM
PIC chỉ coi chúng là dữ liệu 8-bit, ASCII hay VISCII gì đều chỉ là các giá trị 8-bit. Việc hiển thị là để người dùng đọc và hiểu được, chứ đối với bản thân vi điều khiển thì mọi thứ chỉ đều là một chuỗi các giá trị '0' và '1'.

Thân,

Vâng để em tìm hiểu thêm. Nhưng mà anh ơi làm sao viết được tiếng việt trong CCS hả anh? Chẳng lẽ muốn viết chữ Â lại phải viết hai chữ A à? Như thế thì khó xử lý hơn rất nhiều.

namqn
21-02-2009, 09:10 PM
Vâng để em tìm hiểu thêm. Nhưng mà anh ơi làm sao viết được tiếng việt trong CCS hả anh? Chẳng lẽ muốn viết chữ Â lại phải viết hai chữ A à? Như thế thì khó xử lý hơn rất nhiều.
Có lẽ CCS C không hiển thị được tiếng Việt bằng font VISCII đâu. Bạn dùng phần mềm xử lý văn bản nào mà cho phép chọn font VISCII (MS Word chẳng hạn), rồi bạn chọn một font VISCII (tất nhiên là máy tính đã cài đặt font VISCII rồi), sau đó cấu hình bộ gõ tiếng Việt để dùng bảng mã của VISCII. Như vậy bạn sẽ có thể gõ các thông điệp tiếng Việt theo bảng mã VISCII, và dùng phần mềm soạn thảo để kiểm tra sự chính xác của thông điệp. Sau đó bạn có thể copy và paste thông điệp đó vào source code trong CCS C (bạn có lẽ sẽ không đọc được thông điệp đó trong CCS C, nhưng trên LED ma trận thì thông điệp đó sẽ là tiếng Việt theo bảng mã VISCII).

Thân,

xuanhiendk2
23-02-2009, 10:17 AM
Vâng nói chung là kiến thức của em còn hạn chế quá. Em cũng chưa hiểu lắm. Để em thử xem. Cảm ơn anh rất nhiều vì những bài viết bổ ích.

saoden1102
25-02-2009, 12:58 PM
Bác Nampn ơi cho em hỏi với a. em dùng 2 hàm để ghi dữ liệu vào eeprom ngoài (24c512) mà sao ko được(nó bị ghi vào rom trong của pic) anh có cách nào ko giúp em với a.

void write_eeprom(long int address,unsigned char data)
{
int upper_addr;
int lower_addr;
upper_addr=(int)(address >> 8);
lower_addr=(int)(address & 0x00FF);

i2c_start();
i2c_write(0xa0);
i2c_write(upper_addr);
i2c_write(lower_addr);
i2c_write(data);
i2c_stop();
delay_ms(11);
}

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

unsigned char read_eeprom(long int address)
{
unsigned char data;
int upper_addr;
int lower_addr;
upper_addr=(int)(address >> 8);
lower_addr=(int)(address & 0x00FF);

i2c_start();
i2c_write(0xa0);
i2c_write(upper_addr);
i2c_write(lower_addr);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}

namqn
25-02-2009, 04:16 PM
Bác Nampn ơi cho em hỏi với a. em dùng 2 hàm để ghi dữ liệu vào eeprom ngoài (24c512) mà sao ko được(nó bị ghi vào rom trong của pic) anh có cách nào ko giúp em với a.

void write_eeprom(long int address,unsigned char data)
{
int upper_addr;
int lower_addr;
upper_addr=(int)(address >> 8);
lower_addr=(int)(address & 0x00FF);

i2c_start();
i2c_write(0xa0);
i2c_write(upper_addr);
i2c_write(lower_addr);
i2c_write(data);
i2c_stop();
delay_ms(11);
}

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

unsigned char read_eeprom(long int address)
{
unsigned char data;
int upper_addr;
int lower_addr;
upper_addr=(int)(address >> 8);
lower_addr=(int)(address & 0x00FF);

i2c_start();
i2c_write(0xa0);
i2c_write(upper_addr);
i2c_write(lower_addr);
i2c_start();
i2c_write(0xa1);
data=i2c_read(0);
i2c_stop();
return(data);
}
Bạn đang dùng trình biên dịch nào? Nếu bạn dùng CCS C thì các hàm của bạn có vẻ trùng tên với các hàm đọc, ghi EEPROM của trình biên dịch. Bạn nên xem ví dụ giao tiếp với EEPROM ngoài của CCS C (tập tin ex_extee.c, họ dùng các hàm có sẵn là READ_EXT_EEPROM() và WRITE_EXT_EEPROM()).

Thân,

saoden1102
25-02-2009, 10:41 PM
Vâng em cảm ơn Anh nhiều, em đang xem lại đây a.

rikimaru87
14-10-2009, 10:54 AM
bạn cho mình xem sơ đồ kết nối i2c của ban dc ko

thienanh0000
04-04-2011, 12:50 PM
undefinedBạn đang nói về EEPROM của PIC/dsPIC. Dung lượng EEPROM của các chip có thể khác nhau, nhưng địa chỉ luôn bắt đầu bằng 0 khi sử dụng hai hàm trên. Nếu bạn khai báo các dữ liệu hằng trong tập tin nguồn thì phải tùy vào chip bạn đang dùng mới có thể biết được địa chỉ vùng nhớ EEPROM là bao nhiêu.

Thân,
Anh nam cho em hỏi , nếu dùng hai hàm trên để ghi và đọc EEPROM thì địa chỉ luôn bắt đầu từ 0. Nhưng thấy trong phân giới thiệu datasheet của pic8F thì đúng
"The 10-bit range of the pair
can address a memory range of 1024 bytes (00h to
3FFh)."
Con DSPIC30 thì nó giới thiệu như sau
"The dsPIC30F4011/4012 devices have 1 Kbyte (512
words) of data EEPROM, with an address range from
0x7FFC00 to 0x7FFFFE." . hoặc " The dsPIC30F6010 device has 8 Kbytes (4K words) of
data EEPROM, with an address range from 0x7FF000
to 0x7FFFFE. "
Vậy với DSPIC này nếu dùng hai hàm trên để đọc và ghi EEPROM ở DSPIC30 thì dịa chỉ có bắt đầu từ 0x000000 hay bắt đầu từ 0x7FFC00 (ở dsPIC30F4011) và bắt đầu từ 0x7FF000 ( ở dòng dsPIC30F6010) ?
Thanks !
Còn vấn đề nửa , em xem khá nhiều datasheet của pic dong 16 , 18 , dsPIC30 , hầu hết điều có giới thiệu "address range " của EEPROM trong phần DATA EEPROM. Nhưng riêng mỗi con 18F4550 ,lại chẳng thấy giới thiệu .
Cũng liên quan đến EEPROM, nhưng ngoài luồng xíu , anh Nam cho em hỏi, e có làm mạch pickit2 full theo sơ đồ của MCHP đã chạy rồi. Trong đó em dùng 2 con EEPROM 24LC512 , đã chạy được chức năng Program to go. Em xem datasheet thấy con AT24C512B có vị trí chân và địa chỉ device (1,0,1,0,A2,A1,A0) , bộ nhớ thì 2 con như nhau 512Kbit. Con AT24C512B rẻ hơn xíu . Anh cho em hỏi mình có thể thay thế 24LC512 bằng AT24C512B để lắp vào PICKIT2 không ?
Thanks anh nhiều .