PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > dsPIC - Bộ điều khiển tín hiệu số 16-bit

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

dsPIC - Bộ điều khiển tín hiệu số 16-bit Theo dự kiến của Microchip, vào khoảng năm 2011 dsPIC sẽ có doanh số lớn hơn PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 08-11-2009, 09:16 AM   #1
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Adcbuf

các pác cho e hỏi là bộ ADC trong dsPIC chỉ có 01 thanh ghi ADCBUF0 địa chỉ là từ 0300 đến 0319 vậy làm thế nào để e lấy ADC trên 4 kênh đầu vào mà đọc được dữ liệu đúng?thanks!
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-11-2009, 02:26 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tkpro View Post
các pác cho e hỏi là bộ ADC trong dsPIC chỉ có 01 thanh ghi ADCBUF0 địa chỉ là từ 0300 đến 0319 vậy làm thế nào để e lấy ADC trên 4 kênh đầu vào mà đọc được dữ liệu đúng?thanks!
Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263

thay đổi nội dung bởi: namqn, 08-11-2009 lúc 09:49 PM. Lý do: dsPIC33 khác với dsPIC30
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-11-2009, 09:23 PM   #3
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi namqn View Post
Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 và dsPIC33 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,
e lấy trong datasheet của dspic33 mà anh, trang 45, ví dụ khi e gán value=ADC1BUF0 thì Ok nhưng khi gán value=ADC1BUF1 thì nó báo lỗi ngay. e đang dùng dsPIC33FJ256GP71.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-11-2009, 09:32 PM   #4
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi namqn View Post
Bạn lấy thông tin địa chỉ như trên từ đâu vậy?

16 thanh ghi kết quả ADC trong dsPIC30 và dsPIC33 có tên theo thứ tự là ADCBUF0 đến ADCBUFF, bạn cần truy xuất vị trí nào trong bộ đệm kết quả dài 16-word thì cứ dùng tên tương ứng. Vấn đề địa chỉ hãy để cho trình dịch xử lý.

Thân,
e vừa check lại xong.
thằng dsPIC30 thì như anh nói nhưng thằng dsPIC33 lại khác anh ah
anh có thể giúp e cách truy cập địa chỉ của nó để lấy data kô?
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-11-2009, 09:48 PM   #5
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tkpro View Post
e vừa check lại xong.
thằng dsPIC30 thì như anh nói nhưng thằng dsPIC33 lại khác anh ah
anh có thể giúp e cách truy cập địa chỉ của nó để lấy data kô?
Bạn nói đúng. ADC của dsPIC33F chỉ có một thanh ghi đệm kết quả là ADCxBUF0, do đó bạn phải tự copy kết quả vào vùng đệm trước khi có kết quả mới (tham khảo code example CE121 của Microchip), hoặc thiết lập để dùng DMA, cho phép kết quả được tự động sao chép vào một vùng nhớ định trước (tham khảo code example CE120 của Microchip).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263

thay đổi nội dung bởi: namqn, 08-11-2009 lúc 09:59 PM. Lý do: bổ sung thông tin
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-11-2009, 09:51 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi tkpro View Post
e lấy trong datasheet của dspic33 mà anh, trang 45, ví dụ khi e gán value=ADC1BUF0 thì Ok nhưng khi gán value=ADC1BUF1 thì nó báo lỗi ngay. e đang dùng dsPIC33FJ256GP71.
Datasheet mô tả rằng ADC1BUF0 có địa chỉ là 0x300, chứ không phải có địa chỉ từ 0x300 đến 0x319.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-11-2009, 11:51 AM   #7
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi namqn View Post
Datasheet mô tả rằng ADC1BUF0 có địa chỉ là 0x300, chứ không phải có địa chỉ từ 0x300 đến 0x319.

Thân,
tôi đã down về và thử đoạn code này rồi.
chạy Ok đấy.
anh e cùng tham khảo nhé.

#if defined(__dsPIC33F__)
#include "p33fxxxx.h"
#elif defined(__PIC24H__)
#include "p24hxxxx.h"
#endif

#include "adcDrv1.h"
#include "tglPin.h"

#define SAMP_BUFF_SIZE 8 // Size of the input buffer per analog input
#define NUM_CHS2SCAN 4 // Number of channels enabled for channel scan

/*================================================= ============================
ADC INITIALIZATION FOR CHANNEL SCAN
================================================== ===========================*/
void initAdc1(void)
{

AD1CON1bits.FORM = 3; // Data Output Format: Signed Fraction (Q15 format)
AD1CON1bits.SSRC = 2; // Sample Clock Source: GP Timer starts conversion
AD1CON1bits.ASAM = 1; // ADC Sample Control: Sampling begins immediately after conversion
AD1CON1bits.AD12B = 0; // 10-bit ADC operation

AD1CON2bits.CSCNA = 1; // Scan Input Selections for CH0+ during Sample A bit
AD1CON2bits.CHPS = 0; // Converts CH0

AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
AD1CON3bits.ADCS = 63; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*64 = 1.6us (625Khz)
// ADC Conversion Time for 10-bit Tc=12*Tab = 19.2us

AD1CON2bits.SMPI = (NUM_CHS2SCAN-1); // 4 ADC Channel is scanned

//AD1CSSH/AD1CSSL: A/D Input Scan Selection Register
AD1CSSH = 0x0000;
AD1CSSLbits.CSS4=1; // Enable AN4 for channel scan
AD1CSSLbits.CSS5=1; // Enable AN5 for channel scan
AD1CSSLbits.CSS10=1; // Enable AN10 for channel scan
AD1CSSLbits.CSS13=1; // Enable AN13 for channel scan

//AD1PCFGH/AD1PCFGL: Port Configuration Register
AD1PCFGL=0xFFFF;
AD1PCFGH=0xFFFF;
AD1PCFGLbits.PCFG4 = 0; // AN4 as Analog Input
AD1PCFGLbits.PCFG5 = 0; // AN5 as Analog Input
AD1PCFGLbits.PCFG10 = 0; // AN10 as Analog Input
AD1PCFGLbits.PCFG13 = 0; // AN13 as Analog Input


IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
IEC0bits.AD1IE = 1; // Enable A/D interrupt
AD1CON1bits.ADON = 1; // Turn on the A/D converter

tglPinInit();

}

/*================================================= ============================
Timer 3 is setup to time-out every 125 microseconds (8Khz Rate). As a result, the module
will stop sampling and trigger a conversion on every Timer3 time-out, i.e., Ts=125us.
================================================== ===========================*/
void initTmr3()
{
TMR3 = 0x0000;
PR3 = 4999;
IFS0bits.T3IF = 0;
IEC0bits.T3IE = 0;

//Start Timer 3
T3CONbits.TON = 1;

}

/*================================================= ============================
ADC INTERRUPT SERVICE ROUTINE
================================================== ===========================*/
int ain3Buff[SAMP_BUFF_SIZE];
int ain4Buff[SAMP_BUFF_SIZE];
int ain10Buff[SAMP_BUFF_SIZE];
int ain13Buff[SAMP_BUFF_SIZE];

int scanCounter=0;
int sampleCounter=0;

void __attribute__((interrupt, no_auto_psv)) _ADC1Interrupt(void)
{

switch (scanCounter)
{
case 0:
ain3Buff[sampleCounter]=ADC1BUF0;
break;

case 1:
ain4Buff[sampleCounter]=ADC1BUF0;
break;

case 2:
ain10Buff[sampleCounter]=ADC1BUF0;
break;

case 3:
ain13Buff[sampleCounter]=ADC1BUF0;
break;

default:
break;

}

scanCounter++;
if(scanCounter==NUM_CHS2SCAN) {
scanCounter=0;
sampleCounter++;
}

if(sampleCounter==SAMP_BUFF_SIZE)
sampleCounter=0;

tglPin(); // Toggle RA6
IFS0bits.AD1IF = 0; // Clear the ADC1 Interrupt Flag

}
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-11-2009, 11:36 PM   #8
TOVU
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 11
:
đúng chổ mình đang thắc mắc!

em cũng đang làm phần adc của dspic33f ,rõ ràng trong adc family reference của nó ,ở các giảng đồ định thì thì thấy có tồn tại các thanh ghi buffer1 ,buffer2....,ngay cả trong datasheet vẩn liệt kê vùng nhớ buffer là từ 0300 đến 0319 .vậy mà trong file .h nó chỉ khai báo 1 buffer 0.
em muốn lấy mẩu đồng thời 4 kênh (simultaneous)bằng software ( SSRC<2:0> = 000) ,nhưng không làm được. vì nó chỉ ghi vào buffer0 mà bỏ trống mấy buffer khác .vì quá trình chuyễn đỗi ở chế độ simultaneous chỉ kết thúc (DONE =1) khi đã hoàn tất convert 4 kênh ,và mổi lần convert nó điều ghi vào buffer0 hết .vậy là chỉ nhận dc duy nhất giá trị kênh CH3 ở bufer0 ,các kênh khác là zero.!!!! (em không muốn dùng DMA trong trường hợp này).
vấn đề e không hiểu tại sao MC lại thiết kế dòng dspic33f như vậy ,không biết đây có phải là 1 lỗi thiết kế??.Thầy Nam có thể chỉ cho e cách nào lấy mẫu đồng thời mà không phải dùng DMA được không ?? .Nếu nắm được phần này e sẽ viết một report về phần ADC và DAC của dspic33f cho các bạn cùng tham khảo. xin chân thành cám ơn
TOVU vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-11-2009, 02:48 PM   #9
tkpro
Đệ tử 4 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 61
:
Trích:
Nguyên văn bởi TOVU View Post
em cũng đang làm phần adc của dspic33f ,rõ ràng trong adc family reference của nó ,ở các giảng đồ định thì thì thấy có tồn tại các thanh ghi buffer1 ,buffer2....,ngay cả trong datasheet vẩn liệt kê vùng nhớ buffer là từ 0300 đến 0319 .vậy mà trong file .h nó chỉ khai báo 1 buffer 0.
em muốn lấy mẩu đồng thời 4 kênh (simultaneous)bằng software ( SSRC<2:0> = 000) ,nhưng không làm được. vì nó chỉ ghi vào buffer0 mà bỏ trống mấy buffer khác .vì quá trình chuyễn đỗi ở chế độ simultaneous chỉ kết thúc (DONE =1) khi đã hoàn tất convert 4 kênh ,và mổi lần convert nó điều ghi vào buffer0 hết .vậy là chỉ nhận dc duy nhất giá trị kênh CH3 ở bufer0 ,các kênh khác là zero.!!!! (em không muốn dùng DMA trong trường hợp này).
vấn đề e không hiểu tại sao MC lại thiết kế dòng dspic33f như vậy ,không biết đây có phải là 1 lỗi thiết kế??.Thầy Nam có thể chỉ cho e cách nào lấy mẫu đồng thời mà không phải dùng DMA được không ?? .Nếu nắm được phần này e sẽ viết một report về phần ADC và DAC của dspic33f cho các bạn cùng tham khảo. xin chân thành cám ơn
bạn làm như trong đoạn chương trình con phục vụ ngắt mà tôi đã post lên rồi ý. tôi thử rồi, nó chạy ầm ầm mà.
tkpro vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-11-2009, 10:30 PM   #10
TOVU
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 11
:
mình biết chương trình của bạn chạy , cái bài toán mình đặt ra khác hẳn so với của bạn ,nên nếu làm vậy thì không được .
bài toán của mình gồm 2 yêu cầu: lấy mẫu đồng thời và chạy ở chế độ manual không DMA.
mình đã giải quyết được yêu cầu này ,nhưng bằng DMA .
TOVU vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam