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)
-   -   Giao tiếp I2C (http://www.picvietnam.com/forum/showthread.php?t=611)

chungcb86 13-10-2010 10:59 AM

ok mach đã chạy. nguyên nhân : đứt mạch nên 1 chân không được nối với trở thanh

liemcena 25-10-2010 10:02 AM

Giúp em i2c
 
1 Attachment(s)
giúp em i2c với em mới học về pic và i2c : dipswitch truyền dữ liệu cho master , master truyền cho slave ,slave hiển thị lên led(giống việc điều khiển đèn bằng dipswitch qua chuẩn i2c)
code Master:
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use Delay(Clock=4000000)
#byte portb=0x06
#define SLAVE_ADDRESS 0x10
#use i2c(master, sda=PIN_C4, scl=PIN_C3)
#use Fast_IO(b)
void write_I2C(int8 data)
{
i2c_start();
i2c_write(SLAVE_ADDRESS);
i2c_write(data);
i2c_stop();
}
void main()
{
int8 data;
set_tris_b(255);
data=input_b();
while(1)
{
write_I2C(data);
delay_ms(100);
}
}
code slave:

#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(Clock=4000000)
#use i2c(SLAVE,SDA=PIN_C4,SCL=PIN_C3)
#define SLAVE_ADDRESS 0x10
#use Fast_IO(b)

void read_I2C()
{
int8 data;
i2c_start();
i2c_read(SLAVE_ADDRESS);
data=i2c_read();
delay_ms(100);
i2c_stop();
}


void main()
{
int8 data;
set_tris_b(0x00);

while(1)
{
read_I2C();
output_b(data);
}
}
không biết sai ở đâu nữa mô phỏng bằng proteus không chạy gì cả

dark_dragon6789 19-11-2010 09:47 PM

em dùng code của bác Hoan cho vô protues thì không thấy chạy gì cả, không hiểu sai chỗ nào luôn

winphys03 09-12-2010 04:03 PM

I2C đọc từ slave về master
 
Các bác giúp gửi giá trị của thang ghi POSCNTH, POSCNTL từ slave lên master với

Code Master:

#include <18f4431.h>
#include <stdlib.h>
#include <math.h>
#include <def_4431.c>
#FUSES NOWDT, HS, NOPUT, NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#use I2C(MASTER,SDA=PIN_D2,SCL=PIN_D3)
#define slave 0x10
///////////////////////////////////////////////////////////////
///////////////////////Khai bao bien PID//////////////////////
int16 read;
int8 v=0,high,low;
int16 PWM;
int16 feedback_value = 0,real_v;
/////////////////////////////////////////////////////////////
/////////////////////////Nhan du lieu tu may tinh////////////
#INT_RDA
void getvalue()
{
int i;
char s[3];
for(i=0;i<3;i++)
s[i]=getc();
v=atol(s);
}
////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
int16 read_I2C_2byte(int8 slave_address)
{
int16 value_read;
i2c_start();
i2c_write(slave_address+1);
high=i2c_read(1);
delay_us(10);
low=i2c_read(0);
i2c_stop();
value_read=make16(high,low);
value_read=value_read/5.2;
printf(" %Ld\n\r",value_read);
return value_read;
}
//////////////////////Setup QEI/////////////////////////////////
void setup_QEI()
{
QEICON = QEI_4XPER | VELOCITY_DIV_4;
QEICON = 0b11011011;
MAXCNT = 800;
POSCNT = 0;
POSCNTH = 0; // High byte of 16-bit encoder count
POSCNTL = 0; // low byte
CAP1CON = 0b010011000;
DFLTCON = 0b01110010;
setup_timer_5 (T5_INTERNAL | T5_DIV_BY_4);
}
//////////////////////////////////////////////////////////
//////////////////Read Encoder///////////////////////////
#INT_TIMER1
void read_encoder()
{
set_timer1(32875);
read = POSCNT;
POSCNT=0;
real_v = read/5.2;
read=0;
}
/////////////////////////////////////////////////////////
////////////////////PID Control/////////////////////////
void pidcontrol()
{
unsigned char kp = 2;
unsigned char ki = 0.000003;
unsigned char kd = 0.005;
int16 set_value = 0;
int16 delta_t=0.0065;
signed long error_value = 0;
static signed long pre_error = 0;
static signed long integral = 0;
signed long derivative = 0;
feedback_value = real_v;
set_value = v;
error_value = set_value -feedback_value;
integral = integral + error_value;
derivative = (error_value - pre_error)/delta_t;
PWM = PWM+ (kp * error_value) + (ki * integral) + (kd * derivative);
if (PWM > 1020)
{ PWM = 1020; }
else if (PWM < -1020)
{PWM = -1020;}
pre_error = error_value;
}

///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

void main()
{
int16 value_read;
delay_ms(500);
setup_QEI();
enable_interrupts(INT_RDA);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(0);
set_timer1(32875);
while(true)
{
pidcontrol();
set_pwm2_duty(PWM);
value_read=read_I2C_2byte(slave);
}
}

Code Slave
#include <18f4431.h>
#include <stdlib.h>
#include <math.h>
#include <def_4431.c>
#FUSES NOWDT, HS, NOPUT, NOPROTECT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
#use I2C(SLAVE,SDA=PIN_D2,SCL=PIN_D3,address=0x10,fast= 500000,force_hw)
///////////////////////////////////////////////////////////////
///////////////////////Khai bao bien PID//////////////////////
int8 value_read;
int16 read;
int16 PWM;
int16 feedback_value = 0,real_v;
///////////////////////////////////////////////////////////

//////////////////////Setup QEI/////////////////////////////////
void setup_QEI()
{
QEICON = QEI_4XPER | VELOCITY_DIV_4;
QEICON = 0b11011011;
MAXCNT = 800;
POSCNT = 0;
POSCNTH = 0; // High byte of 16-bit encoder count
POSCNTL = 0; // low byte
CAP1CON = 0b010011000;
DFLTCON = 0b01110010;
setup_timer_5 (T5_INTERNAL | T5_DIV_BY_4);
}
//////////////////////////////////////////////////////////
//////////////////Read Encoder///////////////////////////
#INT_TIMER1
void read_encoder()
{
set_timer1(32875);
read = POSCNT;
POSCNT=0;
real_v = read/5.2;
read=0;
}
/////////////////////////////////////////////////////////
////////////////////Send to Master/////////////////////////
#INT_SSP
void i2c_isr()
{
int8 state;
state = i2c_isr_state();

if(state<0x80)
value_read = i2c_read();


if(state>=0x80)
{
if (state==0x80)
i2c_write(POSCNTH);
if (state==0x81)
i2c_write(POSCNTL);

}
}

////////////////////////////////////////////////////////////////
////////////////////PID Control/////////////////////////
void pidcontrol()
{
unsigned char kp = 2;
unsigned char ki = 0.000003;
unsigned char kd = 0.005;
int16 set_value = 0;
int16 delta_t=0.0065;
signed long error_value = 0;
static signed long pre_error = 0;
static signed long integral = 0;
signed long derivative = 0;
feedback_value = real_v;
set_value = 20;
error_value = set_value -feedback_value;
integral = integral + error_value;
derivative = (error_value - pre_error)/delta_t;
PWM = PWM+ (kp * error_value) + (ki * integral) + (kd * derivative);
if (PWM > 1020)
{ PWM = 1020; }
else if (PWM < -1020)
{PWM = -1020;}
pre_error = error_value;
}

///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////

void main()
{

setup_QEI();
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
enable_interrupts(INT_SSP);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1);
setup_ccp2(CCP_PWM);
set_pwm2_duty(0);
set_timer1(32875);
while(true)
{
pidcontrol();
set_pwm2_duty(PWM);
delay_ms(100);
}
}

anhkhoa4589 05-01-2011 10:17 AM

Cho mình hỏi mọi người 1 tí, phần địa chỉ của Slave mình khai báo theo qui tắc nào vậy, như trong code của bạn Hoanf là address=0x10, làm sao để có con số 0x10.

Mong được mọi người giúp đỡ

TheHouse 12-01-2011 11:53 PM

Cho mình hỏi, nếu giao tiếp với EEPROM 24Cxx thì mình làm sao biết địa chỉ của slave eeprom của mình. Nếu cố định (A0, A1, A2) thì làm sao đọc dữ liệu ở các ngăn địa chỉ còn lại được.

Địa chỉ của slave có phải là địa chỉ của A0, A1, A2 không, nếu đúng vậy thì làm sao mình đọc được dữ liệu từ được địa chỉ 0x01 (khi A2.A1.A0 = 001). Vì có bạn nói là gửi địa chỉ 0x01 thì làm slave hiểu nhầm là đọc i2c từ slave lên.

nttrungut 13-01-2011 11:12 PM

Trích:

Nguyên văn bởi TheHouse (Post 41477)
Địa chỉ của slave có phải là địa chỉ của A0, A1, A2 không, nếu đúng vậy thì làm sao mình đọc được dữ liệu từ được địa chỉ 0x01 (khi A2.A1.A0 = 001). Vì có bạn nói là gửi địa chỉ 0x01 thì làm slave hiểu nhầm là đọc i2c từ slave lên.

A0,A1,A2 là do mình cố định. Địa chỉ của Slave có 7 bit. Khi giao tiếp I2C thì Device Address có 8 bit gồm 7 bit địa chỉ AT24 và 1 bit LSB R/W. Bạn tham khảo datasheet để biết thêm chi tiết về 1 khung dữ liệu trong I2C nhé

quangvanvo 17-02-2011 11:02 AM

-các anh chị ơi làm ơn cho em mail của các anh chị được không vây?
-em viết chương trình về i2c, pwm mà sao em text trên protues hoài ma nó không chịu chạy??
-thật sự em không biết lý do tai sao luôn áh!!! em đọc trên wed em về làm giống y ma nó cũng không chiu chay.
-cho em mail để em giử chương trình cùng với protues để các anh chị kiểm tra giùm em với!!!!!!!! pleasea!!!!!!
<<phieudu_cunggio951@yahoo.com.vn>> thanks

quangvanvo 17-02-2011 11:18 AM

các anh chị làm ơn gianh chút thời gian giúp em với !!!!!!!!!! làm ơn!!!!!!!!

stupid11 04-03-2011 10:35 PM

tài liệu viết Help -CCS tiếng Việt rất hay..
 
1 Attachment(s)
tài liệu này rất chi tiết..các bạn dơn về tham khảo..nếu thấy hay thì "thanks" dùm mình cái nghen...

nguyen_de89 04-03-2011 10:40 PM

Cam on stupid tai lieu rat hay va chi tiet
 
Cam on stupid tai lieu rat hay va chi tiet ;))

quangvanvo 14-03-2011 05:21 PM

4 Attachment(s)
mình hỏi tài liệu trên picvietnam ma không ai thèm tra lời chắc là do mình không có file đẩy đủ cho anh em, mình viết trong 2 tuần nay thấy nó chay cũng tạm được ma sao mình thẩy chương trinh của mình không giống với các anh chị viết . giờ em giửi chương trình cùng với protues em mới viết anh chị xem giùm có thiếu sót gì không.
nhưng em thấy nó chạy rất ngon lanh, hjhjhj

quangvanvo 22-03-2011 12:09 PM

nếu có ai có mạch thực tế thì text giùm coi nó có chạy thực tế ở ngoài có vấn đề gì không.
mình chỉ text trên protues thì thấy nó chạy tốt. mình chưa có mạch thực để text mong các bạn đóng gốp ý kiến về chương trình của mình cho mình biết với nha!!! thanks

phamdactoan 12-05-2011 03:32 PM

các bác cho e hỏi câu này với.hiện e đang viết chương trình giao tiếp bus i2c phần slaver.em viết bang verilog tren FPGA.em đã xây dựng xong các khối slaver.jo e mún kiểm tra xem khối của e có đúng không nên e mún dùng 1 con pic 887 làm master để truyền wa con slave.mà jo em dang thắc mắc không bít viết code cho con pic bang ccs ra sao?bác nào gơi ý jup e voi
Nhập data từ keyboard--->I2C master(tuc con pic)--->I2C slave(tren FPGA)-->>hiện lên LCD

minhkhoa1990 10-06-2011 05:23 AM

//
int16 read_I2C_2byte(int8 slave_address)
{
int16 value_read;
i2c_start();
i2c_write(slave_address+1);?????????
high=i2c_read(1);
delay_us(10);
low=i2c_read(0);
i2c_stop();
value_read=make16(high,low);
value_read=value_read/5.2;
printf(" %Ld\n\r",value_read);
return value_read;
}
///////////
các bác cho em hỏi hàm i2c_write(slave_address+1) có ý nghĩa như thế nào và địa chỉ:slave_address+1 là sao.......... thanks các bác nhiều


Múi giờ GMT. Hiện tại là 05:21 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