* FPGA là gì ?
FPGA là viết tắt của thuật ngữ tiếng anh “Field programmable Gate Array”, nghĩa là Mảng cổng lập trình được dạng trường. FPGA thuộc họ ASIC lập trình được
* Ý nghĩa và vai trò của FPGA
ASIC lập trình được đã xuất hiện từ lâu dưới dạng PLD (Programmable Logic Device), nhưng vai trò của các dạng ASIC này là không nhiều vì số lượng cổng trên Chip rất ít dẫn tới chức năng của các PLD này cũng nghèo nàn và thường chỉ sử dụng với những nhiệm vụ rất hạn chế trong toàn hệ thống. Kể từ năm 1980,Các công ty sản xuất PLD hàng đầu đã đẩy mạnh quá trình nghiên cứu về FPGA và nhanh chóng cho ra các thế hệ FPGA với số lượng cổng và tốc độ ngày càng cao.các FPGA hiện nay có số lượng cổng đủ lớn để có thể thay thế cả một hệ thống bao gồm lõi CPU, Bộ điều khiển bộ nhớ (Memory Controller), các ngoại vi như SPI,Timer, I2C, GPIO, PWM, Video/Audio Controller… (nghĩa là tương đương với các SoC hiện đại).Tuy nhiên,FPGA không thể nào so sánh được với ASIC và SoC cả về kinh tế lẫn tốc độ hoạt động. Nhưng bù lại, với khả năng tái cấu hình mạnh, FPGA đóng một vai trò vô cùng to lớn trong việc giảm giá thành và thời gian chế tạo ASIC bằng cách sử dụng FPGA trong quá trình thiết kế luận lý trước khi đưa ra sản xuất các ASIC mẫu. Quy trình sản xuất Chip ASIC bằng cách này gọi là fabless rất phổ biến hiện nay trên thế giới, giúp các công ty nhỏ và vừa và đặc biệt là các nước yếu về công nghệ như Việt nam tham gia vào thế giới của IC.
Để giải thích cho các bạn hiểu rõ hơn sự quan trọng rất lớn của FPGA, tôi sẽ cho các bạn một ví dụ rõ hơn. Trước đây, khi muốn chế tạo ra 1 con Chip Vi Xử Lý.Người ta phải thiết kế Chip ở mức logic sử dụng các ngôn ngữ mô tả phần cứng, Để kiểm tra công đoạn này người ta sử dụng những phần mềm mô phỏng.Sau đó thiết kế phải được tổng hợp dựa trên các thư viện cấp thấp của hãng mà bạn sẽ sản xuất của con Chip của bạn sau này, sau đó là quá trình kiểm tra timing (định thời) cho toàn bộ thiết kế để đảm bảo thiết kế của bạn sẽ hoạt động ở tần số yêu cầu.Tất cả các công đoạn này đều chỉ có thể kiểm tra bằng các phần mềm mô phỏng (Điều này dẫn tới nguy cơ xảy ra sai xót rất lớn khi chuyển thiết kế sang môi trường Chip thực ). Sau đó bạn sẽ gởi thiết kế của mình tới công ty sản xuất Chip và phó mặc cho số phận,một chip mẫu giá vài triệu đô la sẽ được chuyển cho bạn, và sau đó bạn bắt đầu quá trình test chip trong môi trường thực, nếu thất bại, khả năng lớn là bạn sẽ phải thực hiện lại hoàn toàn qui trình thiết kế như đã nói ở trên, và cứ mỗi lần như vậy, bản sẽ phải bỏ sọt rác nhiều triệu đô la và khỏag thời gian nghiên cứu rất lớn, quy trình này làm cho các đất nước nghèo như việt nam không thể tham gia vào các cuộc chơi của các đất nước giàu có trong thế giới của ASIC. Nhưng với FPGA,bạn không những có thể rút ngắn thới gian thực hiện ASIC mà còn giảm chi phí nghiên cứu tối đa do quá trình kiểm tra thiết kế không những được kiểm tra bằng các phần mềm mô phỏng mà giờ đây còn có thể chạy trên các Chip thực trong mội trường có thể nói là gần với môi trường ASIC thực nhất. Khả năng tái cấu hình cho phép bạn sửa đi sửa lại thiết kế cho đến khi đạt yêu cầu mà không tốn một xu nào ngoài tiền điện mà bạn phải trả.
* Một ứng dụng quan trọng và thiết thực hơn đối với chúng ta (tôi và các bạn)
Có lẽ đọc phần trên chúng ta có thể hình dung ra ý nghĩa to lớn, vai trò quan trọng của FPGA. Nhưng sản xuất ASIC vẫn là một điều quá xa vời đối với đại đa số chúng ta, có ai trong số các bạn tự hỏi tại sao không sử dụng trực tiếp FPGA như là một sản phẩm cuối cùng của bạn, có ai cấm hay thu tiền bản quyền của chúng ta về việc đó đâu. Thực tế là FPGA rất hay được sử dụng trong các hệ thống SDR (Software Defined Radio) vì khả năng tái cấu hình giúp các chức năng của thiết bị có thể thay đổi nhanh chóng, bạn có thể hỏi rằng một hệ thống CPU/MCU/DSP cũng có thể làm được chuyện này dễ dàng? Nhưng thực ra thì có nhiều những ứng dụng tốc độ cao mà các MCU thậm chí cả các CPU/DSP trung bình cũng phải bất lực.
* Tại sao phải dùng FPGA trong khi bạn đó nắm trong tay MCU/CPU thậm chí cả các DSP cực mạnh
+ MCU/CPU/DSP vẫn cần các hardware khác bên cạnh trong các ứng dụng chuyên dụng
+ Để điều khiển VGA sử dụng CPU làm controller cần CPU với tốc độ 27Mhz hoạt động 100% CPU
+ Các ứng dụng xử lý hình ảnh/video, các ứng dụng mạng neuron,IA cần tốc độ xử lý rất lớn. Mặc dù các DSP đủ mạnh và các SoC mạnh có thể thực hiện được, nhưng sự lựa chọn còn phụ thuộc vào vấn đề kinh tế
+ Có bao giờ bạn nghĩ mình sẽ thiết kế ra 1 con CPU của chính mình, với FPGA bạn hoàn toàn có thể thực hiện điều đó
+ Đến với FPGA,bạn có cơ hội để tiếp cận gần nhất thế giới của IC
+ Bạn có thể thực hiện một hệ thống với đầy đủ CPU/Peripheral/IO… và kết nối chúng theo ý muốn,hoặc thậm chí một hệ thống đầy đủ không cần cả CPU như các Chip giải mã/nén Video/Audio, các Chip xử lý hình ảnh/giọng nói, các Chip PID Motor Controller, networking chip …
* Kit phát triển FPGA và các ứng dụng demo :
Kit Xilinx Spartan-3 FPGA Starter Kit Board (Giá $149.00)
Kit Altera Cyclone III FPGA Starter Kit (Giá $199.00)
Các Kit trên là Starter Kit, nhìn nhiều Chip vậy thôi chứ thực ra chỉ có mỗi con FPGA là chính thôi,mấy con còn lai chủ yếu là SRAM/DRAM, Flash, Bộ config Nguồn và các ngoại vi…
Dưới đây là các Kit giáo dục rất mạnh của Altera (DE1,DE2) đã được dùng phổ biến ở nhiều trường đại học trên thế giới (Kit do Terasic thiết kế chế tạo).Nếu ai đang là sinh viên điện tử năm 3,4 ở các trường ĐH BK TPHCM và ĐH Tự Nhiên TPHCM thì có lẽ biết rõ về loại Kit này.
Altera DE1 - Development and Education Board (Giá $150.00)
Altera DE2 - Development and Education Board (Academic price :$269)
Các Kít phát triển FPGA thì đa dạng và dùng cho nhiều mục đích khác nhau nhưng đều gồm 5 phần chính : FPGA, Bộ nhớ (SRAM/DRAM/Flash), Ngoại vi, bộ cấu hình (Configuration device), và bộ nguồn.
Nhìn hai loại board ở trên, 1 cái thì mạch diện,IC dày đặc,1 cái thì nhìn đơn giản, nhưng thực thế chỉ là các Kit DE có các ngoại vi đi kèm để dùng cho các mục đích phát triển khác nhau, còn con chip FPGA thì cũng tương đượng thôi, thâm chí còn yếu hơn các Starter Kit.
Các ứng dụng demo của Kit phát triển Altera DE1,DE2
Thứ Tư, 7 tháng 11, 2012
Các Ngắt Trong PIC
I / CƠ CHẾ HOẠT ĐỘNG CỦA NGẮT :
1 / Ngắt 1 cấp :
+ Trên PIC 14 , 12 ,10 ,tất cả các ngắt chỉ có 1 cấp ưu tiên . Nghĩa là ngắt nào đang được phục vụ thì không thể bị ngắt bởi 1 ngắt khác xảy ra . Cơ chế sinh mã cho ngắt của CCS như sau : nhảy đến địa chỉ ngắt , thường là 004h , sao lưu thanh ghi W, STATUS , PCLATCH , FSR, và nhiều thứ vớ vẫn khác, sau đó nó mới hỏi vòng xem cờ ngắt nào xảy ra thì nhảy đến hàm phục vụ ngắt đó . thực hiện xong thì phục hồi tất cả thanh ghi trên , rồi mới “RETFIE” – thoát ngắt . Số chu kỳ thực thi từ chỗ ngắt đến khi nhảy vào hàm ngắt cỡ 20 chu kỳ lệnh !, nhảy ra cũng cỡ đó .
+ Điều gì xảy ra nếu chương trình dùng nhiều ngắt và khi có ngắt thì có 2 ngắt trở lên xảy ra đồng thời ? Nghĩa là : 2 ngắt xảy ra cùng lúc , hay khi ngắt A kích hoạt và CCS đang lưu các thanh ghi ( chưa tới hỏi vòng cờ ngắt ) thì ngắt B xảy ra , dĩ nhiên ngắt B không thể kích vector ngắt nhảy tới 004h vì bit cho phép ngắt toàn cục ( GIE ) bị khóa tự động khi có ngắt , chỉ có cờ ngắt B bật mà thôi. Sau khi lưu các thanh ghi , chương trình kiểm tra cờ ngắt , rõ ràng là nếu bit nào được kiểm tra trước thì phục vụ trước , dù nó xảy ra sau . Để tránh phục vụ không đúng chỗ , bạn dùng #priority để xác định ưu tiên ngắt ( xem phần chỉ thị tiền xử lý ) . Ngắt ưu tiên nhất sẽ luôn được hỏi vòng trước .Sau khi xác định cờ ngắt cần phục vụ , nó sẽ thực thi hàm ngắt tương ứng .Xong thì xoá cờ ngắt đó và thoát ngắt . Phục vụ ngắt nào xong thì chỉ xoá cờ ngắt đó .Nếu A ưu tiên hơn B thì sau khi làm A , chương trình xoá cờ ngắt A , nhưng cờ B không xoá ( vì đâu có phục vụ ) , nên khi thoát ra ngắt A , nó sẽ lại ngắt tiếp ( vì cờ B đã bật ), lại hỏi vòng cờ ngắt từ đầu : nếu cờ A chưa bật thì xét B, lúc này B bật nên phục vụ B , xong thì xoá cờ B và thoát ngắt .
+ Môt chương trình dùng nhiều ngắt phải lưu ý điều này , tránh trường hợp : ngắt xảy ra liên tục (tràn
ngắt ) , 1 ngắt bị đáp ứng trễ , ngắt không đúng , . . .
2 / Ngắt 2 cấp :
+ Chỉ có trên PIC 18 ( và dsPIC ) . Có 2 khái niệm : ngắt ưu tiên thấp (low priority) và ngắt ưu tiên cao ( high priority ) . 2 vector thực thi ngắt tương ứng thường là 0008h (high) và 0018h ( low ) . Một ngắt thấp đang được phục vụ sẽ bị ngưng và phục vụ ngắt cao ở 0008h nếu ngắt cao xảy ra . Ngược lại , ngắt cao đang xảy ra thì không bao giờ bị ngắt bởi ngắt thấp .
+ Nếu viết hàm ngắt bình thường , không đòi hỏi ưu tiên gì thì CCS sinh mã để tất cả hàm ngắt đều là ngắt ưu tiên cao . Quy trình thực hiện ngắt sẽ như ngắt 1 cấp trên . #priority vẫn được dùng . Số chu kỳ thực thi từ 0008h đến khi nhảy vào thực thi hàm ngắt khoảng 30 chu kỳ , xong hàm ngắt tới khi kết thúc ngắt cũng mất khoảng 30 chu kỳ lệnh .
+ Để sử dụng ngắt 2 cấp , khai báo #device phải có high_ints=true . Và hàm ngắt nào muốn ưu tiên cao thì thêm FAST hay HIGH theo sau chỉ thị tiền xử lý hàm đó .
Lưu ý : khi dùng FAST thì không nên dùng HIGH cho các ngắt khác thì mới có ý nghĩa và chỉ có duy nhất 1 ngắt được ưu tiên FAST , nhưng có thể có nhiều ngắt đặt ở mức HIGH .
VD :
#int_timer1 FAST
Void xu_ly ( )
{ . . .
}
#int_timer2 HIGH
Void dinh_thi ()
{ . . .
}
#int_timer5 HIGH
Void vong_lap()
{ . . .
}
+ Cơ chế sinh mã như sau : có ngắt thấp thì nhảy tới 0018h , sao lưu W, STATUS , FSR0/1/2 ,. . . rồi mới hỏi vòng cờ ngắt thấp . chạy xong hàm ngắt thì phục hồi tất cả và “RETFIE 0 “ .
+ Riêng ngắt cao đánh dấu FAST không sinh mã sao lưu gì cả mà nhảy thẳng vào hàm ngắt chạy luôn . PIC 18 và dsPIC có cơ chế lưu siêu tốc là FAST STACK REGISTER ( xem datasheet ) . Khi xảy ra ngắt bất kỳ, W, S , BSR tự động lưu vào thanh ghi trên , PC counter lưu vào stack . xong ngắt thì pop ra . Vấn đề ở chỗ : khi ngắt thấp xảy ra , FAST STACK REGISTER tự động lưu W ,S , BSR , PC -> stack . Trong khi thực hiện hàm phục vụ ngắt thì trường hợp W, S , BSR thay đổi là có thể ( vì vậy mới sao lưu chứ ) . nhưng nếu xảy ra ngắt cao vào thời điểm đó ? FAST STACK REGISTER sẽ bị ghi đè => mất data . Do đó , cơ chế sinh mã của CCS cần phải luôn đúng , nghĩa là : luôn tự sao lưu riêng W ,S , BSR, và các thanh ghi FSR nữa , khi thực thi ngắt thấp . Còn ngắt cao FAST khi chạy xong sẽ “RETFIE 1 “ – tự động phục hồi W, S , BSR từ FAST STACK REGISTER . Có 2 trường hợp : 1 là chỉ có ngắt cao , thì không có vấn đề gì . 2 là ngắt cao ngắt 1 ngắt thấp đang chạy . Phân tích sẽ thấy rằng cho dù bị ngắt trong khi đang sao lưu ,hay chưa kịp sao lưu , hay đã sao lưu vào các biến riêng rồi , cuối cùng chương trình cũng quay ra đúng địa chỉ ban đầu với các thanh ghi W, S , BSR như cũ .
+ Tuân thủ nguyên tắc ngắt cao thực thi tức thời nên CCS chỉ cho 1 ngắt cao FAST duy nhất bất kỳ hoạt động , nên không sinh mã hỏi vòng , sao lưu thêm gì cả .
+ Nếu bạn muốn có nhiều ngắt ưu tiên cao , thì dùng HIGH , chương trình sao lưu bình thường như với ngắt thấp , nhưng khi đó ngắt đánh dấu FAST cũng mất tác dụng , CCS xem như là HIGH và xử lý bình thường .
_Như vậy dùng FAST hay HIGH đều có ý nghĩa riêng của nhà lập trình .
II / KHAI BÁO NGẮT :
_Mỗi dòng VDK có số lượng nguồn ngắt ngắt khác nhau : PIC 14 có 14 ngắt , PIC 18 có 35 ngắt .
_Muốn biết CCS hỗ trợ những ngắt nào cho VDK của bạn , mở file *.h tương ứng , ở cuối file là
danh sách các ngắt mà CCS hỗ trợ nó . Cách khác là vào CCS -> View -> Valid interrupts , chọn
VDK muốn xem , nó sẽ hiển thị danh sách ngắt có thể có cho VDK đó .
_Sau đây là danh sách 1 số ngắt với chức năng tương ứng :
#INT_GLOBAL : ngắt chung , nghĩa là khi có ngắt xảy ra , hàm theo sau chỉ thị này được thực
thi , bạn sẽ không được khai báo thêm chỉ thị ngắt nào khác khi sử dụng chỉ thị này . CCS không sinh
bất kỳ mã lưu nào , hàm ngắt bắt đầu ngay tại vector ngắt . Nếu bật nhiều cờ cho phép ngắt , có thể
bạn sẽ phải hỏi vòng để xác định ngắt nào . Dùng chỉ thị này tương đương viết hàm ngắt 1 cách thủ
công mà thôi , như là viết hàm ngắt với ASM vậy .
#INT_AD : chuyển đổi A /D đã hoàn tất , thường thì không nên dùng
#INT_ADOF : I don’t know
#INT_BUSCOL : xung đột bus
#INT_BUTTON : nút nhấn ( không biết hoạt động thế nào )
#INT_CCP1 : có Capture hay compare trên CCP1
#INT_CCP2 : có Capture hay compare trên CCP2
#INT_COMP : kiểm tra bằng nhau trên Comparator
#INT_EEPROM : hoàn thành ghi EEPROM
#INT_EXT : ngắt ngoài
#INT_EXT1 : ngắt ngoài 1
#INT_EXT2 : ngắt ngoài 2
#INT_I2C : có hoạt động I 2C
#INT_LCD : có hoạt động LCD
#INT_LOWVOLT : phát hiện áp thấp
#INT_PSP : có data vào cổng Parallel slave
#INT_RB : bất kỳ thay đổi nào trên chân B4 đến B7
#INT_RC : bất kỳ thay đổi nào trên chân C4 đến C7
#INT_RDA : data nhận từ RS 232 sẵn sàng
#INT_RTCC : tràn Timer 0
#INT_SSP : có hoạt động SPI hay I 2C
#INT_TBE : bộ đệm chuyển RS 232 trống
#INT_TIMER0 : một tên khác của #INT_RTCC
#INT_TIMER1 : tràn Timer 1
#INT_TIMER2 : tràn Timer 2
#INT_TIMER3 : tràn Timer 3
#INT_TIMER5 : tràn Timer 5
#INT_OSCF : lỗi OSC
#INT_PWMTB : ngắt cuả PWM time base
#INT_IC3DR : ngắt đổi hướng ( direct ) của IC 3
#INT_IC2QEI : ngắt của QEI
#INT_IC1 : ngắt IC 1
+ Hàm đi kèm phục vụ ngắt không cần tham số vì không có tác dụng .
+ Sử dụng NOCLEAR sau #int_xxx để CCS không xoá cờ ngắt của hàm đó .
+ Để cho phép ngắt đó hoạt động phải dùng lệnh enable_interrupts ( int_xxxx) vàenable_interrupts (global ) .
+ Khoá FAST theo sau #int_xxxx để cho ngắt đó là ưu tiên cao , chỉ được 1 ngắt thôi , chỉ có ở PIC 18 và dsPIC .
VD : #int_timer0 FAST NOCLEAR
III / CÁC HÀM THIẾT LẬP HOẠT ĐỘNG NGẮT :
1 / enable_interrupts ( level )
+ level là tên các ngắt đã cho ở trên hay là GLOBAL để cho phép ngắt ở cấp toàn cục .
+ Mọi ngắt của VDK đều có 1 bit cờ ngắt , 1 bit cho phép ngắt . Khi có ngắt thì bit cờ ngắt bị set =1, nhưng ngắt có họat động được hay không tuỳ thuộc bit cho phép ngắt . enable_interrupts (int_xxx ) sẽ bật bit cho phép ngắt . Nhưng tất cả các ngắt đều không thể thực thi nếu bit cho phép ngắt toàn cục = 0, enable_interrupts( global ) sẽ bật bit này .
VD : để cho phép ngắt timer0 và timer1 hoạt động:
enable_interrupts (int_timer0);
enable_interrupts (int_timer1 ) ;
enable_interrupts ( global ); // chỉ cần dùng 1 lần trừ phi muốn có thay đổi đặc biệt
2 / disable_interrupts ( level )
+ level giống như trên .
+ Hàm này vô hiệu 1 ngắt bằng cách set bit cho phép ngắt = 0 .
+ disable_interrupts ( global ) set bit cho phép ngắt toàn cục =0 , cấm tất cả các ngắt .
+ Không dùng hàm này trong hàm phục vụ ngắt vì không có tác dụng , cờ ngắt luôn bị xoá tự động .
3 / clear_interupt ( level )
+ level không có GLOBAL .
+ Hàm này xoá cờ ngắt của ngắt được chỉ định bởi level .
4 / ext_int_edge ( source , edge )
+ Hàm này thiết lập nguồn ngắt ngoài EXTx là cạnh lên hay cạnh xuống .
+ source : nguồn ngắt . Trên PIC 18 có 3 nguồn ngắt trên 3 chân EXT0, EXT1, EXT2 ứng với source =0,1, 2 . Các PIC khác chỉ có 1 nguồn EXT nên source = 0 .
+ edge : chọn cạnh kích ngắt , edge = L_TO_H nếu chọn cạnh lên ( từ mức thấp chuyển lên mức cao ) hay H_TO_L nếu chọn cạnh xuống .
IV / CÁC CHƯƠNG TRÌNH VD VỀ NGẮT :
1 / #INT_RB :
+ Sau đây là 1 chương trình điển hình về sử dụng ngắt khi có sự thay đổi trên chân B4-B7 .
+ Mô tả : mỗi khi nhấn nút bất kỳ trên B4-B7 , sẽ kích ngắt RB , hàm phục vụ ngắt có tên RB_LED được thực thi , hàm này đơn giản là xuất ra LED ở vị trí tương ứng nhưng trên portD từ D4 – D7 .
+ VDK là 16F877 .
#include < 16F877.h >
#device PIC16F877 *=16
#use delay (clock = 20000000 ) //thêm khai báo này nếu ctrình có dùng hàm delay,OSC=20 Mhz
#byte portb = 0x06 //tạo tên danh định portb thay thế địa chỉ portB là 06h
#byte portd = 0x08 //tạo tên danh định portd thay thế địa chỉ portD là 08h
#INT_RB
Void RB_LED ( ) // hàm phục vụ ngắt
{
portd=portb;
}
void main ( )
{ set_tris_b ( 0xF0 ) ; // portB = 11110000 , B4-B7 là ngõ vào , B0-B3 là ngõ ra
set_tris_d ( 0x00 ) ; // portD = 00000000 , D0-D7 đều là ngõ ra
enable_interrupts ( INT_RB ) ; // cho phép ngắt RB
enable_interrupts ( GLOBAL ) ; // cho phép ngắt toàn cục
// do chương trình không làm gì khác ngoài việc chờ ngắt nên vòng while này trống không
while( true )
{ //có thể thêm mã xử lý ở đây . . .
}
} //main
1 / Ngắt 1 cấp :
+ Trên PIC 14 , 12 ,10 ,tất cả các ngắt chỉ có 1 cấp ưu tiên . Nghĩa là ngắt nào đang được phục vụ thì không thể bị ngắt bởi 1 ngắt khác xảy ra . Cơ chế sinh mã cho ngắt của CCS như sau : nhảy đến địa chỉ ngắt , thường là 004h , sao lưu thanh ghi W, STATUS , PCLATCH , FSR, và nhiều thứ vớ vẫn khác, sau đó nó mới hỏi vòng xem cờ ngắt nào xảy ra thì nhảy đến hàm phục vụ ngắt đó . thực hiện xong thì phục hồi tất cả thanh ghi trên , rồi mới “RETFIE” – thoát ngắt . Số chu kỳ thực thi từ chỗ ngắt đến khi nhảy vào hàm ngắt cỡ 20 chu kỳ lệnh !, nhảy ra cũng cỡ đó .
+ Điều gì xảy ra nếu chương trình dùng nhiều ngắt và khi có ngắt thì có 2 ngắt trở lên xảy ra đồng thời ? Nghĩa là : 2 ngắt xảy ra cùng lúc , hay khi ngắt A kích hoạt và CCS đang lưu các thanh ghi ( chưa tới hỏi vòng cờ ngắt ) thì ngắt B xảy ra , dĩ nhiên ngắt B không thể kích vector ngắt nhảy tới 004h vì bit cho phép ngắt toàn cục ( GIE ) bị khóa tự động khi có ngắt , chỉ có cờ ngắt B bật mà thôi. Sau khi lưu các thanh ghi , chương trình kiểm tra cờ ngắt , rõ ràng là nếu bit nào được kiểm tra trước thì phục vụ trước , dù nó xảy ra sau . Để tránh phục vụ không đúng chỗ , bạn dùng #priority để xác định ưu tiên ngắt ( xem phần chỉ thị tiền xử lý ) . Ngắt ưu tiên nhất sẽ luôn được hỏi vòng trước .Sau khi xác định cờ ngắt cần phục vụ , nó sẽ thực thi hàm ngắt tương ứng .Xong thì xoá cờ ngắt đó và thoát ngắt . Phục vụ ngắt nào xong thì chỉ xoá cờ ngắt đó .Nếu A ưu tiên hơn B thì sau khi làm A , chương trình xoá cờ ngắt A , nhưng cờ B không xoá ( vì đâu có phục vụ ) , nên khi thoát ra ngắt A , nó sẽ lại ngắt tiếp ( vì cờ B đã bật ), lại hỏi vòng cờ ngắt từ đầu : nếu cờ A chưa bật thì xét B, lúc này B bật nên phục vụ B , xong thì xoá cờ B và thoát ngắt .
+ Môt chương trình dùng nhiều ngắt phải lưu ý điều này , tránh trường hợp : ngắt xảy ra liên tục (tràn
ngắt ) , 1 ngắt bị đáp ứng trễ , ngắt không đúng , . . .
2 / Ngắt 2 cấp :
+ Chỉ có trên PIC 18 ( và dsPIC ) . Có 2 khái niệm : ngắt ưu tiên thấp (low priority) và ngắt ưu tiên cao ( high priority ) . 2 vector thực thi ngắt tương ứng thường là 0008h (high) và 0018h ( low ) . Một ngắt thấp đang được phục vụ sẽ bị ngưng và phục vụ ngắt cao ở 0008h nếu ngắt cao xảy ra . Ngược lại , ngắt cao đang xảy ra thì không bao giờ bị ngắt bởi ngắt thấp .
+ Nếu viết hàm ngắt bình thường , không đòi hỏi ưu tiên gì thì CCS sinh mã để tất cả hàm ngắt đều là ngắt ưu tiên cao . Quy trình thực hiện ngắt sẽ như ngắt 1 cấp trên . #priority vẫn được dùng . Số chu kỳ thực thi từ 0008h đến khi nhảy vào thực thi hàm ngắt khoảng 30 chu kỳ , xong hàm ngắt tới khi kết thúc ngắt cũng mất khoảng 30 chu kỳ lệnh .
+ Để sử dụng ngắt 2 cấp , khai báo #device phải có high_ints=true . Và hàm ngắt nào muốn ưu tiên cao thì thêm FAST hay HIGH theo sau chỉ thị tiền xử lý hàm đó .
Lưu ý : khi dùng FAST thì không nên dùng HIGH cho các ngắt khác thì mới có ý nghĩa và chỉ có duy nhất 1 ngắt được ưu tiên FAST , nhưng có thể có nhiều ngắt đặt ở mức HIGH .
VD :
#int_timer1 FAST
Void xu_ly ( )
{ . . .
}
#int_timer2 HIGH
Void dinh_thi ()
{ . . .
}
#int_timer5 HIGH
Void vong_lap()
{ . . .
}
+ Cơ chế sinh mã như sau : có ngắt thấp thì nhảy tới 0018h , sao lưu W, STATUS , FSR0/1/2 ,. . . rồi mới hỏi vòng cờ ngắt thấp . chạy xong hàm ngắt thì phục hồi tất cả và “RETFIE 0 “ .
+ Riêng ngắt cao đánh dấu FAST không sinh mã sao lưu gì cả mà nhảy thẳng vào hàm ngắt chạy luôn . PIC 18 và dsPIC có cơ chế lưu siêu tốc là FAST STACK REGISTER ( xem datasheet ) . Khi xảy ra ngắt bất kỳ, W, S , BSR tự động lưu vào thanh ghi trên , PC counter lưu vào stack . xong ngắt thì pop ra . Vấn đề ở chỗ : khi ngắt thấp xảy ra , FAST STACK REGISTER tự động lưu W ,S , BSR , PC -> stack . Trong khi thực hiện hàm phục vụ ngắt thì trường hợp W, S , BSR thay đổi là có thể ( vì vậy mới sao lưu chứ ) . nhưng nếu xảy ra ngắt cao vào thời điểm đó ? FAST STACK REGISTER sẽ bị ghi đè => mất data . Do đó , cơ chế sinh mã của CCS cần phải luôn đúng , nghĩa là : luôn tự sao lưu riêng W ,S , BSR, và các thanh ghi FSR nữa , khi thực thi ngắt thấp . Còn ngắt cao FAST khi chạy xong sẽ “RETFIE 1 “ – tự động phục hồi W, S , BSR từ FAST STACK REGISTER . Có 2 trường hợp : 1 là chỉ có ngắt cao , thì không có vấn đề gì . 2 là ngắt cao ngắt 1 ngắt thấp đang chạy . Phân tích sẽ thấy rằng cho dù bị ngắt trong khi đang sao lưu ,hay chưa kịp sao lưu , hay đã sao lưu vào các biến riêng rồi , cuối cùng chương trình cũng quay ra đúng địa chỉ ban đầu với các thanh ghi W, S , BSR như cũ .
+ Tuân thủ nguyên tắc ngắt cao thực thi tức thời nên CCS chỉ cho 1 ngắt cao FAST duy nhất bất kỳ hoạt động , nên không sinh mã hỏi vòng , sao lưu thêm gì cả .
+ Nếu bạn muốn có nhiều ngắt ưu tiên cao , thì dùng HIGH , chương trình sao lưu bình thường như với ngắt thấp , nhưng khi đó ngắt đánh dấu FAST cũng mất tác dụng , CCS xem như là HIGH và xử lý bình thường .
_Như vậy dùng FAST hay HIGH đều có ý nghĩa riêng của nhà lập trình .
II / KHAI BÁO NGẮT :
_Mỗi dòng VDK có số lượng nguồn ngắt ngắt khác nhau : PIC 14 có 14 ngắt , PIC 18 có 35 ngắt .
_Muốn biết CCS hỗ trợ những ngắt nào cho VDK của bạn , mở file *.h tương ứng , ở cuối file là
danh sách các ngắt mà CCS hỗ trợ nó . Cách khác là vào CCS -> View -> Valid interrupts , chọn
VDK muốn xem , nó sẽ hiển thị danh sách ngắt có thể có cho VDK đó .
_Sau đây là danh sách 1 số ngắt với chức năng tương ứng :
#INT_GLOBAL : ngắt chung , nghĩa là khi có ngắt xảy ra , hàm theo sau chỉ thị này được thực
thi , bạn sẽ không được khai báo thêm chỉ thị ngắt nào khác khi sử dụng chỉ thị này . CCS không sinh
bất kỳ mã lưu nào , hàm ngắt bắt đầu ngay tại vector ngắt . Nếu bật nhiều cờ cho phép ngắt , có thể
bạn sẽ phải hỏi vòng để xác định ngắt nào . Dùng chỉ thị này tương đương viết hàm ngắt 1 cách thủ
công mà thôi , như là viết hàm ngắt với ASM vậy .
#INT_AD : chuyển đổi A /D đã hoàn tất , thường thì không nên dùng
#INT_ADOF : I don’t know
#INT_BUSCOL : xung đột bus
#INT_BUTTON : nút nhấn ( không biết hoạt động thế nào )
#INT_CCP1 : có Capture hay compare trên CCP1
#INT_CCP2 : có Capture hay compare trên CCP2
#INT_COMP : kiểm tra bằng nhau trên Comparator
#INT_EEPROM : hoàn thành ghi EEPROM
#INT_EXT : ngắt ngoài
#INT_EXT1 : ngắt ngoài 1
#INT_EXT2 : ngắt ngoài 2
#INT_I2C : có hoạt động I 2C
#INT_LCD : có hoạt động LCD
#INT_LOWVOLT : phát hiện áp thấp
#INT_PSP : có data vào cổng Parallel slave
#INT_RB : bất kỳ thay đổi nào trên chân B4 đến B7
#INT_RC : bất kỳ thay đổi nào trên chân C4 đến C7
#INT_RDA : data nhận từ RS 232 sẵn sàng
#INT_RTCC : tràn Timer 0
#INT_SSP : có hoạt động SPI hay I 2C
#INT_TBE : bộ đệm chuyển RS 232 trống
#INT_TIMER0 : một tên khác của #INT_RTCC
#INT_TIMER1 : tràn Timer 1
#INT_TIMER2 : tràn Timer 2
#INT_TIMER3 : tràn Timer 3
#INT_TIMER5 : tràn Timer 5
#INT_OSCF : lỗi OSC
#INT_PWMTB : ngắt cuả PWM time base
#INT_IC3DR : ngắt đổi hướng ( direct ) của IC 3
#INT_IC2QEI : ngắt của QEI
#INT_IC1 : ngắt IC 1
+ Hàm đi kèm phục vụ ngắt không cần tham số vì không có tác dụng .
+ Sử dụng NOCLEAR sau #int_xxx để CCS không xoá cờ ngắt của hàm đó .
+ Để cho phép ngắt đó hoạt động phải dùng lệnh enable_interrupts ( int_xxxx) vàenable_interrupts (global ) .
+ Khoá FAST theo sau #int_xxxx để cho ngắt đó là ưu tiên cao , chỉ được 1 ngắt thôi , chỉ có ở PIC 18 và dsPIC .
VD : #int_timer0 FAST NOCLEAR
III / CÁC HÀM THIẾT LẬP HOẠT ĐỘNG NGẮT :
1 / enable_interrupts ( level )
+ level là tên các ngắt đã cho ở trên hay là GLOBAL để cho phép ngắt ở cấp toàn cục .
+ Mọi ngắt của VDK đều có 1 bit cờ ngắt , 1 bit cho phép ngắt . Khi có ngắt thì bit cờ ngắt bị set =1, nhưng ngắt có họat động được hay không tuỳ thuộc bit cho phép ngắt . enable_interrupts (int_xxx ) sẽ bật bit cho phép ngắt . Nhưng tất cả các ngắt đều không thể thực thi nếu bit cho phép ngắt toàn cục = 0, enable_interrupts( global ) sẽ bật bit này .
VD : để cho phép ngắt timer0 và timer1 hoạt động:
enable_interrupts (int_timer0);
enable_interrupts (int_timer1 ) ;
enable_interrupts ( global ); // chỉ cần dùng 1 lần trừ phi muốn có thay đổi đặc biệt
2 / disable_interrupts ( level )
+ level giống như trên .
+ Hàm này vô hiệu 1 ngắt bằng cách set bit cho phép ngắt = 0 .
+ disable_interrupts ( global ) set bit cho phép ngắt toàn cục =0 , cấm tất cả các ngắt .
+ Không dùng hàm này trong hàm phục vụ ngắt vì không có tác dụng , cờ ngắt luôn bị xoá tự động .
3 / clear_interupt ( level )
+ level không có GLOBAL .
+ Hàm này xoá cờ ngắt của ngắt được chỉ định bởi level .
4 / ext_int_edge ( source , edge )
+ Hàm này thiết lập nguồn ngắt ngoài EXTx là cạnh lên hay cạnh xuống .
+ source : nguồn ngắt . Trên PIC 18 có 3 nguồn ngắt trên 3 chân EXT0, EXT1, EXT2 ứng với source =0,1, 2 . Các PIC khác chỉ có 1 nguồn EXT nên source = 0 .
+ edge : chọn cạnh kích ngắt , edge = L_TO_H nếu chọn cạnh lên ( từ mức thấp chuyển lên mức cao ) hay H_TO_L nếu chọn cạnh xuống .
IV / CÁC CHƯƠNG TRÌNH VD VỀ NGẮT :
1 / #INT_RB :
+ Sau đây là 1 chương trình điển hình về sử dụng ngắt khi có sự thay đổi trên chân B4-B7 .
+ Mô tả : mỗi khi nhấn nút bất kỳ trên B4-B7 , sẽ kích ngắt RB , hàm phục vụ ngắt có tên RB_LED được thực thi , hàm này đơn giản là xuất ra LED ở vị trí tương ứng nhưng trên portD từ D4 – D7 .
+ VDK là 16F877 .
#include < 16F877.h >
#device PIC16F877 *=16
#use delay (clock = 20000000 ) //thêm khai báo này nếu ctrình có dùng hàm delay,OSC=20 Mhz
#byte portb = 0x06 //tạo tên danh định portb thay thế địa chỉ portB là 06h
#byte portd = 0x08 //tạo tên danh định portd thay thế địa chỉ portD là 08h
#INT_RB
Void RB_LED ( ) // hàm phục vụ ngắt
{
portd=portb;
}
void main ( )
{ set_tris_b ( 0xF0 ) ; // portB = 11110000 , B4-B7 là ngõ vào , B0-B3 là ngõ ra
set_tris_d ( 0x00 ) ; // portD = 00000000 , D0-D7 đều là ngõ ra
enable_interrupts ( INT_RB ) ; // cho phép ngắt RB
enable_interrupts ( GLOBAL ) ; // cho phép ngắt toàn cục
// do chương trình không làm gì khác ngoài việc chờ ngắt nên vòng while này trống không
while( true )
{ //có thể thêm mã xử lý ở đây . . .
}
} //main
Hướng dẫn làm mạch nạp pickit 2 student edition
Ưu điểm:
-rẻ tiền (130k + 2 tiếng ngồi hàn)
-chạy hoàn toàn ổn định như mạch mua bên ngoài
-chức năng giống hoàn toàn mạch pickit 2 thí nghiệm
-thêm chức năng nạp chip 3v3 bán tự động như mạch pk2fun của RP http://products.rpc.vn/tools/pk2fun/
Nhược điểm:
-to hơn do mạch 1 lớp (5x10 cm)
-xấu hơn do hàn dở
mạch nguyên lý
mạch in
sơ đồ cắm linh kiện (sau khi ngâm mạch và quét nhựa thông, in file "PICKIT 2 SE TOP LAYOUT.pdf" ủi lên mặt lưng của mạch cho đẹp và dễ hàn)
-firmware cho 18F2550 là file hex nằm ở đường dẫn C:\Program Files\Microchip\PICkit 2 v2. Ráp mạch xong dùng 1 mạch nạp khác nạp vào 6 chân ICSP nằm cạnh con pic
-cuộn cảm 680uH có thể thay = 330uH
-diod 5818 ko tìm dc có thể thay = 5819
-Ferrite Bead (cuộn xeo hoặc xeo than) có thể chạy ra nhật tảo mua 1k/cái hoặc câu sợi dây đồng qua cũng OK, tác dụng của nó là lọc nhiễu của nguồn USB nhưng laptop xài pin nên chắc ko nhiễu đâu
-các linh kiện còn lại qua đối diện trường mua có hết. con pic mua lẻ là 105k, bo đồng mua loại 10x20cm rửa dc vừa đủ 4 mạch, in đề can 4,5k/tờ, thuốc ngâm 2,5k/bịch số còn lại mua hết tầm 25k nhưng ko bán lẻ. điện trở 10 con 500d nên 2 đứa mua chung là mua rẻ dc 4k rồi và mua chung nhiều đứa thì cảng rẻ
danh sách linh kiện:
-Pic 18F2550 nạp sẵn firmware + socket 28 chân
-Transistor: C1815 x3, A1015 x1
-1 hàng jump đực + 1 cái jumper
-2 LED 1 xanh 1 đỏ
-1 nút reset 2 chân
-Diode: 4148 x1, 5819 x1
-L: 330uH
-1 cái lỗ USB loại B cái
-Thạch anh 20 MHz x1
-Ferrite Bead x1
-Tụ: 104 x1, 22p x2, 47uF x1, 0.47 x1, 100uF x1
-R: 1k x1, 100k x1, 10k x3, 4k7 x4, 2k7 x1, 22k x1, 100 x3, 330 x2
cách sử dụng giống hệt lúc thí nghiệm nhé. module pic có thể lấy nguồn từ mạch nạp nên ko cần mua thêm adapter cấp nguồn. Những bài thí nghiệm tiêu thụ công suất lớn cần cấp nguồn ngoài cho an toàn
Chú ý: Sau này nếu dùng chip 3v3 phải làm theo thứ tự: GỠ JUMPER TRÊN MẠCH NẠP RA TRƯỚC -> CẤP NGUỒN CHO MODULE PIC -> CẮM VÀO MẠCH NẠP
Chip 5v như 16F877A, 16F84A, 16F887,..... dùng như bình thường lúc học thí nghiệm
Vài tấm ảnh chụp trong qúa trình test mạch:
xem thêm tại: www.facebook.com
Mạch nguyên lý dc lấy từ C:\Program Files\Microchip\PICkit 2 v2\PICkit2 User Guide 51553E.pdf trong phần Appendix B. PICkit 2 Schematics và dc lược bỏ những phần ít dùng như Programmer to go,... chỉ lấy phần nạp nên mới dc gọi là Student Edition nghĩa là phiên bản dành cho SV, dc 1 số thầy bên BK nghiên cứu, thay thế bằng các linh kiện dễ tìm ở VN và đưa vào học tập tại các trường BK khắp cả nước. Mình chỉ vẽ lại layout thôi nên mọi người cứ yên tâm làm theo.
Một số bào viết tham khảo:
programmer-mach-nap-pickit2-se-9701/
bài bên dưới do tác giả của Burn-E viết. Nếu thích các bạn có thể mua Burn-E với giá 200k ở tiệm đối diện trường nhưng Burn-E nạp bằng chương trình riêng.
/mach-nap-lam-mach-nap-pickit2-ho-tro-pic-5v-3v3-31228/
Trong quá trình làm nếu có trục trặc có thể tham khảo bài này để sửa chữa hoặc comment tại đây để mọi người cùng thảo luận Sửa chữa Pickit 2
Thông báo về mạch nạp
Như đã nêu, BK đã đưa pickit2 vào học tập dưới dạng 1 bo + 1 bịch linh kiện = 160k cách đây vài tháng. Trường mình có thể do dc công ty RP tài trợ mạch nạp và kit thực hành nên ko cần thiết làm vậy.
-rẻ tiền (130k + 2 tiếng ngồi hàn)
-chạy hoàn toàn ổn định như mạch mua bên ngoài
-chức năng giống hoàn toàn mạch pickit 2 thí nghiệm
-thêm chức năng nạp chip 3v3 bán tự động như mạch pk2fun của RP http://products.rpc.vn/tools/pk2fun/
Nhược điểm:
-to hơn do mạch 1 lớp (5x10 cm)
-xấu hơn do hàn dở
mạch nguyên lý
mạch in
sơ đồ cắm linh kiện (sau khi ngâm mạch và quét nhựa thông, in file "PICKIT 2 SE TOP LAYOUT.pdf" ủi lên mặt lưng của mạch cho đẹp và dễ hàn)
-firmware cho 18F2550 là file hex nằm ở đường dẫn C:\Program Files\Microchip\PICkit 2 v2. Ráp mạch xong dùng 1 mạch nạp khác nạp vào 6 chân ICSP nằm cạnh con pic
-cuộn cảm 680uH có thể thay = 330uH
-diod 5818 ko tìm dc có thể thay = 5819
-Ferrite Bead (cuộn xeo hoặc xeo than) có thể chạy ra nhật tảo mua 1k/cái hoặc câu sợi dây đồng qua cũng OK, tác dụng của nó là lọc nhiễu của nguồn USB nhưng laptop xài pin nên chắc ko nhiễu đâu
-các linh kiện còn lại qua đối diện trường mua có hết. con pic mua lẻ là 105k, bo đồng mua loại 10x20cm rửa dc vừa đủ 4 mạch, in đề can 4,5k/tờ, thuốc ngâm 2,5k/bịch số còn lại mua hết tầm 25k nhưng ko bán lẻ. điện trở 10 con 500d nên 2 đứa mua chung là mua rẻ dc 4k rồi và mua chung nhiều đứa thì cảng rẻ
danh sách linh kiện:
-Pic 18F2550 nạp sẵn firmware + socket 28 chân
-Transistor: C1815 x3, A1015 x1
-1 hàng jump đực + 1 cái jumper
-2 LED 1 xanh 1 đỏ
-1 nút reset 2 chân
-Diode: 4148 x1, 5819 x1
-L: 330uH
-1 cái lỗ USB loại B cái
-Thạch anh 20 MHz x1
-Ferrite Bead x1
-Tụ: 104 x1, 22p x2, 47uF x1, 0.47 x1, 100uF x1
-R: 1k x1, 100k x1, 10k x3, 4k7 x4, 2k7 x1, 22k x1, 100 x3, 330 x2
cách sử dụng giống hệt lúc thí nghiệm nhé. module pic có thể lấy nguồn từ mạch nạp nên ko cần mua thêm adapter cấp nguồn. Những bài thí nghiệm tiêu thụ công suất lớn cần cấp nguồn ngoài cho an toàn
Chú ý: Sau này nếu dùng chip 3v3 phải làm theo thứ tự: GỠ JUMPER TRÊN MẠCH NẠP RA TRƯỚC -> CẤP NGUỒN CHO MODULE PIC -> CẮM VÀO MẠCH NẠP
Chip 5v như 16F877A, 16F84A, 16F887,..... dùng như bình thường lúc học thí nghiệm
Vài tấm ảnh chụp trong qúa trình test mạch:
xem thêm tại: www.facebook.com
Mạch nguyên lý dc lấy từ C:\Program Files\Microchip\PICkit 2 v2\PICkit2 User Guide 51553E.pdf trong phần Appendix B. PICkit 2 Schematics và dc lược bỏ những phần ít dùng như Programmer to go,... chỉ lấy phần nạp nên mới dc gọi là Student Edition nghĩa là phiên bản dành cho SV, dc 1 số thầy bên BK nghiên cứu, thay thế bằng các linh kiện dễ tìm ở VN và đưa vào học tập tại các trường BK khắp cả nước. Mình chỉ vẽ lại layout thôi nên mọi người cứ yên tâm làm theo.
Một số bào viết tham khảo:
programmer-mach-nap-pickit2-se-9701/
bài bên dưới do tác giả của Burn-E viết. Nếu thích các bạn có thể mua Burn-E với giá 200k ở tiệm đối diện trường nhưng Burn-E nạp bằng chương trình riêng.
/mach-nap-lam-mach-nap-pickit2-ho-tro-pic-5v-3v3-31228/
Trong quá trình làm nếu có trục trặc có thể tham khảo bài này để sửa chữa hoặc comment tại đây để mọi người cùng thảo luận Sửa chữa Pickit 2
Thông báo về mạch nạp
Như đã nêu, BK đã đưa pickit2 vào học tập dưới dạng 1 bo + 1 bịch linh kiện = 160k cách đây vài tháng. Trường mình có thể do dc công ty RP tài trợ mạch nạp và kit thực hành nên ko cần thiết làm vậy.
Nguồn: http://icvn.net
Hướng dẫn sử dụng mạch nạp avr910
Mạch nạp avr910 rấ thông dụng với các bạn sinh viên bởi lý do giá thành rẻ , mạch đơn giản dễ làm. Bài viết hôm nay mình sẽ hướng dẫn sử dụng mạch nạp này như thế nào.
Với các bạn chưa có mạch nạp có thể tham khảo mạch sau đây của mình.
Sơ đồ nguyên lý:
Sơ đồ
Mạch in:
Mạch
Mạch
Thực tế :
Kết nối với mạch ứng dụng
Download file Pass : machdientu.net
Nói về phần mềm nạp thì ta có thể sử dụng luôn codevision avr và avr studio để nap chương trình. Tuy nhiên AVR PROG trong avr studio hỗ trợ tốt hơn, nạp nhanh và ít lỗi hơn CV avr.
Giao diện chương trình nạp:
Nói về phần mềm nạp thì ta có thể sử dụng luôn codevision avr và avr studio để nap chương trình. Tuy nhiên AVR PROG trong avr studio hỗ trợ tốt hơn, nạp nhanh và ít lỗi hơn CV avr.
Giao diện chương trình nạp:
Các bạn xem video hướng dẫn để hiểu cách nạp avr910 như thế nào.
Hướng dẫn sử dụng mạch nạp USBasp cho 89 và AVR
Hướng dẫn sử dụng mạch nạp USBasp cho 89 và AVR
So với mạch nạp AVR910, mạch nạp USBasp của Thomas Fischl được người sử dụng đánh giá cao hơn về tính ổn định và tính tiện lợi(chương trình nạp phong phú). Mạch điện nguyên lí cũng khá đơn giản, sử dụng chíp Atmega8 hoặc Atmega48.
Trước hết bạn hãy download những tài liệu cần thiết tại đây và thực hiện theo các chỉ dẫn ở bên dưới.
Trong file nén chũng tôi đã cung cấp cho các bạn mạch nguyên lí, file.hex để nạp cho chip, driver cho máy tính và phần không thể thiếu đó là phần mềm nạp chương trình.
Khi thiết kế mạch bạn có thể tham khảo mạch nguyên lí nguyên bản của USBasp
Mạch nạp isp nguyên bản của nhà sản xuất.
Khi thiết kế mạch bạn có thể tham khảo mạch nguyên lí nguyên bản của USBasp. Có một số lưu ý như sau: Hãy bỏ Jumper2, nối trực tiếp Jumper1 lại (dùng mạch nạp cấp nguồn luôn cho chip).
Nạp firmware cho chip Master: Trước khi gắn chíp mega8 vào mạch điện bạn phải nạp firmware(file.hex) vào chíp bằng một mạch nạp bất kì mà bạn có. Chú ý bạn cần phải fuse bit cho chip này sao cho nguồn thạch anh ngoài 16Mhz được sủ dụng (hãy cài đặt 2 bit BOOTZS0 và BOOTSZ1 bằng 0(cheked),các bit còn lại băng 1(bỏ trống)).
Hình ảnh set fuse bit cho atmega8 dùng phần mềm ISP Programmer
Hình ảnh set fuse bit cho atmega8 dùng phần mềm progisp
Môt vài hình ảnh thực tế.
Sơ đồ chân cho mạch nạp.
Ghép nối với IC 89Sxx.
Ghép nối với họ AVR.
Các thao tác cài driver:
Sau khi chế tạo xong mạch nạp bạn hãy kế nối mạch nạp với maý tính. Khi đó maý tính bạn sẽ yêu cầu bạn cài driver cho thiết bị một cách tự động.
Sau đây là một vài hướng dẫn cài đặt driver:
Biểu tượng USB BASP khi chưa được cài driver.
Chọn chột phải vào biểu tượng USB BASP.
Chọn đường dẫn cho file driver.
Sau khi chọn đường dẫn xong.
Chọn đồng ý.
Biểu tượng USB BASP sau khi nhận driver.
Biểu tượng ISP trên phần mềm nạp chip đã sáng.
Cách sử dụng phần mềm để nạp chíp:
Download http://www.mediafire.com/?xew4397c3zcf76a
So với mạch nạp AVR910, mạch nạp USBasp của Thomas Fischl được người sử dụng đánh giá cao hơn về tính ổn định và tính tiện lợi(chương trình nạp phong phú). Mạch điện nguyên lí cũng khá đơn giản, sử dụng chíp Atmega8 hoặc Atmega48.
Trước hết bạn hãy download những tài liệu cần thiết tại đây và thực hiện theo các chỉ dẫn ở bên dưới.
Trong file nén chũng tôi đã cung cấp cho các bạn mạch nguyên lí, file.hex để nạp cho chip, driver cho máy tính và phần không thể thiếu đó là phần mềm nạp chương trình.
Khi thiết kế mạch bạn có thể tham khảo mạch nguyên lí nguyên bản của USBasp
Mạch nạp isp nguyên bản của nhà sản xuất.
Khi thiết kế mạch bạn có thể tham khảo mạch nguyên lí nguyên bản của USBasp. Có một số lưu ý như sau: Hãy bỏ Jumper2, nối trực tiếp Jumper1 lại (dùng mạch nạp cấp nguồn luôn cho chip).
Nạp firmware cho chip Master: Trước khi gắn chíp mega8 vào mạch điện bạn phải nạp firmware(file.hex) vào chíp bằng một mạch nạp bất kì mà bạn có. Chú ý bạn cần phải fuse bit cho chip này sao cho nguồn thạch anh ngoài 16Mhz được sủ dụng (hãy cài đặt 2 bit BOOTZS0 và BOOTSZ1 bằng 0(cheked),các bit còn lại băng 1(bỏ trống)).
Hình ảnh set fuse bit cho atmega8 dùng phần mềm ISP Programmer
Hình ảnh set fuse bit cho atmega8 dùng phần mềm progisp
Môt vài hình ảnh thực tế.
Sơ đồ chân cho mạch nạp.
Ghép nối với IC 89Sxx.
Ghép nối với họ AVR.
Các thao tác cài driver:
Sau khi chế tạo xong mạch nạp bạn hãy kế nối mạch nạp với maý tính. Khi đó maý tính bạn sẽ yêu cầu bạn cài driver cho thiết bị một cách tự động.
Sau đây là một vài hướng dẫn cài đặt driver:
Biểu tượng USB BASP khi chưa được cài driver.
Chọn chột phải vào biểu tượng USB BASP.
Chọn đường dẫn cho file driver.
Sau khi chọn đường dẫn xong.
Chọn đồng ý.
Biểu tượng USB BASP sau khi nhận driver.
Biểu tượng ISP trên phần mềm nạp chip đã sáng.
Cách sử dụng phần mềm để nạp chíp:
Download http://www.mediafire.com/?xew4397c3zcf76a
Đăng ký:
Bài đăng (Atom)
DBS M05479
Quang Cao