|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
有誰用過AD7896? 12位串行AD轉(zhuǎn)換IC。 |
| 作者:xzhenggen 欄目:單片機 |
我按照時序電路寫了一個子程序測試為什么測不準?請各位大俠出來指點一下. #include "reg51.h" #include "absacc.h" #include "math.h" #include "intrins.h" #define uCHAR unsigned CHAR #define uint unsigned int sbit SCLK=P1^1; sbit WDI=P1^2; sbit SDATA=P1^0; void delay(uCHAR n) { uCHAR i; for(i=0;i<n;i++) { _nop_(); } } uint read7896(void) { CHAR i; uint result; uCHAR hbyte, lbyte; WDI=0; delay(3); SCLK=0; WDI=1; delay(3); WDI=0; for(i=0;i<15;i++) { _nop_(); } SCLK=1; SCLK=0; hbyte=0; for(i=0;i<4;i++) { SDATA=1; SCLK=1; if(SDATA) hbyte=0x01; SCLK=0; if(i!=3) hbyte<<=1; } lbyte=0; for(i=0;i<8;i++) { SDATA=1; SCLK=1; if(SDATA) lbyte=0x01; SCLK=0; if(i!=7) lbyte<<=1; } _nop_(); _nop_(); WDI=1; result=0; result=hbyte; result<<=8; result|=lbyte; return (result); } void main(void) { uint ad; while(1){ ad=read7896(); } } 我總覺得我這個子程序有問題,但就是不知錯在哪里?有哪位高手出來指點一下,在此多謝了。。 |
| 2樓: | >>參與討論 |
| 作者: shiyang800 于 2007/1/16 12:49:00 發(fā)布:
串行 AD 不需要初始化?! |
|
| 3樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 12:57:00 發(fā)布:
串行 AD (AD7896) 的DATASHEET里面沒有說怎樣初始化 |
|
| 4樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 13:59:00 發(fā)布:
重新修改,還是有問題,不知為何? #include "reg51.h" #include "absacc.h" #include "math.h" #include "intrins.h" #define uCHAR unsigned CHAR #define uint unsigned int #define N 128 sbit SCLK=P1^1; sbit WDI=P1^2; sbit SDATA=P1^0; uint xdata Array[N]; void delay(uCHAR n) { uCHAR i; for(i=0;i<n;i++) { _nop_(); } } uint read7896(void) { CHAR i; uint result; uCHAR hbyte, lbyte; WDI=0; delay(1); SCLK=0; WDI=1; delay(1); WDI=0; for(i=0;i<15;i++) { _nop_(); } //SCLK=1; //SCLK=0; //while(AD_BUSY); hbyte=0; for(i=0;i<8;i++) { SDATA=1; SCLK=1; if(SDATA) hbyte=0x01; SCLK=0; if(i!=7) hbyte<<=1; } lbyte=0; for(i=0;i<8;i++) { SDATA=1; SCLK=1; if(SDATA) lbyte=0x01; SCLK=0; if(i!=7) lbyte<<=1; } //_nop_(); //_nop_(); //WDI=1; result=0; result=hbyte; result<<=8; result|=lbyte; return (result); } void main(void) { uint ad; while(1){ ad=read7896(); } } ../uploadfile/200705141411293513.jpg |
|
| 5樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 14:23:00 發(fā)布:
請圈圈高手出來指點一下。 |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2007/1/16 15:30:00 發(fā)布:
沒用過這個芯片,不過你這個讀數(shù)據(jù)的程序好象不大對頭... hbyte=0; for(i=0;i<8;i++) { SDATA=1; SCLK=1; if(SDATA) hbyte=0x01; SCLK=0; if(i!=7) hbyte<<=1; } lbyte=0; for(i=0;i<8;i++) { SDATA=1; SCLK=1; if(SDATA) lbyte=0x01; SCLK=0; if(i!=7) lbyte<<=1; } 改成這樣試試: SDATA=1; for(i=0;i<8;i++) { hbyte<<=1; SCLK=1; if(SDATA) hbyte++; SCLK=0; } for(i=0;i<8;i++) { lbyte<<=1; SCLK=1; if(SDATA) lbyte++; SCLK=0; } |
|
| 7樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 16:36:00 發(fā)布:
串行讀數(shù)據(jù)不是首先置時鐘信號為高電平嗎? 對于上升沿驅(qū)動的芯片,串行讀數(shù)據(jù)不是首先置時鐘信號為高電平嗎? 從數(shù)據(jù)輸出口讀取數(shù)據(jù)時,不是應先將時鐘信號從低電平跳變到高電平,以使1位數(shù)據(jù)輸出到其輸出引腳,從讀取該數(shù)據(jù)。 讀串行數(shù)據(jù)時不是先置時鐘信號為高電平的嗎? 然后再讀一位串行數(shù)據(jù);再置時鐘信號為低電平,以使下一位數(shù)據(jù)發(fā)生變化。 |
|
| 8樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 16:47:00 發(fā)布:
我到底該用這個DATASHEET的那個時序讀數(shù)?
|
|
| 9樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 16:51:00 發(fā)布:
第二個
|
|
| 10樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 16:52:00 發(fā)布:
第三個
|
|
| 11樓: | >>參與討論 |
| 作者: computer00 于 2007/1/16 17:04:00 發(fā)布:
前面兩個圖,要看你所選擇的模式了 有高速采樣模式和自動睡眠模式. 而讀數(shù)據(jù),則都是按照下面的圖來讀. 從這個圖來看,數(shù)據(jù)是在前一個時鐘的下降沿發(fā)出的,經(jīng)過T4時間后,數(shù)據(jù)穩(wěn)定,這以后可以去讀數(shù)據(jù). 而在下一個時鐘的下降沿到來后,經(jīng)過T5時間后,數(shù)據(jù)消失. 按照我上面寫的讀數(shù)據(jù)程序,還需要將hbyte的最高位清0,因為從這個圖來看,讀最高位時,數(shù)據(jù)還是不確定的。 |
|
| 12樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 17:08:00 發(fā)布:
讀串行數(shù)據(jù)時不是先置時鐘信號為高電平的嗎? |
|
| 13樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/16 17:10:00 發(fā)布:
我那我上面的子程序該如何修改?! 請圈圈再幫我看一看,多謝! |
|
| 14樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/17 9:24:00 發(fā)布:
按圈圈的方式,修改如下,不知是不是這樣做?? #include "reg51.h" #include "absacc.h" #include "math.h" #include "intrins.h" #define uCHAR unsigned CHAR #define uint unsigned int sbit SCLK=P1^1; sbit WDI=P1^2; sbit SDATA=P1^0; //AD_BUSY 沒有用上。 void delay(uCHAR n) { uCHAR i; for(i=0;i<n;i++) { _nop_(); } } uint read7896(void) { CHAR i; int j; uint result; //uCHAR hbyte, lbyte; result<<=4;/*精確12位,所以左移6位*/ WDI=1; delay(3); SCLK=0; WDI=0; delay(3); WDI=1; for(i=0;i<15;i++) { _nop_(); } SDATA=1; for(j=0;j<16;j++) { result<<=1; SCLK=1; _nop_(); if(SDATA)result++; SCLK=0; } return (result); } void main(void) { uint ad; while(1){ ad=read7896(); } } |
|
| 15樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/17 10:40:00 發(fā)布:
暈死我了,圈圈說的,我怎么就弄不了的呢?! 有哪一位高手出來 指點一下。該如何修改子程序。。!。。。 數(shù)據(jù)是在前一個時鐘的下降沿發(fā)出的,經(jīng)過T4時間后,數(shù)據(jù)穩(wěn)定,這以后可以去讀數(shù)據(jù). 而在下一個時鐘的下降沿到來后,經(jīng)過T5時間后,數(shù)據(jù)消失. |
|
| 16樓: | >>參與討論 |
| 作者: computer00 于 2007/1/17 12:10:00 發(fā)布:
試試這樣行不. 或者去網(wǎng)上搜索一下,看有沒有現(xiàn)成的例子 uint read7896(void) { CHAR i; int j; uint result; //uCHAR hbyte, lbyte; // result<<=4;/*精確12位,所以左移6位*/ SCLK=0; WDI=1; delay(30); WDI=0; delay(30); SDATA=1; for(j=0;j<16;j++) { result<<=1; SCLK=1; _nop_(); if(SDATA)result++; SCLK=0; } return (result&0x0FFF); } |
|
| 17樓: | >>參與討論 |
| 作者: xzhenggen 于 2007/1/17 12:44:00 發(fā)布:
多謝圈圈幫忙!我試一下。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |