PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp USB, CAN, I2C, SPI, USART... (http://www.picvietnam.com/forum/forumdisplay.php?f=45)
-   -   gặp vấn đề khi dùng cả i2c và rs232 (http://www.picvietnam.com/forum/showthread.php?t=9391)

bean984 18-05-2011 04:42 PM

gặp vấn đề khi dùng cả i2c và rs232
 
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

Code:

#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)


Múi giờ GMT. Hiện tại là 11:25 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam