• slider image 514
  • slider image 516
  • slider image 517
  • slider image 518
  • slider image 519
:::


Browsing this Thread:   1 Anonymous Users






訪客
Re: [求助]關於PIC的i2c傳輸問題!
#6
已將程式改寫如下

#include <p18f8720.h>
#include <Delays.h>
#include <timers.h>
#include <i2c.h>
#include"LCD_CONTROL.h"
#define TC74_addr 0x9A
#define scl PORTCbits.RC3
#define sda PORTCbits.RC4
unsigned char temperature;

void write_u5_led(unsigned char); //led輸出程式
void nop(unsigned char); //由參數控制delay幾個TCY
void start_i2c(void); //i2c起始程式
void stop_i2c(void); //i2c結束程式
void Tx_byte(unsigned char); //transmit one single byte to slave
unsigned char Rx_byte(void);
void write_data(void);
unsigned char read_data(void);
unsigned char Get_ack(void);
void Send_ack(void);
void send(unsigned char);

void main()
{
lmg_lmc_io_set();
open_lmc_set();
TRISC=0X00;
while(1)
{
lmc_write_ir(0x01);
write_data();
read_data();
write_u5_led(~temperature);//結果輸出到LED
Delay100TCYx(250);
}
}

void write_u5_led(unsigned char data)
{ TRISD=0x00;
TRISE=0x00;
PORTEbits.RE3=1; //U5致能
Delay10TCYx(20);
PORTD=data; //將data輸出到第一組LED
PORTEbits.RE3=0; //U5除能
Delay10TCYx(20);
}

void nop(unsigned char time)
{
unsigned char i;
for(i=0 ; i<time ; i++)
{
Delay1TCY();
}
}

void send(unsigned char DI)
{
scl=0;nop(5);
sda=DI;
scl=1; nop(5);
}

void start_i2c(void)
{
scl=1;
sda=1;
nop(5);
sda=0;
nop(5);
scl=0;
lmc_write_data('a');
}

void stop_i2c(void)
{
scl=1;
sda=0;
nop(5);
sda=1;
nop(6);
sda=0;
lmc_write_data('b');
}

void Tx_byte(unsigned char tx_data)
{
unsigned char i , temp;
for(i=0 ; i<8 ; i++)
{
temp=((tx_data<<i) & 0x80);
if(temp==0x80)
{ send(1);}
else
{ send(0);}
}
}

unsigned char Rx_byte(void)
{
unsigned char read , i;
for(i=0 ; i<8 ; i++)
{
scl=0;
nop(1);
TRISCbits.TRISC4=1;
if(sda==1)
{read=read<<i+1;}
else
{read=read<<i+0;}
scl=1;
TRISCbits.TRISC4=0;
nop(1);
}
return read;
}

unsigned char Get_ack(void)
{
unsigned char ack;
scl=1;
nop(2);
TRISCbits.TRISC4=1;
ack=sda;
TRISCbits.TRISC4=0;
scl=0;
return ack;
}

void Send_ack(void)
{
send(0);
nop(1);
sda=1;
}

void write_data(void)
{
start_i2c();
Tx_byte(TC74_addr);
while(!Get_ack())
{Delay10KTCYx(2);}
Tx_byte(0x01);
while(!Get_ack())
{Delay10KTCYx(2);}
Tx_byte(0x80);
while(!Get_ack())
{Delay10KTCYx(2);}
stop_i2c();
lmc_write_data('Q');
}

unsigned char read_data(void)
{
unsigned char i;
start_i2c();
Tx_byte(TC74_addr);
while(!Get_ack())
{Delay10KTCYx(2);}
Tx_byte(0x00);
while(!Get_ack())
{Delay10KTCYx(2);}
stop_i2c();
start_i2c();
Tx_byte(TC74_addr+1);
while(!Get_ack())
{Delay10KTCYx(2);}
temperature=Rx_byte();
Send_ack();
stop_i2c();
lmc_write_data('E');
}


LCD只是用來看程式跑到哪邊而已 , 重點還是放在TC74上面 , 可是TC74回傳的數值都偏大(超過90) , 請問這是為什麼呢 ?
P.S LED為low動作 , 所以將數值反向輸出 .

Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: [求助]關於PIC的i2c傳輸問題!
#5
版主
版主


查看用戶資訊
TC74 是 I2C 的溫度感測器,已經有寫好的範例程式,你可以參考教育訓練裡的WAP002 workshop 的教材,那裡就有讀取 TC74 的I2C 範例。

發表於: 2007/1/3 22:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: [求助]關於PIC的i2c傳輸問題!
#4
資深會員
資深會員


查看用戶資訊
ack 寫錯了

clock high 之後 slave 會將 data 拉low ,而不是 clock high 再 拉 low ,才去看 data, 這時候 slave 早就放掉 data 了,

ack 怎麼檢都不會有 low

發表於: 2007/1/3 17:02
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


訪客
Re: [求助]關於PIC的i2c傳輸問題!
#3
小弟不才,已經將TC74接在硬體接口上了(RC3,RC4),但是因為不會設定SSPCON1等等的腳位,所以才自行寫了一些通訊副程式,如果有大大可以教我設定腳位的話,還請不吝賜教!謝謝!

Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: [求助]關於PIC的i2c傳輸問題!
#2
中級會員
中級會員


查看用戶資訊
未詳細分析你的軟體io iic代碼
不過據我所知,pic18f8720是帶有硬體iic接口的
為何不直接使用硬體接口呢

發表於: 2007/1/2 19:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


訪客
[求助]關於PIC的i2c傳輸問題!
#1
我使用PIC18F8720與溫度感測IC TC74作i2c傳輸,但是一直傳輸失敗,請教各位大大,我的程式出了啥麼問題?

#include <p18f8720.h>
#include <Delays.h>
#include <timers.h>
#include <i2c.h>
#define TC74_addr 0x9A
#define scl PORTCbits.RC3
#define sda PORTCbits.RC4

void write_u5_led(unsigned char);    //led輸出程式
void nop(unsigned char);            //delay一個TCY副程式
void start_i2c(void);                //i2c起始程式
void stop_i2c(void);                //i2c結束程式
unsigned char ack(void);            //ack接收確認
void noack(void);                    //noack
void send_byte(unsigned char);        //發送八位資料
unsigned char rcv_byte(void);        //接收八位資料

void main()
{
    
TRISC=0x00;
    while(
1)
    {
        
unsigned char data;
        
start_i2c();
        do
        {
            
send_byte(TC74_addr);
        }while(
ack());
    
        do
        {
            
send_byte(0x01);
        }while(
ack());
    
        do
        {
            
send_byte(0x00);
        }while(
ack());
    
        do
        {
            
send_byte(TC74_addr+1);
        }while(
ack());
        
        
data=rcv_byte();                //data取出溫度值
        
noack();
        
stop_i2c();
        
write_u5_led(data);                //結果輸出到led上
    
}
}

void write_u5_led(unsigned char data)
{    
TRISD=0x00;
    
TRISE=0x00;
    
PORTEbits.RE3=1;                    //U5致能
    
Delay10TCYx(20);
    
PORTD=data;                            //將data輸出到第一組LED
    
PORTEbits.RE3=0;                    //U5除能
    
Delay10TCYx(20);
}

void nop(unsigned char time)
{
    
unsigned char i;
    for(
i=i<time i++)
        {
            
Delay1TCY();
        }
}

void start_i2c(void)
{
    
scl=1;
    
sda=1;
    
nop(10);
    
sda=0;
    
nop(10);
    
scl=0;
}

void stop_i2c(void)
{
    
scl=1;
    
sda=0;
    
nop(10);
    
sda=1;
    
nop(12);
    
sda=0;
}

unsigned char ack(void)
{
    
unsigned char ack;
    
scl=1;
    
nop(10);
    
scl=0;
    
TRISCbits.TRISC4=1;
    
ack=sda;
    
TRISCbits.TRISC4=0;
    
nop(19);
    return 
ack;
}

void send_byte(unsigned char c)
{
    
unsigned char i;
    for(
i=i<i++)
    {
        if((
c<<i)&0x80)
            
sda=1;
        else
            
sda=0;
        
scl=1;
        
scl=0;
    }
}

unsigned char rcv_byte(void)
{
    
unsigned char i,data;
    for(
i=i<i++)
    {    
        
scl=1;
        
data<<=1;
        if(
sda==1)
            
data+=1;
        
scl=0;
    }
    return 
data;
}

void noack(void)
{
    
nop(7);
    
sda=1;
    
nop(10);
    
scl=1;
    
nop(10);
    
scl=0;
    
nop(13);
}

Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

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... ]

教育訓練中心

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