Lai mot lan nua nho toi cac bac gup do. Tu khi tham gia dien dan ma chua dong gop dc gi. Chi biet hoi thoi, ngai qua di mat.
Van de em thac mac o day chinh la su dung ADC nhieu dau vao.
Cau hinh phan cung cua em gom co:
- ADCINCVR
- MUX4
- PGA
- Timer16
- LCD
mạch có 2 đầu vào tương tự được đưa vào P0.1 và P0.7. EM chi dung mot ADC thoi voi hai dau vao nay.
Và đây là chương trình test thử của em:
WORD wADCData1;
WORD wADCData2;
float Data;
void main()
{
WORD tram,chuc,donvi,temp;
LCD_1_Start();
AMUX4_1_Start();
PGA_1_SetGain(PGA_1_G1_00);
PGA_1_Start(PGA_1_HIGHPOWER);
ADCINCVR_1_Start(ADCINCVR_1_HIGHPOWER);
ADCINCVR_1_GetSamples(0);
LCD_1_Position(0,0);
LCD_1_PrCString("Ready!");
Timer16_1_WritePeriod(9999);
Timer16_1_EnableInt();
M8C_EnableGInt;
Timer16_1_Start();
while(1)
{
LCD_1_Position(0,0);
LCD_1_PrHexInt(wADCData1);
LCD_1_Position(1,0);
LCD_1_PrHexInt(wADCData2);
}
}
void Timer16_1_ISR(void)
{
// lay du lieu tu dau vao thu nhat
AMUX4_1_InputSelect(AMUX4_1_PORT0_1);
ADCINCVR_1_ClearFlag();
//wait for Valid Data
while(0 == ADCINCVR_1_fIsDataAvailable);
wADCData1 = ADCINCVR_1_iGetData();
// lay du lieu tu dau vao thu hai
AMUX4_1_InputSelect(AMUX4_1_PORT0_7);
ADCINCVR_1_ClearFlag();
//wait for Valid Data
while(0 == ADCINCVR_1_fIsDataAvailable);
wADCData2 = ADCINCVR_1_iGetData();
}
Sau khi biên dịch , nạp và chạy thì em thấy kết quả của hai kênh là hoàn toàn giống nhau. Và chính là giá trị của P0.7.
Nếu em chỉ thử từng phần, tức là mỗi chương trình em viết chỉ sử dụng cho một chân thì chạy rất ổn.
Em nghĩ là do MUX, ko biết có đúng không.
Nhưng theo em hiểu thì trong hàm ngắt Timer nó sẽ hoạt động như sau:
- Ban đầu MUX chọn P0.1
- ADC chuyển đổi và lưu vào wADCData1
- Sau đó MUX lại chọn P0.7
- và ADC lại chuyển đổi lưu vào wADCData2
Hai kết quả này được hiển thị ra LCD. Nhưng nếu đúng như vậy thì nó phải khác nhau chứ.
Bác nào biết xin chỉ giúp.
Hoặc nếu đã làm project về phần này rồi thì cho em xin luôn.
Cả ngày hôm nay em làm về phần này mà mãi không xong, ức chế quá, không cả ngủ được.
Cảm ơn các bác rất nhiều.
Van de em thac mac o day chinh la su dung ADC nhieu dau vao.
Cau hinh phan cung cua em gom co:
- ADCINCVR
- MUX4
- PGA
- Timer16
- LCD
mạch có 2 đầu vào tương tự được đưa vào P0.1 và P0.7. EM chi dung mot ADC thoi voi hai dau vao nay.
Và đây là chương trình test thử của em:
WORD wADCData1;
WORD wADCData2;
float Data;
void main()
{
WORD tram,chuc,donvi,temp;
LCD_1_Start();
AMUX4_1_Start();
PGA_1_SetGain(PGA_1_G1_00);
PGA_1_Start(PGA_1_HIGHPOWER);
ADCINCVR_1_Start(ADCINCVR_1_HIGHPOWER);
ADCINCVR_1_GetSamples(0);
LCD_1_Position(0,0);
LCD_1_PrCString("Ready!");
Timer16_1_WritePeriod(9999);
Timer16_1_EnableInt();
M8C_EnableGInt;
Timer16_1_Start();
while(1)
{
LCD_1_Position(0,0);
LCD_1_PrHexInt(wADCData1);
LCD_1_Position(1,0);
LCD_1_PrHexInt(wADCData2);
}
}
void Timer16_1_ISR(void)
{
// lay du lieu tu dau vao thu nhat
AMUX4_1_InputSelect(AMUX4_1_PORT0_1);
ADCINCVR_1_ClearFlag();
//wait for Valid Data
while(0 == ADCINCVR_1_fIsDataAvailable);
wADCData1 = ADCINCVR_1_iGetData();
// lay du lieu tu dau vao thu hai
AMUX4_1_InputSelect(AMUX4_1_PORT0_7);
ADCINCVR_1_ClearFlag();
//wait for Valid Data
while(0 == ADCINCVR_1_fIsDataAvailable);
wADCData2 = ADCINCVR_1_iGetData();
}
Sau khi biên dịch , nạp và chạy thì em thấy kết quả của hai kênh là hoàn toàn giống nhau. Và chính là giá trị của P0.7.
Nếu em chỉ thử từng phần, tức là mỗi chương trình em viết chỉ sử dụng cho một chân thì chạy rất ổn.
Em nghĩ là do MUX, ko biết có đúng không.
Nhưng theo em hiểu thì trong hàm ngắt Timer nó sẽ hoạt động như sau:
- Ban đầu MUX chọn P0.1
- ADC chuyển đổi và lưu vào wADCData1
- Sau đó MUX lại chọn P0.7
- và ADC lại chuyển đổi lưu vào wADCData2
Hai kết quả này được hiển thị ra LCD. Nhưng nếu đúng như vậy thì nó phải khác nhau chứ.
Bác nào biết xin chỉ giúp.
Hoặc nếu đã làm project về phần này rồi thì cho em xin luôn.
Cả ngày hôm nay em làm về phần này mà mãi không xong, ức chế quá, không cả ngủ được.
Cảm ơn các bác rất nhiều.
Comment