b, Định địa chỉ vòng
1.2.6 Ngắt và cơ chế phục vụ ngắt
1.2.6.1 Các loại ngắt
Có ba loại ngắt bao gồm: - Reset
- Ngắt không che được NMI - Ngắt che được
*
Ngắt Reset:
Reset là ngắt có mức ưu tiên cao nhất đặt CPU về trạng thái đã biết. Ngắt reset là ngắt duy nhất: - Tích cực ở mức thấp.
- Tồn tại ở trạng thái mức thấp trong 10 chu kỳ xung nhịp trước khi lên mức cao để đặt CPU về trạng thái xác định.
- Gói lệnh FP (Fetch Packet) phục vụ ngắt reset phải đặt ở địa chỉ 0.
- Không bị ảnh hưởng bởi các lệnh rẽ nhánh.
*
Ngắt không che được NMI:
NMI là ngắt có mức ưu tiên cao thứ hai sau reset và thường được sử dụng để cảnh báo CPU những vấn đề nghiêm trọng của phần cứng như lỗi về nguồn.
Để ngắt không che được NMI được phép xảy ra khi bit cho phép ngắt NMIE bằng 1. NMIE được xóa về 0 khi reset để tránh ngăn cản ngắt Reset. Khơng thể xóa NMIE bằng phần mềm, nhưng có thể đặt NMIE. Trong khi NMIE bị xóa, các ngắt che được INT4 - INT15 bị cấm.
*
Ngắt che được (INT4 – INT15):
Các ngắt này có mức ưu tiên thấp hơn so với ngắt Reset và ngắt NMI. Các ngắt này có thể được gán cho các thiết bị ngoài, ngoại vi on-chip, điều khiển phần mềm hoặc không sử dụng.
Để một ngắt che được được xử lý phải thỏa mãn các điều kiện sau: - Bit cho phép ngắt chung GIE bằng 1
- Bit NMIE trong thanh ghi cho phép ngắt IER đặt bằng 1 - Bit cho phép ngắt tương ứng trong thanh ghi IER đặt bằng 1
- Ngắt tương ứng xảy ra đặt bit tương ứng trong thanh ghi cờ ngắt IFR lên 1 và khơng có cờ ngắt có mức ưu tiên cao hơn bằng 1 trong thanh ghi IFR
Bảng 1.7: Thứ tự ưu tiên ngắt
a, Các thanh ghi điều khiển ngắt
Có 8 thanh ghi điều khiển ngắt bao gồm:
+ IER (Interrupt Enable Register) thanh ghi cho phép ngắt chứa bit cho phép ngắt chung GIE
+ IFR (Interrupt Flag Register) thanh ghi cờ ngắt chứa các cờ ngắt. Cờ ngắt tự động bật lên 1 khi có một ngắt tương ứng xảy ra và được xóa về khơng bằng phần mềm hoặc lệnh trở về chương trình phục vụ ngắt.
+ ISR (Interrupt Set Register) thanh ghi đặt cờ ngắt
+ CSR (Control Status Register) thanh ghi điều khiển ngắt chứa bit cho phép ngắt (GIE) và các bit điều khiển/trạng thái khác
+ ISTP (Interrupt Service Table Pointer) thanh ghi con trỏ tới bảng chương trình phục vụ ngắt
+ IRP (Interrupt Return Pointer) thanh ghi chứa địa chỉ quay trở về từ ngắt che được. Địa chỉ này được thiết lập qua lệnh B IRP.
+ ICR (Interrupt Clear Register) thanh ghi xóa cờ ngắt
+ NRP (Nonmaskable Interrupt Return Pointer): Chứa địa chỉ quay trở về từ ngắt không che được. Sự trở về này được thiết lập qua lệnh B NRP.
b, Bảng vector phục vụ ngắt
Khi CPU bắt đầu xử lý một ngắt, nó tham chiếu tới bảng phục vụ ngắt IST (Interrupt Service Table). IST là một bảng của các gói lệnh chứa mã phục vụ các ngắt. IST bao gồm 16 gói FP liên tục. Mỗi gói ISFP (Interrupt Service Fetch Packet) chứa tám lệnh. Một chương trình phục vụ ngắt đơn giản có thể đặt vừa bên trong một ISFP độc lập. Bởi vì mỗi FP chứa tám lệnh 32 bit, mỗi địa chỉ trong bảng được tăng 32 byte (20h) từ địa chỉ liền kề. Địa chỉ và nội dung của IST được chỉ ra trong hình sau.
Bảng 1.8: Bảng địa chỉ các ngắt
Bảng vector ngắt được sử dụng khi một ngắt bắt đầu. Mỗi vị trí có độ dài 32 byte tương ứng với một gói lệnh FP. Địa chỉ bên phía phải bảng tương ứng với địa chỉ offset của một ngắt cụ thể.
Gói lệnh Reset phải ở địa chỉ khơng. Tuy nhiên, các FP tương ứng với các ngắt khác có thể đặt lại địa chỉ. Địa chỉ đặt lại có thể được xác định bằng cách viết địa chỉ này vào trường địa chỉ cơ sở bảng phục vụ ngắt ISTB (Interrupt Service Table Base) của thanh ghi ISTP,khi reset ISTB bằng không. Để đặt lại bảng vector, trường ISTB được sử dụng để ghi địa chỉ cơ sở mới, địa chỉ đặt lại là ISTB cộng với offset.
c, Cấu trúc chương trình phục vụ ngắt 1
Một ISFP là một FP được sử dụng phục vụ một ngắt.
Nếu một chương trình phục vụ ngắt nhỏ đủ để đặt vừa bên trong một FP. Để trở về chương trình chính, FP chứa một lệnh rẽ nhánh tới lệnh con trỏ trở về ngắt (B IRP). Theo sau bởi một lệnh NOP cho phép địa chỉ đích được thực hiện trong pipeline.
Hình 1.8. Cấu trúc chương trình phục vụ ngắt 1
Nếu chương trình phục vụ ngắt q lớn khơng chứa đủ được trong một FP, một lệnh rẽ nhánh tới vị trí chứa mã chương trình phục vụ ngắt là cần thiết. Hình sau chỉ ra một chương trình phục vụ ngắt cho ngắt INT4, một lệnh rẽ nhánh tới vị trí nhớ 1234h được sử dụng để hồn thành chương trình phục vụ ngắt.
d, Cấu trúc chương trình phục vụ ngắt 2
CHƯƠNG 2: ỨNG DỤNG PHẦN MỀM CODE COMPOSER STUDIO VÀ MATLAB THIẾT KẾ BỘ LỌC IIR
2.1. Phần mềm Coper Composer Studio
2.1.1.Tạo dự án với CCStudio
Để tạo một dự án với phần mềm CCStudio ta tiến thành theo những bước sau:
Bước 1: Tạo dự án mới
Vào Project\ New -> Xuất hiện hộp hội thoại Project Creation - Project name : Nhập tin dự án
- Location: Chọn vị trí lưu dự án - Project Type: Chọn Executable (.out)
- Target: Chọn chíp DSP tương ứng ( TMS320C67XX ) => Finish
Hình 2.1 Tạo dự án mới
Bước 2: Nhập và lưu chương trình
Nếu các file mã nguồn chưa có sẵn vào File/ New/ Source file (Ctrl+N) -> Xuất hiện hộp thoại với tên mặc định Untitled x cho phép nhập chương trình.
Nếu các file mã nguồn đó có sẵn vào Projects\ Add file to project...trỏ đến vị trí của các file cần thêm vào dự án.
Để lưu chương trình vào File\ Save -> Xuất hiện hộp thoại Save As - File name: Nhập tên chương trình .c ( VD: Untiled1.c )
=> Save
Bước 3: Thêm các file vào dự án
Các file cần thêm vào dự án gồm file thư viện, file mã nguồn, file ánh xạ bộ nhớ.
Hình 2.2 Thêm các file vào dự án
+ File thư viện ( Libraries ) gồm ba file:
Nhấp chuột phải vào Libraries\ Add file to project...
- csl6713.lib (trong thư mục C:\CCStudio_v3.1\C6000\csl\lib) - rts6700.lib (trong thư mục C:\CCStudio_v3.1\C6000\cgtools\lib) -dsk6713bsl.lib (trong thư mục C:\CCStudio_v3.1\ C6000\ dsk6713\ lib) + File mã nguồn (Source) gồm ba file:
Nhấp chuột phải vào Source\ Add file to project...
- Tên chương trình .c (trong thư mục C:\CCStudio_v3.1\ My projects\ Folder dự án)
- C6713dskinit.c
- Vectors_pool.asm (Vectors_intr.asm) + File ánh xạ bộ nhớ .cmd: c6713dsk.cmd
Nhấp chuột phải vào file nguồn Source\ Add file to project... vào thư mục cài đặt
Sau khi đã thêm các file, tiến hành quét các file phụ thuộc bằng cách
nhấp chuột phải vào tên dự án chọn Scan All File Dependencies. Kết quả là trong thư mục Include xuất hiện các thư mục con.
Bước 4: Thiết lập các tùy chọn
Để thiết lập các tuỳ chọn cho dự án, vào Project\ Build Options...Xuất hiện hộp thoại Build Options for... cho phép xác lập các tuỳ chọn bao gồm các Tab: General, Compiler, Linker, Link Order. Trong mỗi tab sẽ có các tuỳ chọn khác nhau.
Tuỳ chọn trong Tab Compiler: Chọn Basic:
- Target Version : C671x(-mv6710)
- Generate Debub Info : Full Symbolic Debug(-g) - Opt Speed vs Size : Speed Most Critical (no-ms)
Chọn Advanced:
- Memory Models : Far (--mem_model:data=far) Chọn Preprocessor:
- Include Search Path (-i): Tìm đường dẫn cho khai báo #include trong chương trình. Các đường dẫn được ngăn cách với nhau bằng dấu “ ;”.
- Pre-Define Symbol (-d): CHIP_6713
Hình 2.4 Thiết lập các tùy chọn
Tuỳ chọn trong Tab Linker: Chọn Basic:
- Heap Size (-heap): 0x40 - Stack Size (-stack): 0x40 Chọn Advanced:
Hình 2.5 Thiết lập các tùy chọn
Sau khi đã thiết lập các tuỳ chọn xong nhấn OK.
Bước 5: Dịch, sửa lỗi và tải chương trình vào DSK.
Để biên dịch chương trình vào Project\ Build (F7) hoặc chọn biểu tượng hình ba mũi tên xuống.
Trong q trình dịch nếu có lỗi xảy ra sẽ được thông báo và đánh dấu bằng màu đỏ.Ta nhấp chuột vào dịng thơng báo lỗi. Điều này sẽ đưa con trỏ đến các phần của mã lỗi xảy ra.Tiến hành sửa lỗi chương trình rồi biên dịch lại.
Q trình dịch khơng có lỗi sẽ tạo ra 1 file .out lưu trong thư mục C:\ CCStudio_v3.1/ My Project/ Debug.
Để tải được chương trình trên DSK trước tiên cần kết nối phần mềm CCStudio với DSK. Để làm được việc này vào menu Debug/ Connect (Alt+C).
Để tải chương trình vào DSK vào File/ Load Program( Ctrl+L). Chọn file .out vừa được tạo ra trong quá trình biên dịch -> Open.
Bước 6: Chạy và mơ phỏng chương trình
Để chạy chương trình vào Debug/ Run (F5) hoặc chọn biểu tượng Run (hình người chạy) ở bên trái cửa sổ.
Để dừng chương trình ta nhấp vào biểu tượng Halt ở dưới biểu tượng Run.
Tín hiệu đầu ra được thể hiện trên OSL, trên loa qua đường Line Out, trên tai nghe qua đường HeadPhone.
2.1.2. Cách thay đổi tần số, biên độ của tín hiệu đầu ra
Thay đổi tần số lấy mẫu bằng cách thay đổi tần số trong chương trình nguồn C trong câu lệnh Uint32 fs = DSK6713_AIC23_FREQ_xKHZ. x có thể thay đổi bằng 8, 16, 24, 32, 44.1, 48, 96 KHz. Đây là các tần số lấy mẫu được hỗ trợ bởi các codec AIC23. Ngồi ra ta cũng có thể thay đổi tần số của tín hiệu đầu ra bằng cách thay đổi số điểm trong bảng tra cứu vì các tần số được tạo ra là f = Fs / (số điểm)
Để thay đổi biên độ của tín hiệu áp dụng file GEL trượt. Nó cho phép thay đổi biến đạt được. Và trượt thông qua các giá trị khác nhau trong khi bộ vi xử lý đang chạy. Tất cả các biến đầu tiên đều được xác định trong chương
trình nguồn. Chọn File/ Load Ged mở file gain.gel. Kích đúp vào tập tin gain.gel để xem nó trong CCS. Chọn GEL/
Sine Gain/ Gain. Xuất hiện một thanh trượt Gain với giá trị tối thiểu là giá trị trong chương trình nguồn. Bấm phím mũi tên tăng lên để tăng giá trị đạt được cũng như tăng biên độ của tín hiệu ở đầu ra.
2.1.3. Mơ phỏng trên CCStudio
Khả năng mô phỏng trên CCStudio được thể hiện trong cả hai lĩnh vực thời gian và tần số. Để thực hiện dự án này cần một chương trình tạo ra một bộ đệm để lưu trữ các dữ liệu đầu ra trong bộ nhớ. Ở đây tôi sử dụng dự án sine8_buf.pjt/ /Thế hệ Sin8_buf .Đệm đầu ra được vẽ trong code composer studio
#include "dsk6713_aic23.h”
Uint32 fs=DSK6713_AIC23_FREQ_8KHZ; int loop = 0;
short gain = 1;
short sine_table[8]={0,707,1000,707,0,-707,-1000,-707}; short out_buffer[256];
const short BUFFERLENGTH = 256; int i = 0;
interrupt void c_int11() { output_sample(sine_table[loop]*gain); out_buffer[i] = sine_table[loop]*gain; i++; if(i==BUFFERLENGTH) i=0; if (loop < 7) ++loop; else loop = 0; return; } void main() { comm_intr(); while(1); }
Chương trình Sin với đầu ra được lưu trữ trong bộ nhớ (sine8_buf.c).
Các tập tin hỗ trợ cho dự án này là c6713dskinit.c, vectors_intr.asm và C6713dsk.cmd. Ba thư viện hỗ trợ: csl6713.lib, rts6700.lib, dsk6713bsl.lib.
Xây dựng dự án tiến hành tải và chạy chương trình sine8_buf.out và một sóng hình sin 1 kHz được tạo ra.
Chọn View-> Graph-> Time/Friquency. Xuất hiện hộp thoại Graph Property Dialog. Thay đổi :- Display Type: Single Time
- Display Data Size: 64
- DSP Data Type: 16-bit signed integer - Sampling Rate (Hz): 8000
-> Ok
Hình 2.6 Time/Friquency
Xuất hiện một đồ thị mơ phỏng về thời gian cho tín hiệu ở đầu ra trên cửa sổ CCS. Với biên độ max = +- 1000
Hình 2.7 Biên độ
Tương tự chọn View-> Graph-> Time/Friquency. Xuất hiện hộp thoại Graph Property Dialog. Thay đổi: Display Type: FFT Magnitude
- FFT Framesize: 256 -> Ok
Hình 2.8 FFT Framesize
Xuất hiện một đồ thị mơ phỏng về tần số cho tín hiệu ở đầu ra trên cửa sổ CCS. Tần số tăng đột biến tại 1000Hz đại diện cho tần số của hình sine được tạo ra.
Hình 2.9 Tín hiệu ở đầu ra trên cửa sổ CCS
Để xem nội dung bộ đệm trên chọn:
View/ Memory: - Address: out_buffer
- Format: 16-bit Hex-C Style -> Ok
Hình 2.10 Nội dung bộ đệm
Để lưu nội dung của bộ đệm đầu ra trong một tập tin chọn File/ Data/ Save.Tập tin được lưu trữ trong thư mục sine8_buf với đuôi .dat. Xuất hiện cửa sổ Storing Memory window chọn: - Address: out_buffer
- Length: 256 -> Ok
Để có được các cửa sổ khác nhau trong CCS. Từ cửa sổ xây dựng nhấp chuột phải chọn Float In Main Window. Ta có thể thay đổi được kích thước màn hình và di chuyển màn hình đó, từ cửa sổ xây dựng kích chột phải chọn Allow Docking.
2.1.4.Giám sát cửa sổ Watch
Trong khi bộ vi xử lý vẫn đang chạy và nhúng chuyển đổi #0 được nhấn. Chọn View/ Quick Watch -> Xuất hiện cửa sổ hiện thị trên phần thấp hơn của CCS. Chọn biến sau đó kích vào Add to Watch các thiết lập trong chương trình sẽ xuất hiện trong cửa sổ Watch.
2.2. Phần mềm Matlab
Để thiết kế bộ lọc số trên Matlab ta có thể dùng cơng cụ SPtool hoặc FDAtool có sẵn trong Matlab. Ở đây tôi sử dụng công cụ FDAtool.
2.2.1. Các bước tiến hành
Để thiết kế bộ lọc số trên Matlab thực hiện theo những bước sau: Bước 1. Xác định các thông số của bộ lọc:
• Tần số giới hạn dải thơng ωp • Tần số giới hạn dải chắn ωs
• Bề rộng dải chuyển tiếp Δω (Δω= ωs - ωp)
Bước 2. Khởi động Matlab nhấp vào biểu tượng Matlab trên decktop
MATLAB R2009a.lnk
Xuất hiện màn hình giao diện
Để kích hoạt cơng cụ thiết kế FDAtool trong cửa sổ lệnh của Matlab, ta thực hiện nhập lệnh sau:
>> fdatool
Cửa sổ FDATool được gọi ra như sau:
Hình 2.12 Cơng cụ thiết kế FDAtool
Từ đây, ta có thể chọn loại đáp ứng (Response Type) cho các bộ lọc như: + Thông thấp (Lowpass)
+ Thông cao (Highpass)
+ Dải thông (Bandpass) + Dải chặn (Bandstop)
+ Bộ vi phân (Differentiator)
Các đặc điểm kỹ thuật của bộ lọc thay đổi theo loại đáp ứng và phương pháp
Như hình, chúng ta có thể nhập:
+ Bậc của bộ lọc (Filter Order)
+ Các tùy chọn (Options)
+ Đặc tính tần số (Frequency Specifications) + Đặc tính biên độ ( Magnitude Specifications)
Sau khi thực hiện xong nhấn Design Filter.
Hình 2.13 Đáp ứng xung
Vào Analysis chọn để xem:
- Phase Response (đáp ứng pha)
- Magnitude and Phase Responses (đáp ứng biên pha) - Impulse Responses (đáp ứng xung)
- Pole/ Zero Plot (điểm cực, điểm không) - Filter Coefficients (hệ số file của bộ lọc) - Filter Information (thông tin về bộ lọc)
Bước 3. Lưu hệ số file của bộ lọc
Hình 2.14 Lưu hệ số file
Để lưu được hệ số file trước hết ta chọn vùng làm việc cho bộ lọc đang thiết kế Vào File/ Export xuất hiện cửa sổ Export
Trong: - Export To chọn Workspace - Export As chọn Coeficients
- Variable Names thay sos matrix thành tên bộ lọc( vd: lowpass 500)
-> Export
Hình 2.15. Lưu hệ số
Trong: - Export To chọn Coeffcient File (ASCII)
- Options chọn Decimal cho định dạng số thập phân, chọn Hexidecimal (hecxa), chọn Binary (nhị phân)
-> Export
Lưu tên với .cof (VD: Bs2700.cof)
Để có được các hệ số trong một định dạng số nguyên 16 bit thì trên cửa sổ chính ta nhập
>> bs2700 = int16(bs2700*2^15)
Những hệ số này sau đó được lưu trong tập tin test_bs2700.cof sử dụng >> dlmwrite(‘test_bs2700.cof’,bs2700)
2.2.2. Thực hiện thiết kế bộ lọc số theo yêu cầu
- Bộ lọc thơng thấp có tần số cắt 2kHz - Độ mấp mô dải thông 0.5dB
- Độ suy giảm dải chắn 60dB - Độ rộng sườn 1%
Từ các yêu cầu trên ta có thể sử dụng FDATool để thiết kế bô lọc. Mở hộp công cụ FDATool bằng cách gõ lệnh fdatool từ cửa sổ Command Window của MATLAB
Hình 2.16 Lệnh để mở hộp thoại FDATool
Hộp thoại FDATool sẽ hiện ra
Hình 2.17 Hộp thoại FDATool
Hình 2.18 Nhập thơng số bộ lọc số IIR thơng thấp elliptic cần thiết kế.