CHƢƠNG 4: KHẢO SÁT VỀ GIAO TIẾP NGOẠI VI 4.1 SWITCH VÀ LED ĐƠN 4.1 SWITCH VÀ LED ĐƠN
Trong phần này sử dụng giao tiếp I/O hiển thị sự thay đổi của switch lên LED tương ứng. Sử dụng 4 Switch (từ Switch 0 đến Switch 3). Khi ấn Switch 0 thì hiển thị LED xanh lá, ấn Switch 1 thì hiển thị LED xanh dương, ấn Switch 2 thì hiển thị LED đỏ và ấn Switch 3 thì hiển thị LED RGB.
Trước tiên, ta tạo một project mới và đặt tên cho nó. Kế đến chọn họ và thiết bị.
Hình 4.1-1 Chọn nơi lưu, đặt tên project và tên thư mục
Hình 4.1-2: Chọn họ và thiết bị
Bước đầu chọn nơi lưu trữ coi như đã hoàn tất, tiếp theo là phần xây dựng hệ thống nhúng bằng SOPC Builder. Trên thanh công cụ Quartus II chọn Tools/SOPC Builder và xuất hiện hộp thoại để đặt tên cho hệ thống.
Đầu tiên của xây dựng hệ thống là thiết kế phần CPU. Chọn Processor/Nios II Processor:
Tiếp theo là phần xây dựng bộ nhớ cho hệ thống để chứa lệnh và dữ liệu. Chọn Memories and Memory Controllers/On-Chip/On-Chip Memory (RAM or ROM). Sau khi tạo bộ nhớ RAM, quay lại CPU để gán bộ nhớ cho nó.
Hình 4.1-6: Gán bộ nhớ RAM cho CPU
Tiếp theo, ta chọn Interface Protocols/Serial/JTAG UART để kết nối dữ liệu từ máy tính đến board DE3 (Hình 4.1-7). Chọn Peripherals/Debug and Performance/ System ID Perpheral để nhận dạng hệ thống phần cứng (Hình 4.1-8).
Hình 4.1-7: Chọn JTAG
Hình 4.1-8: Chọn System ID
Trong phần giao thức PIO sẽ thiết kế bốn mạch kết nối gồm: 1 đầu vào 4 bit (switch), 1 đầu ra 8 bit (LED xanh), 1 đầu ra 8 bit (LED đỏ) và 1 đầu ra 8 bit (LED xanh dương). Chọn Peripherals/Microcontroller Peripherals/PIO (Parallel I/O).
Hình 4.1-9: Cấu hình PIO
Để biên dịch hệ thống, ta cần gán địa chỉ nền cho các core đã thiết kế. Chọn System/Auto-Assign Base Addresses để định lại địa chỉ nền cho các module. Kết quả sau khi gán địa chỉ nền (Hình 4.1-10).
Hình 4.1-10: Hệ thống nhúng xây dựng bằng SOPC Builder
Sau khi hoàn tất chọn Gernerate và biên dịch hệ thống thành công, bắt đầu gán chân cho hệ thống, trước khi gán chân, ta chọn Files/ Add/Remove Files in Project chọn file nios_sys.v.
Hình 4.1-11: Thêm file nios_sys.v
Tiếp theo, ta chọn File/New chọn Block Diagram/Schematic File xuất hiện cửa sổ gán chân cho hệ thống. Vào Symbol Tool để lấy sơ đồ khối hệ thống (nios_sys) đã tạo ra từ SOPC Builder.
Hình 4.1-12: Gán chân cho hệ thống
Hình 4.1-14: Nạp xuống board thành công
Khi hoàn tất nạp xuống board DE3, ta tiến hành viết chương trình ứng dụng trên Nios II Software Build Tools for Eclipse. Ta quay lại công cụ SOPC Builder, nhấp vào Tab System Generation sẽ xuất hiện phần mềm Nios II.
Tiếp theo, tạo một project mới lưu trữ ứng dụng vào File/New/Nios II Application and BSP form temple. Để lập trình cho hệ thống phần cứng, ta sử dụng code mẫu có sẵn “Hello Word”.
Hình 4.1-16: Cửa sổ Nios II Software Build Tools for Eclipse
Chương trình ứng dụng có code mẫu, để ứng dụng có thể giao tiếp được với board ta thay thế code bên dưới cho code có sẵn.
#include "system.h" #include "io.h" int main() { int t,c;
printf("Hong Thi Hanh_1117967.\n"); printf("Pham Thi Hai Quyen_1118007.\n"); while(1) { int a=IORD(0x00041000,0); c=a&0xff; if(c==0) { for(t =0; t<100; t++) { IOWR(0x00041010,0,0xff); IOWR(0x00041020,0,0xff); IOWR(0x00041030,0,0xff); printf("ok 333"); }} if(c==1) { IOWR(0x00041010,0,0x00); printf("ok"); } if(c==2) { IOWR(0x00041020,0,0x00); printf("hello"); } if(c==4) { IOWR(0x00041030,0,0x00); printf("ok 1"); } if(c==8) { for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); IOWR(0x00041020,0,0x00); IOWR(0x00041030,0,0x00); printf("ok 2"); }}} return 0;}
Sau khi đánh code xong ta nhấp chuột phải vào project SW_LED rồi chọn Build Project để biên dịch chương trình.
Hình 4.1-18: Biên dịch chương trình
Sau khi biên dịch xong, nhấp chuột phải vào project SW_LED chọn Run As/Run Configuration để chạy chương trình.
Kết quả chạy chương trình:
Hình 4.1-21: Hiển thị giá trị LED RGB khi trượt các Switch
4.2 SWITCH VÀ LED 7 ĐOẠN
Viết chương trình đọc nội dung của các switch, hiển thị giá trị tương ứng lên LED 7 đoạn, sử dụng 4 Switch (từ Switch 0 đến Switch 3).
Trước tiên xây dựng hệ thống nhúng:
Sau khi tạo hệ thống thành công, ta bắt đầu gán chân cho hệ thống như Hình 4.2-2.
Hình 4.2-2: Gán chân cho hệ thống
Hình 4.2-3: Biên dịch thành công
Sau khi nạp thành công hệ thống phần cứng xuống Board DE3, ta sử dụng phần mềm Nios II Software Builder Tool for Eclipse để viết chương trình ứng dụng bằng ngôn ngữ C cho hệ thống phần cứng đã thiết kế. Trở lại cửa sổ Altera SOPC Builder chọn Nios II Software Build Tools for Eclipse.
Hình 4.2-4: Nạp xuống board thành công
Sau đó, tạo project mới vào File/New/Nios II Application and BSP form temple. Chương trình ứng dụng sử dụng code mẫu có sẵn và đánh đoạn code bên dưới thay thế code có sẵn.
#include "system.h" #include "io.h" int giai_ma(int a); int main()
{ int x;
printf("Hong Thi Hanh _ 1117967.\n"); printf("Pham Thi Hai Quyen _ 1118007.\n"); while(1)
{ x = IORD(0x00041010,0); IOWR(0x00041010,0,x);
IOWR(0x00041000,0,giai_ma(x)); } }
// day la module giai ma bin ra led 7 doan int giai_ma(int a)
{ int led; switch (a)
{ case 0 : led = 0x40; break; //0 case 1 : led = 0x79; break; //1 case 2 : led = 0x24; break; //2 case 3 : led = 0x30; break; //3 case 4 : led = 0x19; break; //4 case 5 : led = 0x12; break; //5 case 6 : led = 0x02; break; //6 case 7 : led = 0x78; break; //7 case 8 : led = 0x00; break; //8 case 9 : led = 0x10; break; //9
default : led = 0xff; break;} // khong sang return led; }
Sau khi đánh code xong ta biên dịch và chạy chương trình.
Hình 4.2-6: Biên dịch chương trình thành công
Để kiểm tra kết quả sau khi chạy chương trình, ta bật các Switch đểhiển thị giá trị tương ứng lên LED 7 đoạn như code đã lập trình. Ví dụ, khi bật Switch 1 và Switch 2 tương ứng với mã hex của LED 7 đoạn thì hiển thị số 6 như Hình 4.2-7.
4.3 BUTTON VÀ LED ĐƠN
Viết chương trình đọc nội dung của các button, hiển thị giá trị tương ứng lên LED RGB:
- 8 LED xanh (từ LED 0 đến LED 7) chạy hiệu ứng khi ấn button 0.
- 8 LED xanh dương (từ LED 0 đến LED 7) chạy hiệu ứng khi ấn button 1.
- 8 LED đỏ (từ LED 0 đến LED 7) chạy hiệu ứng khi ấn button 2.
- 8LED RGB chạy với 3 màu RGB khi ấn button 3. Trước tiên xây dựng hệ thống nhúng:
Hình 4.3-1: Hệ thống nhúng xây dựng bằng SOPC Builder
Sau khi tạo xong và biên dịch hệ thống thành công, bắt đầu gán chân cho hệ thống và tiến hành nạp xuống board.
Hình 4.3-2: Gán chân hệ thống
Hình 4.3-4: Nạp xuống board thành công
Sau khi nạp thành công hệ thống phần cứng xuống Board DE3, ta sử dụng phần mềm Nios II Software Builder Tool for Eclipse để viết chương trình ứng dụng bằng ngôn ngữ C cho hệ thống phần cứng đã thiết kế. Trở lại cửa sổ Altera SOPC Builder chọn Nios II Software Build Tools for Eclipse.
Chương trình ứng dụng sử dụng code mẫu có sẵn và đánh đoạn code bên dưới thay thế code có sẵn theo ý muốn.
#include "system.h" #include "io.h" int main() { int x,t,c,l; while(1) { int a=IORD(0x00041000,0); c=a&0xff; for(t=0;t<500;t++) { printf("%d \n",c); } /////////////////// if(c==15) { IOWR(0x00041000,0,0xff); for(t=0;t<40;t++){IOWR(0x00041010,0,0xff);printf("chao ban\n");} for(t=0;t<40;t++){IOWR(0x00041020,0,0xff);printf("chao ban\n");} for(t=0;t<40;t++){IOWR(0x00041030,0,0xff);printf("chao ban\n");}} //led chay tư trong ra ngoai //
if(c==14) {
for(t=0;t<40;t++){IOWR(0x00041010,0,0xc3);printf("chao ban 2 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0x81);printf("chao ban 3 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0x00);printf("chao ban 4 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0x00);printf("chao ban 5 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0x81);printf("chao ban 6 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0xc3);printf("chao ban 7 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0xe7);printf("chao ban 8 \n");} for(t=0;t<40;t++){IOWR(0x00041010,0,0xff);printf("chao ban 9 \n");}} //led cong don//
if(c==13) { for(t=0;t<50;t++){IOWR(0x00041020,0,0xfe);printf("mornning 9 \n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xfc);printf("mornning 10\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xf8);printf("mornning 1\n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0xf0);printf("mornning 9 \n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xe0);printf("mornning 9 \n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xc0);printf("mornning 10\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0x80);printf("mornning 10 n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0x00);printf("mornning 9 \n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0x00);printf("mornning 9\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0x80);printf("mornning10\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xc0);printf("mornning \n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xe0);printf("mornning 9\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xf0);printf("chao ban 9\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xf8);printf("mornning 1\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xfc);printf("mornning 1\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xfe);printf("mornning 9\n");} for(t=0;t<50;t++){IOWR(0x00041020,0,0xff);printf("mornning 8\n");} } //chay2 led// if(c==11) { for(t=0;t<40;t++){IOWR(0x00041030,0,0xfc); printf("good 1 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xf9); printf("good 2 \n");} for(t=0;t<40;t++){IOWR(0x00041030,0,0xf3); printf("good 3 \n");} for(t=0;t<40;t++){IOWR(0x00041030,0,0xe7); printf("good 4 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xcf); printf("good 5 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0x9f); printf("good 6 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0x3f); printf("good 7 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0x3f); printf("good 8 \n");} for(t=0;t<40;t++){IOWR(0x00041030,0,0x9f); printf("good 8 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xcf); printf("good 7 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xe7); printf("good 6 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xf3); printf("good 5 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xf9); printf("good 4 \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xfc); printf("good 3 \n"); }
for(t=0;t<40;t++){IOWR(0x00041030,0,0xff); printf("good 2 \n"); } } //chay xen ke//
if(c==7) {
for(t=0;t<50;t++){IOWR(0x00041010,0,0xaa); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041010,0,0x55); printf("chao ban \n"); } for(t=0;t<40;t++){IOWR(0x00041010,0,0xff); printf("helo 1 \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0xaa); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0x55); printf("chao ban \n"); } for(t=0;t<40;t++){IOWR(0x00041020,0,0xff); printf("helo 2 \n"); } for(t=0;t<50;t++){IOWR(0x00041030,0,0xaa); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041030,0,0x55); printf("chao ban \n"); } for(t=0;t<40;t++){IOWR(0x00041030,0,0xff); printf("helo 3 \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0x0f); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0xf0); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0x0f); printf("chao ban \n"); } for(t=0;t<50;t++){IOWR(0x00041020,0,0xf0); printf("chao ban \n"); } for(t=0;t<40;t++){IOWR(0x00041020,0,0xff); printf("helo 2 \n"); } } }
return 0; }
Để kiểm tra kết quả sau khi chạy chương trình thành công, ta ấn các Button để LED chạy các hiệu ứng theo như code đã lập trình.
4.4 BUTTON VÀ LED 7 ĐOẠN
Viết chương trình đọc nội dung của các button, hiển thị giá trị tương ứng lên 2 LED 7 đoạn . Sử dụng 4 button (từ button 0 đến 3), đếm lên khi ấn button 0, đếm xuống khi ấn button 1, đếm lên chẵn khi ấn button 2 và đếm lên lẽ khi ấn button 3.
Đầu tiên xây dựng hệ thống nhúng:
Hình 4.4-1: Hệ thống nhúng xây dựng bằng SOPC Builder
Sau khi tạo hệ thống thành công hoàn tất, ta bắt đầu gán chân cho hệ thống và tiến hành nạp xuống board DE3.
Hình 4.4-2: Gán chân hệ thống
Sau khi nạp thành công hệ thống phần cứng xuống Board DE3, ta sử dụng phần mềm Nios II Software Builder Tool for Eclipse để viết chương trình ứng dụng bằng ngôn ngữ C cho hệ thống phần cứng đã thiết kế. Trở lại cửa sổ Altera SOPC Builder chọn Nios II Software Build Tools for Eclipse.
Chương trình ứng dụng sử dụng code mẫu có sẵn và đánh đoạn code bên dưới thay thế code có sẵn.
#include "system.h" #include "io.h" //#include "altera_avalon_pio_reg.h" int main() { int x,c,t,num=0; while(1) { int a=IORD(0x00041000,0); c=a&0xff; for(t=0;t<500;t++) { printf("%d \n",c); } if(c==15) { IOWR(0x00041010,0,0xff); printf("ok"); IOWR(0x00041020,0,0xff); printf("ok");} if(c==14)
{ for(num =0; num <100;num ++)
{for(t=0;t<100;t++) {IOWR(0x00041020,0,0x40); printf("hello 1 \n"); /// for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 1 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 3 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 5 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 4 \n"); }} ////////////////chuc 10///////////////
for(t=0;t<100;t++) {IOWR(0x00041020,0,0x79); printf("hello 2 \n"); /// for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 1 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 3 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 5 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041020,0,0x24); printf("hello 3 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 1 \n");}} break;
//////ket button 0////// }}
{ for(num =100; num > 0;num--)
{for(t=0;t<100;t++) {IOWR(0x00041020,0,0x24); printf("hello 3 \n");} for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 1 \n");} for(t=0;t<100;t++) {IOWR(0x00041020,0,0x79); printf("hello 3 \n"); for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 1 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 3 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 5 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 4 \n"); }}
for(t=0;t<100;t++){IOWR(0x00041020,0,0x40); printf("hello 3 \n");
/////////
for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 1 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 3 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 5 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 4 \n"); }} break;}
//////////////ket button 1////// }
if(c==11)
{ for(num =100; num > 0;num--)
{ for(t=0;t<100;t++) {IOWR(0x00041020,0,0x24); printf("hello 1 \n");
for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 4 \n");} } ///
for(t=0;t<100;t++) {IOWR(0x00041020,0,0x79); printf("hello 1 \n"); for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 4 \n"); }} for(t=0;t<100;t++) {IOWR(0x00041020,0,0x40); printf("hello 1 \n"); for(t=0;t<100;t++) {IOWR(0x00041010,0,0x00); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x02); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x19); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x24); printf("chao ban 4 \n"); }
for(t=0;t<100;t++) {IOWR(0x00041010,0,0x40); printf("chao ban 4 \n"); }} break;}
//////////////ket button 2////// }
if(c==7)
{ for(num =100; num > 0;num--)
{ for(t=0;t<100;t++) {IOWR(0x00041020,0,0x40); printf("hello 1 \n"); /// for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 4 \n"); }} for(t=0;t<100;t++) {IOWR(0x00041020,0,0x79); printf("hello 1 \n"); /// for(t=0;t<100;t++) {IOWR(0x00041010,0,0x79); printf("chao ban 2 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x30); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x12); printf("chao ban 6 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x78); printf("chao ban 4 \n"); } for(t=0;t<100;t++) {IOWR(0x00041010,0,0x10); printf("chao ban 4 \n"); }} break; }
//////////////ket button 3////// }
//////////////ket toan phan/////////// }}
Để kiểm tra kết quả sau khi chạy chương trình thành công, ta ấn các Button để LED 7 đoạn chạy đếm theo như code đã lập trình.
CHƢƠNG 5: ỨNG DỤNG ĐỌC DỮ LIỆU TỪ SD CARD 5.1 GIỚI THIỆU SD CARD 5.1 GIỚI THIỆU SD CARD
5.1.1 Sơ lƣợc SD Card
SD Card là một thiết bị lưu trữ phổ biến hiện nay trên nhiều thiết bị khác nhau (máy nghe nhạc, điện thoại, máy ảnh kỹ thuật số, …). SD Card sử dụng công nghệ flash để ghi xóa bộ nhớ đáp ứng bảo mật, công suất, hiệu suất và các yêu cầu về môi trường vốn có trong thế hệ tiếp theo điện thoại di động và các thiết bị điện tử.
5.1.2 Sơ đồ chân
SD Card có 9 chân, hoạt động tần số tối đa có thể lên đến 25 MHz (ở chế độ mặc định) hoặc lên đến 50 MHz (ở chế độ tốc độ cao). Điện áp hoạt động trong khoảng từ 2,7 V đến 3,6 V và dung lượng tối đa khoảng từ 4 MB đến GB.
Hình 5.1-1: Sơ đồ chân SD Card Bảng 5.1.1: Sơ đồ chân SD Card Bảng 5.1.1: Sơ đồ chân SD Card
Chân Chế độ SD Mô tả
1 CD/DAT3 Phát hiện thẻ/Đường dữ liệu [Bit 3]
2 CMD Lệnh/phản hồi
3 VSS1 Mass
4 VDD Nguồn
5 CLK Clock
6 VSS2 Mass
7 DAT0 Đường dữ liệu [ Bit 0]
8 DAT1 Đường dữ liệu [ Bit 1]
9 DAT2 Đường dữ liệu [ Bit 2]
Bảng 5.1.2: Các thanh ghi SD Card
Tên Mô tả
OCR Điều kiện hoạt động thanh ghi
CID Mã số thẻ: Số thẻ cá nhân để nhận diện
RCA Địa chỉ thẻ tương đối: địa chỉ hệ thống cục bộ của thẻ, tự động được đề xuất bởi các thẻ và được chấp thuận bởi các máy chủ trong suốt quá trình khởi tạo
CSD Thẻ dữ liệu cụ thể: thông tin về các điều kiện hoạt động thẻ
SCR Thông tin về các khả năng đặc biệt của SD Card
5.1.3 Chế độ của SD Card
SD Mode: Hỗ trợ SD Card trong chế độ SD Bus (1 bit). Gồm một số port chính sau:
CMD: tín hiệu 2 chiều lệnh/phản hồi, tín hiệu hai chiều này được sử dụng để khởi tạo thẻ và chuyển các lệnh dữ liệu. Các lệnh được gửi từ các bus SD chủ đến thẻ và đáp ứng được trả về từ các thẻ đến máy chủ. Mỗi thẻ lệnh được đi trước bởi một bit bắt đầu (0) và đã thành công bằng một bit cuối (1). Tổng chiều dài là 48 bit. Mỗi thẻ được bảo vệ bởi các bit CRC để các lỗi truyền dẫn có thể được phát hiện và các hoạt động có thể được lặp đi lặp lại. Các thẻ phản hồi có một trong bốn chương trình mã hóa, tùy thuộc vào nội dung của nó. Chiều dài thẻ hoặc 48 bit hoặc 136 bit.
Hình 5.1-3: Định dạng phản hồi
DAT[3 : 0]: Dữ liệu hai chiều. Các tín hiệu DAT hoạt động ở chế độ push pull. Chỉ có một thẻ hoặc máy chủ điều khiển tín hiệu này tại một thời điểm. Dữ liệu luôn được truyền theo từng khối (block), kết thúc mỗi khối là CRC. Bit CRC được tính toán và kiểm tra cho mỗi đường DAT riêng lẻ. Các thẻ gửi các máy chủ phản ứng tình trạng CRC và chỉ bận rộn trên chỉ DAT0, DAT1-DAT3 trong thời kỳ đó thì không quan tâm.
Hình 5.1-4: Định dạng dữ liệu
Thẻ SD có thể sử dụng hoặc một đường dữ liệu (DAT0) hoặc bốn đường dữ liệu (DAT0-DAT3) để truyền dữ liệu. Tốc độ truyền dữ liệu tối đa cho một dòng dữ liệu duy nhất là 50 Mb/s và 200 Mb (25 MB) mỗi giây.
CLK: Máy chủ đến xung đồng hồ SD Card. Với mỗi chu kỳ của tín hiệu này, việc chuyển giao một bit trên các lệnh và các dòng dữ liệu được thực hiện. Các tần số có thể thay đổi giữa 0 và tần số xung đồng