|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
位變量批量保存?? |
| 作者:SZ338 欄目:單片機(jī) |
以下是一小段通過(guò)中斷進(jìn)行一位一位數(shù)據(jù)接收,請(qǐng)教各位DX如何將這些接收到的數(shù)據(jù)(位變量)保存到字節(jié)變量I2CByte??謝謝! void ext_int1_isr(void) interrupt 2 { RdBit = SDA; SWITCH (BitCounter) { case 8: I2CBit7 = RdBit; break; case 7: I2CBit6 = RdBit; break; case 6: I2CBit5 = RdBit; break; case 5: I2CBit4 = RdBit; break; case 4: I2CBit3 = RdBit; break; case 3: I2CBit2 = RdBit; break; case 2: I2CBit1 = RdBit; break; case 1: I2CBit0 = RdBit; break; case 0: I2CAck = RdBit; I2CState = I2C_STATE_ACK; BitCounter = 9; ByteEnd = TRUE; } BitCounter--; if (ByteEnd==1) if (I2CAck==0) { ByteEnd = FALSE; I2CByte = I2CRead(); } unsigned CHAR I2CRead(void) { ????? ;;;如何編寫,使得程序能簡(jiǎn)潔而有效率!! } |
| 2樓: | >>參與討論 |
| 作者: su_mj000 于 2004/3/5 7:04:00 發(fā)布:
程序可以簡(jiǎn)化一點(diǎn) unsigned CHAR I2CByte; void ext_int1_isr(void) interrupt 2 { BitCounter--; if ( BitCounter != 0 ) { I2CByte <<= 1; if ( SDA ) I2C++; } else { I2CAck = SDA; _關(guān)閉中斷_; } } CHAR I2CRead (unsigned CHAR *cp) { if ( ByteCounter == 0 ) { *cp = I2CByte; ByteCounter = 9; _開(kāi)通中斷_; return (I2CAck != 0)? -1: 1; } return 0; } |
|
| 3樓: | >>參與討論 |
| 作者: su_mj000 于 2004/3/5 7:12:00 發(fā)布:
打錯(cuò)了一個(gè)變量名... 打錯(cuò)了一個(gè)變量名,應(yīng)該是 I2CByte <<= 1; if ( SDA ) I2CByte++; |
|
| 4樓: | >>參與討論 |
| 作者: SZ338 于 2004/3/5 10:21:00 發(fā)布:
程序可以簡(jiǎn)化一點(diǎn)! 多謝su_mj000的回復(fù)! 我的用意是監(jiān)測(cè)I2C的SDA和SCK數(shù)據(jù)線,通過(guò)串口(超級(jí)終斷)在電腦端將其顯示。通過(guò)中斷(SCK信號(hào)為高時(shí)產(chǎn)生中斷,接收一位數(shù)據(jù)。)累積接收9Bit后,然后在I2CRead()函數(shù)進(jìn)行位變量保存(保存為I2CByte字節(jié)),以使得在主函數(shù)里面可以訪問(wèn)。并將其(I2CByte)通過(guò)串口發(fā)送出去!I2CRead()函數(shù)并非進(jìn)行讀I2C數(shù)據(jù),而是將位變量保存為一個(gè)字節(jié)而已(I2CByte)。不過(guò)看你簡(jiǎn)化后的程序, *cp = I2CByte,是什么用意?只怪本人新手入行,麻煩能解釋一下! 另:I2CRead ()函數(shù)中ByteCounter變量的操作是否有問(wèn)題?? |
|
| 5樓: | >>參與討論 |
| 作者: SZ338 于 2004/3/5 10:27:00 發(fā)布:
程序可以簡(jiǎn)化一點(diǎn)! unsigned CHAR I2CByte; void ext_int1_isr(void) interrupt 2 { I2CByte = SDA; //////////讀數(shù)據(jù)??? BitCounter--; if ( BitCounter != 0 ) { I2CByte <<= 1; if ( SDA ) I2C++; } else { I2CAck = SDA; _關(guān)閉中斷_; } } CHAR I2CRead (unsigned CHAR *cp) { if ( ByteCounter == 0 ) { *cp = I2CByte; ByteCounter = 9; _開(kāi)通中斷_; return (I2CAck != 0)? -1: 1; } return 0; } |
|
| 6樓: | >>參與討論 |
| 作者: su_mj000 于 2004/3/6 1:26:00 發(fā)布:
回函倉(cāng)促 對(duì)不起,回函倉(cāng)促,沒(méi)有加解釋。 看得出,你是用51單片機(jī)監(jiān)控I2C總線.但我估計(jì)做起來(lái)難度 很大.一是I2C速度較高(標(biāo)準(zhǔn)100Kbit/S,加強(qiáng)型400Kbit/S); 也就是每10微秒或更短時(shí)間內(nèi)就要處理一次中斷.一般51單片 機(jī)難以勝任;二是你還得識(shí)別起始(START)和終止(STOP)信號(hào). 另外,我假設(shè)你的代碼中的SDA是一I/O引腳信號(hào),只需判別其 '1'或'0'即可. 而 I2CByte = SDA; //////////讀數(shù)據(jù)??? 反而費(fèi)時(shí)且不合理. (unsigned CHAR *cp)定義cp為一字符指針,所以 *cp = I2CByte 即將I2CByte存入改指針?biāo)付ǖ貎?nèi)存單元.當(dāng)然,這一步驟可 改用其他方法實(shí)現(xiàn). |
|
| 7樓: | >>參與討論 |
| 作者: shencai555 于 2004/3/6 13:19:00 發(fā)布:
照你的編程思想,可以用聯(lián)合 |
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |