PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   dsPIC Tutorial 2-Các kỹ thuật cơ bản (http://www.picvietnam.com/forum/showthread.php?t=410)

nghean 02-04-2008 08:18 PM

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?

namqn 02-04-2008 09:07 PM

Trích:

Nguyên văn bởi nghean (Post 15313)
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?

Tất nhiên là được, miễn là dsPIC của bạn có đủ chỗ trống trong bộ nhớ chương trình cho bảng hằng số đó. Bạn chỉ cần khai báo tương tự như trên, thay từ khóa unsigned bằng từ khóa float, và dùng một biến float để truy cập các phần tử của bảng, theo cách mà tôi đã minh họa trong tutorial.

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,

nghean 02-04-2008 09:54 PM

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

chukhivuitinh 26-04-2008 05:52 PM

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

namqn 26-04-2008 06:18 PM

Trích:

Nguyên văn bởi nghean (Post 15315)
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

Để lưu bảng vào flash, các phần tử của bảng phải là hằng số vào thời điểm biên dịch mã nguồn. Do đó, bạn nên dùng một công cụ khác để tạo ra bảng giá trị trước (Excel chẳng hạn), rồi copy các giá trị đó vào khai báo bảng hằng số của bạn.

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,

namqn 26-04-2008 06:28 PM

Trích:

Nguyên văn bởi chukhivuitinh (Post 15811)
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

Tôi cho là không thể thiết lập 5 MIPS khi dùng bộ dao động nội của dsPIC, vì các FRC của dsPIC30F có tần số 7.37 hoặc 8 MHz, và để dùng tần số thực thi lệnh từ 2 MIPS trở lên với bộ dao động nội, chúng ta sẽ cần dùng bộ PLL. Lấy ví dụ dsPIC30F4012, chúng ta chỉ có thể dùng PLL x4, x8 hoặc x16.

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,

chukhivuitinh 28-04-2008 01:22 AM

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:

section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.reset 0 0x4 0x6 (6)
.ivt 0x4 0x7c 0xba (186)
.aivt 0x84 0x7c 0xba (186)
.text 0x100 0x4c 0x72 (114)
.dinit 0x14c 0x2 0x3 (3)
.isr 0x14e 0x2 0x3 (3)
Table 0x200 0x14 0x1e (30)
__FOSC 0xf80000 0x2 0x3 (3)
__FWDT 0xf80002 0x2 0x3 (3)
__FBORPOR 0xf80004 0x2 0x3 (3)
__FGS 0xf8000a 0x2 0x3 (3)

Total program memory used (bytes): 0x21c (540) 1%
Tiếp tục ^_^ ,trong vd 2-4 PSV là bit 2 trong thanh ghi Core Control Register CORCON
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

namqn 28-04-2008 02:43 AM

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,

hopeman 11-06-2008 04:30 PM

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ỉ?

namqn 11-06-2008 07:05 PM

Trích:

Nguyên văn bởi hopeman (Post 16764)
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ỉ?

MPLAB IDE hỗ trợ mô phỏng các dsPIC, nhưng không mô phỏng tốt ngoại vi. Proteus có thể mô phỏng tốt ngoại vi cùng với vi điều khiển, nhưng chỉ hỗ trợ PIC24 vào thời điểm hiện tại. Tôi cũng tin rằng CCS PCD, HI-TECH PICC, và IAR Embedded Workbench có thể mô phỏng dsPIC, nhưng tôi không dùng các sản phẩm này.

Thân,

conglong 04-03-2009 05:21 PM

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 !

namqn 04-03-2009 05:52 PM

Trích:

Nguyên văn bởi conglong (Post 23198)
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 !

dsPIC30F2010 có bộ dao động nội FRC, nhưng không có chế độ FRC nối vào PLL. Nếu bạn dùng
Code:

        config        __FOSC, CSW_FSCM_OFF & FRC
thì sẽ không có vấn đề gì.

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,

conglong 04-03-2009 07:21 PM

Trích:

Nguyên văn bởi namqn (Post 23200)
dsPIC30F2010 có bộ dao động nội FRC, nhưng không có chế độ FRC nối vào PLL. Nếu bạn dùng
Code:

        config        __FOSC, CSW_FSCM_OFF & FRC
thì sẽ không có vấn đề gì.

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,

Dạ vâng em đã làm như thầy chỉ , em thiết lập lại mode dao động thì nó không còn lỗi nữa.
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 !

namqn 04-03-2009 10:18 PM

1 Attachment(s)
Trích:

Nguyên văn bởi conglong (Post 23205)
Dạ vâng em đã làm như thầy chỉ , em thiết lập lại mode dao động thì nó không còn lỗi nữa.
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 !

Có lẽ bạn đã chọn build configuration là "Debug" trong MPLAB IDE (hộp thoại nằm trên thanh công cụ Project Manager, xem hình đính kèm bên dưới). Nếu đúng như vậy thì bạn chỉ có thể chạy code với debugger.

Để 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,

conglong 05-03-2009 10:23 AM

Trích:

Nguyên văn bởi namqn (Post 23208)
Có lẽ bạn đã chọn build configuration là "Debug" trong MPLAB IDE (hộp thoại nằm trên thanh công cụ Project Manager, xem hình đính kèm bên dưới). Nếu đúng như vậy thì bạn chỉ có thể chạy code với debugger.

Để 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,

Dạ đúng rồi thầy !
Nó chạy rồi thầy ạ , cảm ơn thầy nhiều!
Trân trọng !


Múi giờ GMT. Hiện tại là 05:46 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam