dsPIC Tutorial 2-Các kỹ thuật cơ bản
2 Attachment(s)
Tutorial 2 cho dsPIC, viết trong ASM30. Bà con đừng nôn nóng nhé, sẽ có các tutorial viết bằng C30. Những vấn đề cơ bản về dsPIC nên được viết bằng ASM30, để hiểu rõ hơn cấu trúc của chip.
Tutorial này chỉ có các ví dụ về LED, nhưng có nhiều kỹ thuật cơ bản và khá nhiều lệnh cơ bản được đề cập, do đó các bạn đừng bỏ qua nó. Tôi sẽ dựa vào những kỹ thuật và lệnh cơ bản này để viết tiếp các tutorial khác. Các tập tin nguồn và .hex nằm trong tập tin .zip nhé. Chúc thành công nhé! Thân, |
Như đã thông báo, dưới đây là link để download các mã nguồn viết trong C30 (và các tập tin .hex đã được dịch ra) cho các ví dụ của tutorial này. Các mã nguồn C30 được chuyển đổi từ các mã nguồn ASM30, với chú thích khá chi tiết, do đó tôi sẽ không viết tutorial cho phiên bản C30.
http://picvietnam.com/download/uploa...n/Vidu2C30.zip Chúc thành công! Thân, |
1 Attachment(s)
Của em đây!
Thân, |
Chào bác nam.trước em có làm với pic6F877A,bây giờ em chuyển sang học về DSPIC.
Bác có thể nói rõ hơn về thanh ghi LATX được ko bác. Con 877A ko có thanh ghi này và em đọc trong datasheet thì ko hiểu lắm. Thanh ghi TrisX thì vẫn giống 877A,để định ngiã cổng vào/ra Còn thanh ghi PortX trong 877A để xuất dữ liệu ra là mức cao hay thấp. Còn trong các ví dụ của bác,em chưa thấy được vai trò của PortX Và dường như bác toàn sử dụng LatX. Bác nói rõ hơn cho em được ko Thanks bác |
Trích:
Kể từ dòng PIC cấp cao (PIC18), Microchip đã sử dụng hai thanh ghi đệm cho các thao tác xuất nhập, là LATx và PORTx. Như vậy, khi ghi ra các ngõ ra, chúng ta sẽ thao tác thanh ghi LATx, còn khi đọc vào từ các ngõ vào, chúng ta sẽ thao tác thanh ghi PORTx, và sẽ tránh được các rắc rối liên quan đến hiệu ứng read-modify-write. Bạn có thể thấy tôi sử dụng các thanh ghi PORTx ở tutorial 3, khi đọc trạng thái của các switch. Thân, |
ah,thì ra là vậy,cảm ơn bác.
Bác cho em hỏi câu nữa,nếu bác có thời gian. Nếu 1 cổng định nghĩa là lối vào(như RE0) chẳng hạn thì nó ở trạng thái trở kháng cao phải ko bác( tức là ko phải mức 0 mà cũng chả phải mức 1). |
Trích:
Thân, |
Code:
//Chuong trinh con khoi tao Timer 1, tran sau moi 1 giay o muc xung 8 Mips |
T1CON<5:4> = '11' sẽ cho prescale là 1:256 (nghĩa là 256 chu kỳ máy thì timer 1 mới đếm thêm 1 đơn vị), và T1CON<15> = '1' để bật timer. Vậy T1CON = 1000 0000 0011 0000 = 0x8030.
PR1 = 0x7A12 = 31250. Với tần số thực thi lệnh (Fosc/4) = 8 MIPS = 8000000, thời gian để timer 1 tràn là 8000000/(256*31250) = 1 (giây). Thân, |
Chào anh namqn!
Trong tài liệu của anh đưa, em có thấy sử dụng chương trình mô phỏng dsPIC30F4012. Anh có thể cho biết đó là chương trình mô phỏng gì và share chương trình đó được kô. Thanks hoanf |
Trích:
Thân, |
Code:
// Timer 1 initialize: Internal Cycle Clock, với period_value = 16000, internal cycle là 16MIPs |
Trích:
Thân, |
mình đã config cho dsPIC chạy ở chế độ 16 MPIs như sau:
Code:
_FOSCSEL(FNOSC_FRC); // Select Internal FRC at POR Nhưng bạn thấy trên phần init_Timer1 của mình intialize như vậy thì đúng là nếu như dsPIC chạy ở 16 MIPs thì timer sẽ interrupt ở 1ms chứ? Hơn nữa, đây là intterupt trong timer1 để mình kiểm tra: Code:
// Timer 1 Interrupt Routine |
Bạn thử comment các hàm home_it() và line2() xem. Ngắt của bạn xảy ra mỗi ms, không nên để các hàm xuất tín hiệu ra LCD (tôi đoán vậy) vào trình xử lý ngắt.
Thân, |
Trong ví dụ 2-4.c - Tutorial 2 của anh Nam đó có dòng khai báo bảng hằng số trong ROM là
const unsigned __attribute__ ((space(psv), address (0x0200))) LED_PAT[10] = {0xFFFE, 0xFFFD, 0xFFFB, 0xFFF7, 0xFFEF, 0xFFDF, 0xFFEF, 0xFFF7, 0xFFFB, 0xFFFD}; anh cho em hỏi là mình muốn khai báo bảng sin gồm 2000 phần tử float (tức cần khoảng 8Kbyte) thì có được không? cách truy cập nó như thế nào? |
Trích:
PSV là một cửa sổ 32 kB, về nguyên tắc là bạn có thể thực hiện yêu cầu trên. Thân, |
Em đã thử khai báo
float __attribute__ ((space(psv), address (0x0200))) Sin[2001]; bởi vì đang cần tính các giá trị sin sau mới đưa vào bảng nhưng khi biên dịch báo lỗi Link Error: Could not allocate section .data_0x200 at 0x200 Link Error: Could not allocate program memory vậy có cách nào khai báo môt mảng như trên tính các giá trị rồi lưu vào ROM k anh? cảm ơn anh |
bác nam cho em hỏi ,làm sao để set mức xung là 5Mips or 8Mips khi sử dụng dao động nội ??? em chỉ thấy set mỗi cái FRC_PLL4
|
Trích:
Trong khai báo trên, bạn đã bỏ mất từ khóa const, do đó thông báo lỗi đầu tiên cho thấy trình biên dịch thông báo không thể cấp phát bộ nhớ dữ liệu cho bạn ở địa chỉ 0x200 (vì trình biên dịch hiểu là bạn cần RAM cho 2001 ô nhớ kiểu float, bắt đầu ở địa chỉ 0x200). Thân, |
Trích:
Nếu tần số của FRC là 8 MHz, để có tần số thực thi lệnh là 8 MIPS thì chỉ cần dùng FRC với PLL x4 (chính là cấu hình FRC_PLL4). Thân, |
Em thắc mắc bởi vì trong vd 2_1 có dòng :
"Hai dòng lệnh 26 và 27 đặt ngưỡng tràn tương ứng với 0,5 giây ở tần số thực thi lệnh là 5 MHz (tức là chip có clock bằng 20 MHz)." rồi xuống cuối ví dụ a có dòng : "điều chỉnh ngưỡng tràn để LED sẽ nhấp nháy đúng 1 Hz (với mã hiện tại thì LED sẽ nhấp nháy ở 1,6 Hz, vì tần số thực thi lệnh của chip sẽ là 8 MHz với bộ dao động nội 8 MHz và PLLx4 được kích hoạt) " Sau khi đọc câu trả lời của a thì em đã hiểu ý nghĩa của dòng cuối này ,chứ trước đó em ko hiểu tại sao cùng set PLL4 mà sao trên thì 5MHz ,dưới thì 8 Mhz .Nhưng em đọc trong cái dsPIC Manual thì thấy FRC là 7,37 Mhz ,vậy PLLx4 = 29.48Mhz ,PLLx8 = 58.96 Mhz ,PLLx16 = 117.92 Mhz ,vậy đâu dùng 8Mhz được ,và giá trị nhỏ nhất của bộ dao động nội là 29.48Mhz ??? mà sao người ta để lẻ thế nhỉ ??? Ah ,anh giải thích thêm dùm em về cách khai báo biến : ở vd 2-3 : _ .bss cho đoạn chứa các dữ liệu không khởi tạo giá trị (.data cho đoạn chứa các dữ liệu khởi tạo giá trị <<< là hằng số ??? ) _ .align 2 << ??? _ count: .space 2 << khai bao biến count 16bit ở vd 2-4 : _ .section Table,psv, address(0x0200) <<< khai báo bảng Table có địa chỉ 0x0200 ,vậy psv ở đây nghĩa là jì ???Trong cái tag Output em chẳng thấy cái psv này đâu cả : Trích:
vậy dòng : _ mov #psvpage(Table),W0 <<< xác định địa chỉ trang chứa Table vào W0 ??? _ mov W0, PSVPAG <<< ghi cái địa chỉ này vào thanh ghi PSVPAG _ mov #psvoffset(Table),W1 <<< ghi vị trí các số hạng vào W1 ??? _ mov W1, W2 <<< lấy vị trí đầu bảng ,em coi watch thì thấy vị trí này là 0x8200 ??? _ add W1,#(1082), W3 <<< lấy vị trí cuối bảng ,10*2 = 10 giá trị 2byte ??? em koi watch thì vị trí này là 0x8214 ???? 10 giá trị mà sao lại 0x8214 ?? _ #psvpage với #psvoffset em kiếm trong datasheet với cái 70157C mà ko thấy nói .Cái này do định nghĩa sẵn trong chip ah ??? Típ nữa ^_^ : dòng: _ mov [W1++], W0 <<< [] là lấy giá trị thứ W1 ,ghi vào W0 sau đó tăng giá trị W1 ??? ,em koi watch thì sau dòng lệnh này W1 từ 0x8200 -> 0x8202 (tăng 2 giá trị) ,W0 thì gán giá trị đầu tiên của Table .Sau đó W1 từ 0x8202 ->0x8204 (tăng 2 giá trị) ,W0 thì đc gán giá trị thứ 2 ,vậy ++ ở đây là tăng 2 giá trị àh ??? em mới học nên hem bit nhìu @_@ ,a giúp em hen ^_^ ,thanks a |
Về việc tại sao tần số là 8 MHz mà không phải là 7.37 MHz như trong tài liệu, bạn đọc post #15 ở luồng sau:
http://www.picvietnam.com/forum//showthread.php?t=553 Về .bss, .align, .space, và .section, đề nghị bạn đọc tài liệu hướng dẫn của ASM30, link download dưới đây, nếu bạn chưa biết (tôi không muốn và cũng không thể giải thích tất cả những gì đã có trong tài liệu hướng dẫn): http://ww1.microchip.com/downloads/e...Doc/51317G.pdf Về các lệnh hợp ngữ của dsPIC, bạn đọc tài liệu tham khảo của dsPIC30F, link download dưới đây, nếu bạn chưa biết: http://ww1.microchip.com/downloads/e...Doc/70046E.pdf Bạn xem hình 4-7 của tài liệu trên để thấy được không gian PSV được ánh xạ vào vùng địa chỉ bắt đầu từ 0x8000, do đó bảng được khai báo ở 0x0200 sẽ có địa chỉ 0x8200 khi thực thi code. Các toán tử psvpage() và psvoffset() do ASM30 cung cấp, đã được đề cập đến trong tutorial. 0x14 = 20 W1++ để chỉ đến ô dữ liệu kế tiếp, toán hạng đang dùng là word, địa chỉ được sử dụng là địa chỉ byte, do đó sẽ tăng 2 để chỉ đến word kế tiếp. Thân, |
giả lập dsPIC
em mới có mấy con dsPIC nhưng chân bé quá, hàn ko nổi
cũng muốn học dùng MPLab và dsPIC nhưng ko có mạch có chương trình nào có giả lập mấy con dsPIC ko anh Nam nhỉ? |
Trích:
Thân, |
Thầy Nam cho em hỏi: em lấy code (vidu2_1) và thay bởi 30F2010 (vì em đang dung con này) ở hàng :
" .equ __30F2010, 1 " Thì khi biên dịch mplap báo lối là: " Error: undefined symbol `FRC_PLL4' in operation " Còn khi em thay hàng: " config __FOSC, CSW_FSCM_OFF & FRC_PLL4 " bởi hàng : " config __FOSC, CSW_FSCM_OFF & XT_PLL16 " thì lại biên dịch được. Nên em nghĩ con 2010 nó không có chế độ dao đông nội !!! phải không thầy ? Nếu nối vào 2 chân OSC1 với OSC2 bởi thạch anh 10 Mhz thì mình có được thiết lập chế độ dao động nội không hả thầy ? ý em là đối với dsPIC thì phần cứng phụ thuộc vào phần mềm hay ngược lại ? cảm ơn thầy ! chúc vui ! |
Trích:
Code:
config __FOSC, CSW_FSCM_OFF & FRC Bạn có thể nối thạch anh ngoài vào mạch dao động của dsPIC mà vẫn dùng bộ dao động nội. Thực tế, đây là một tính năng của dsPIC. dsPIC có thể chuyển qua lại giữa các nguồn dao động ở chế độ vận hành bình thường (tính năng này được Microchip gọi là Clock Switching, trong các ví dụ của tôi để đơn giản hóa tôi đã thiết lập tắt chức năng này: CSW_FSCM_OFF). Bạn thiết kế phần cứng theo khả năng của dsPIC, và viết firmware tương thích với phần cứng đó. Thân, |
Trích:
Nhưng khi em dùng mạch nạp ICD2 nạp chương trình xuống dsPIC2010 (vidu2_1) thì nó không chạy thầy ơi ! Phần cứng em thiết lập chắc chắn đúng rồi (vì đây là ứng dụng đơn giản chỉ nối từ RD0 1 con led với con trở 1K xuống GND và cấp đủ các chân nguồn cho dsPIC). Lúc đầu em nghĩ là dsPIC bị chết nhưng nếu bị chết thì làm sao mà ICD2 vẫn detect được nó,và program bình thường , đúng không thầy ? Còn em dùng chế độ debug với ICD2 thì nó nhấp nháy led bình thường giống như mịnh muốn !!!! vậy là sao hả thầy ??? bạn nào biết nó bị lỗi gì thì chỉ mình với ! Em cảm ơn thầy ! và các bạn ! Trân trọng ! |
1 Attachment(s)
Trích:
Để chạy code trên board như bình thường thì bạn cần đổi lại build configuration là "Release". Thân, |
Trích:
Nó chạy rồi thầy ạ , cảm ơn thầy nhiều! Trân trọng ! |
em muốn mô phỏng dòng dspic30f nhưng trên protus mà không có.em có biết đến MPLAB Sim nhưng nó không có các thành phần như điện trở hay là tụ điện...ý em là muốn mô phỏng 1 mạch hoàn chỉnh...bác có cách nào giúp em được không?
|
Init_PORTS:
clr LATB clr LATD ;Xoa thanh ghi chot cho cong D mov #0xFFFD, W0 ;LED noi vao cong D, chan RD0 mov W0, TRISD return anh nam oi . tai sao trong vi du 2.1 em thay doi ngo ra la RD1 mà khi em thuc hien lai không nhấp nháy được như ngõ ra RD0 và em hay port xuat cung ko duoc . vd em thay la rb0 chi sang chu ko nhap nhay . CODE EM THAY DOI GIONG O TREN . CAM ON ANH |
Cho em hoi
E thay đổi ngõ ra la RD1 nhưng ko nhấp nhdduwwocwj. khi chuyển sang portb cung được. anh nam co thể em giup em dk ko. code em thay đổi .
Init_PORTS: clr LATD ;Xoa thanh ghi chot cho cong D mov #0xFFFD, W0 ;LED noi vao cong D, chan RD1 mov W0, TRISD return Cảm ơn anh. |
E thay đổi ngõ ra la RD1 nhưng ko nhấp nhdduwwocwj. khi chuyển sang portb cung được. anh nam co thể em giup em dk ko. code em thay đổi .
Init_PORTS: clr LATD ;Xoa thanh ghi chot cho cong D mov #0xFFFD, W0 ;LED noi vao cong D, chan RD1 mov W0, TRISD return Cảm ơn anh. |
Múi giờ GMT. Hiện tại là 04:07 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam