PDA

View Full Version : gặp vấn đề khi dùng cả i2c và rs232


bean984
18-05-2011, 04:42 PM
mong các bạn giúp đỡ.
mình viết chương trình giao tiếp rs232 giữa 16f877a với pc và giao tiếp i2c giữa 2 pic 16f877a.
chương trình của mình như sau: pc gửi 1 giá trị xuống pic sau đó pic lấy giá trị đó cộng thêm 1 rùi gửi lại cho pc qua rs232. tuy nhiên vấn đề mình gặp fai là khi mình chỉ giao tiếp giữa pc và 16f877a thì ok, nhưng khi thêm khai báo #use i2c vào thì giao tiếp pic - pc lại không hoạt động nữa.
đây là code của mình


#include "16F877a.h" // PIC18F4550 header file
#device 16F877a*=16 ADC=10
#include <defs_16F877a.h>
//#include <stdlib.h>
//#include <string.h>
#fuses HS, NOWDT,PUT, NOPROTECT, NOLVP // for debug mode
#use delay(clock=8000000) // for 4Mhz crystal
//#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, stream=PC)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, FORCE_HW)

#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#use fast_io(d)
#use fast_io(e)


int1 Flag_DKDN,flag_adc,flag_recei1;
int1 DTDC0; // Da tinh diem cat
int8 k1;
char kt;

///////////////////////////////////////////////////////////////////
#INT_RDA
void RECEIVER()
{

kt=fgetc(PC);
flag_recei1=1;

}

void write_i2c(int8 address,int8 data)
{
i2c_start();
i2c_write(address);
i2c_write(data);
i2c_stop();
}

int8 read_i2c(int8 slave_addr)
{
int8 value_re;
i2c_start();
i2c_write(slave_addr + 1);
value_re = i2c_read(0);
i2c_stop();
return value_re;
}

//////////////////////////////////////////////////////////
void main(void)
{
set_tris_d(0);
enable_interrupts(global);
enable_interrupts(int_RDA);


flag_recei1=0;

while(true)
{
if (flag_recei1==1)
{
//kt=kt+1;
//lcd_display_char(0, 1, kt);
kt=kt+1;
//lcd_display_int16(0, 5, kt, 0, 0 );
printf("%c",kt);
flag_recei1=0;
}
}
}

mong các bạn giúp đỡ

tanbka
20-05-2011, 10:32 AM
Mình cũng đọc DS1307 rồi gửi dữ liệu qua đường truyền 485, chạy bình thường.
Trên bài bạn còn chưa dùng đến I2C mà, mình nghĩ phần khai báo thôi. Mình khai báo thế này, bạn thử xem:
#use i2c(master, slow, sda=DS1307_SDA, scl=DS1307_SCL)
#use rs232(baud=9600, xmit=RS485_TX_PIN, rcv=RS485_RX_PIN, enable=RS485_ENABLE_PIN, bits=8, errors, stream=RS485)