• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts




關於I2C的程式
新會員
新會員


以下是I2C的程式範例
====================================
#include <p18f452.h>
#include <delays.h>

#define Write 0x00
#define Read 0x01
#define Device1 0x20

void F_Initial(void);
void F_I2C_START(void);
unsigned char F_I2C_WAIT(void);
unsigned char F_I2C_Send_Address(unsigned char,unsigned char);
void F_I2C_Send_Data(unsigned char);
void F_I2C_STOP(void);
unsigned char F_I2C_Read_Data(void);

void main(void)
{
unsigned char command=Write,UC_I2C_Data=0;
F_Initial();
while(1)
{
switch (command)
{
case Write:
F_I2C_START();
if (F_I2C_Send_Address(Device1,command))
F_I2C_Send_Data(UC_I2C_Data++);
F_I2C_STOP();
Delay10KTCYx(20);
command=Read;
break;
case Read:
F_I2C_START();
if (F_I2C_Send_Address(Device1,command))
LATD = F_I2C_Read_Data();
F_I2C_STOP();
Delay10KTCYx(20);
command=Write;
break;
default:
break;
}
}
}

void F_Initial(void)
{
TRISD = 0;
LATD = 0;
TRISCbits.TRISC3 = 0;
TRISCbits.TRISC4 = 0;
SSPSTATbits.SMP = 1;
SSPSTATbits.CKE = 0;
SSPCON1 = 0x38;
SSPADD = 0x30;
}

void F_I2C_START(void)
{
SSPCON2bits.SEN = 1;
while(!F_I2C_WAIT());
}

unsigned char F_I2C_WAIT(void)
{
if ( PIR1bits.SSPIF )
{
PIR1bits.SSPIF = 0;
return (1);
}
else
return (0);
}

unsigned char F_I2C_Send_Address(unsigned char UC_Address,unsigned char UC_RW)
{
SSPBUF = ((UC_Address & 0xFE) | UC_RW);
while(!F_I2C_WAIT());
if ( SSPCON2bits.ACKSTAT )
return (0);
else
return (1);
}

void F_I2C_Send_Data(unsigned char UC_Data)
{
SSPBUF = UC_Data;
while(!F_I2C_WAIT());
}

void F_I2C_STOP(void)
{
SSPCON2bits.PEN = 1;
while(!F_I2C_WAIT());
}

unsigned char F_I2C_Read_Data(void)
{
unsigned char UC_Temp=0;
SSPCON2bits.RCEN = 1;
while(!F_I2C_WAIT());
UC_Temp = SSPBUF;
SSPCON2bits.ACKDT = 1;
SSPCON2bits.ACKEN = 1;
while(!F_I2C_WAIT());
return ( UC_Temp );
}
====================================
各位大大~
以上程式是課本的範例,小弟在跑的時候出現了以下錯誤
ICD0161: Verify failed (MemType = Program, Address = 0x0, Expected Val = 0xEF2A, Val Read = 0x0)
ICD0275: Programming failed.

我嘗試改一些宣告,雖然compiler過了還是出現上述的錯誤
請問~究竟是那裡出錯呢?
敬請賜教!!感激不盡~~~

註:在下小弟我使用MPLAB IDE V7.10與ICD2與APP001






發表於: 2005/8/10 21:51
頂部


Re: 請問各位高手
新會員
新會員


請問我要如何得知我是跑40MHZ的
還有就是一定要買實驗版才能用嗎
不好意思我是第一次接觸
謝謝

發表於: 2005/8/10 20:35
頂部


Re: Question of Interface
版主
版主


EUSART 多了 Auto Baud Rate detection & Break Signal 主要使給 LIN Bus 通訊上用,除此之外功能與AUSART一樣當然可以跟RS-232通訊。

發表於: 2005/8/10 18:07
頂部


Re: 請問各位高手
版主
版主


可能你會看不懂我同事寫的,在此作說明:

確定你的 PIC18FXXX 是跑 40MHz, 則 Duty Cycle 最小解析脈衝精度為 1/40MHz = 25nS.

在 PIC 的設計裡,Period 最小計數單位為(進到 Timer2) Fosc/4, 也就是說 40MHz/4= 100nS. 所以你的 Period 就不可有有14.25uS (需以100nS 為基底) ,期值可以為 14.3uS 或 14.2uS.

所以解析度就算出來了,在 14.3uS (period) 下解析度為:
14.3uS / 25nS = 572


發表於: 2005/8/10 17:59
頂部


Re: 18F452 + ICE2000 + C18 之問題請教.
版主
版主


第一個問題很奇怪,檢查一下 Stand-Alone 模式下的 configuration words 的設定是否正確,ICE2000 的 clock 是誰供應的? 你可以再用 ICD2 來測試一下看看是否能正常跑。

第二問題要用寫的似乎有點長了,你可以打電話來討論 0800-717-718 , 基本的重點如下:

1. 將LKR檔內的 c018i.o 先移除後回存一新的LKR 檔,以後bootloader 就需使用此 LKR 檔。
2. 到 C:\mcc18\src\traditional\startup 的目錄下將 c018i.c 考到 Project 目錄下並加到 Project 裡。
3. 修改reset 起始位置到 0x200 的地方,如下所示
#pragma code _entry_scn=0x000200
void
_entry 
(void)
{
_asm goto _startup _endasm

}


4. 最後還要做RESET & INTERRUPT 向量位址的轉移,將0x008 加入 GOTO 0x208 , 0x018 --> 0x218

發表於: 2005/8/10 17:45
頂部


Re: 18F452 + ICE2000 + C18 之問題請教.
新會員
新會員


Dear DoubleChen,
感謝您提供的方法,我試過了,問題都還是一樣耶....

發表於: 2005/8/10 16:50
頂部


Re: 18F452 + ICE2000 + C18 之問題請教.
新會員
新會員


從你的描述,我提供兩種可能性,讓你debug看看,
1.是否TXSTAbits.TXEN有設定為1
2.在TXREG = COMPortTXDataBuffer[x];後面多加一個判斷
while(!(TXSTAbits.TRMT));
當TSR是Empty時,才能確定你的資料已經傳送出去了。

發表於: 2005/8/10 16:33
頂部


18F452 + ICE2000 + C18 之問題請教.
新會員
新會員


請教各位大大:
不好意思,小弟是C-18新手,有幾個問題要請教,
1.為什麼我使用ICE-2000及C-18寫了一段18F452的RS-232通訊程式, 在ICE-2000底下收發字串都正常,但是燒錄到I.C去時,卻發生F452只能收到指令,但是無法回傳資料的問題..我試過了個方法,包括使用C-18函式庫上的幾個USART指令(如putsUSART...)及用TXREG的方法 來傳出資料,但情形都是一樣,程式碼節錄如下,在ICE-2000都可以,但是一燒錄到晶片去後,就不能了,但是如果完全使用組合語言寫, 在ICE-2000下可以,燒錄到晶片也是可以的.不知道C-18有什麼不一樣嗎?? 請問各位大大,有沒有人知道Why??

2.另外如果我的C程式要使用BootLoad模式時,程式起始位址要如何定義在0x200的地方?,要使用何種指令來定義??

請賜教,謝謝!!!!

//------------------------------------------------
char COMPortTXDataBuffer[50];

void COMPortTxBufferData()
{
char x = 0;
while ( COMPortTXDataBuffer[x] != 0)
{
while (PIR1bits.TXIF == 0)
{
Nop();
Nop();
}
// TXREG = COMPortTXDataBuffer[x];
WriteUSART( COMPortTXDataBuffer[x]);
//<---- 以上兩種方法,結果都一樣..
x ++ ;
}
}


發表於: 2005/8/10 15:24
頂部


Re: 請問各位高手
版主
版主


如果您讓換算出來PIC18的MIPS數為4的話,就做得出來。因為PIC16或PIC18的PWM,都是基於一個TMR2所做出來的。而TMR2的最小時間單位就是SYSTEM CLOCK。

所以,如果在4MIPS的情況下,TMR2加一所花的時間為.25uS,自然就做得出來週期正好為14.25uS的PWM了。

建議到右方「教材及講義」中,找W201的教材,其中有講到PWM的基本動作方式。雖然W201是針對PIC16F877所做出來的,但是,在PWM這一部份,PIC16和PIC18沒什麼差別。

發表於: 2005/8/10 14:13
頂部


Re: 燒錄時間太長
新會員
新會員


感謝上面那位先進
測試後真的有差,設定欲燒錄的長度即可.

不過在燒錄16F877A時,就好像可以自動控制P.M的長度
不用刻意去設定,P.M的 range.

不知道我的狀況是否正常?

發表於: 2005/8/10 13:33
頂部



« 1 ... 6976 6977 6978 (6979) 6980 6981 6982 ... 7522 »



:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------