PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp USB, CAN, I2C, SPI, USART...

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Giao tiếp USB, CAN, I2C, SPI, USART... Những giao tiếp được tích hợp trên PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 13-10-2010, 10:59 AM   #166
chungcb86
Đệ tử 1 túi
 
chungcb86's Avatar
 
Tham gia ngày: Dec 2009
Bài gửi: 24
:
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
chungcb86 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-10-2010, 10:02 AM   #167
liemcena
Nhập môn đệ tử
 
Tham gia ngày: Sep 2010
Bài gửi: 1
:
Giúp em i2c

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ả
Hình Kèm Theo
File Type: jpg untitled.JPG (223.4 KB, 22 lần tải)

thay đổi nội dung bởi: liemcena, 26-10-2010 lúc 10:55 PM.
liemcena vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-11-2010, 09:47 PM   #168
dark_dragon6789
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 4
:
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
dark_dragon6789 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-12-2010, 04:03 PM   #169
winphys03
Nhập môn đệ tử
 
Tham gia ngày: Apr 2008
Bài gửi: 1
:
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);
}
}
winphys03 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-01-2011, 10:17 AM   #170
anhkhoa4589
Nhập môn đệ tử
 
Tham gia ngày: Apr 2010
Bài gửi: 4
:
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 đỡ
anhkhoa4589 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-01-2011, 11:53 PM   #171
TheHouse
Đệ tử 1 túi
 
Tham gia ngày: Feb 2010
Bài gửi: 13
:
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.
TheHouse vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-01-2011, 11:12 PM   #172
nttrungut
Nhập môn đệ tử
 
Tham gia ngày: Feb 2009
Nơi Cư Ngụ: TPHCM
Bài gửi: 6
:
Trích:
Nguyên văn bởi TheHouse View Post
Đị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é
__________________
EED-HCMUT
nttrungut vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2011, 11:02 AM   #173
quangvanvo
Đệ tử 1 túi
 
Tham gia ngày: Jan 2011
Bài gửi: 18
:
-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

thay đổi nội dung bởi: quangvanvo, 17-02-2011 lúc 11:07 AM.
quangvanvo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2011, 11:18 AM   #174
quangvanvo
Đệ tử 1 túi
 
Tham gia ngày: Jan 2011
Bài gửi: 18
:
các anh chị làm ơn gianh chút thời gian giúp em với !!!!!!!!!! làm ơn!!!!!!!!
quangvanvo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2011, 10:35 PM   #175
stupid11
Đệ tử 6 túi
 
stupid11's Avatar
 
Tham gia ngày: Dec 2009
Nơi Cư Ngụ: TP.Hồ Chí Minh
Bài gửi: 133
:
Send a message via Yahoo to stupid11
tài liệu viết Help -CCS tiếng Việt rất hay..

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...
File Kèm Theo
File Type: pdf PIC-C.pdf (700.0 KB, 575 lần tải)
stupid11 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-03-2011, 10:40 PM   #176
nguyen_de89
Đệ tử 1 túi
 
nguyen_de89's Avatar
 
Tham gia ngày: Sep 2010
Bài gửi: 21
:
Cam on stupid tai lieu rat hay va chi tiet

Cam on stupid tai lieu rat hay va chi tiet )
nguyen_de89 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-03-2011, 05:21 PM   #177
quangvanvo
Đệ tử 1 túi
 
Tham gia ngày: Jan 2011
Bài gửi: 18
:
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
File Kèm Theo
File Type: rar Nhan_1byte.rar (18.7 KB, 127 lần tải)
File Type: rar Nhan_2byte.rar (21.5 KB, 102 lần tải)
File Type: rar Truyen_1byte.rar (18.3 KB, 102 lần tải)
File Type: rar Truyen_2byte.rar (18.6 KB, 107 lần tải)
quangvanvo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-03-2011, 12:09 PM   #178
quangvanvo
Đệ tử 1 túi
 
Tham gia ngày: Jan 2011
Bài gửi: 18
:
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
quangvanvo vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-05-2011, 03:32 PM   #179
phamdactoan
Nhập môn đệ tử
 
Tham gia ngày: Dec 2009
Bài gửi: 1
:
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
phamdactoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 10-06-2011, 05:23 AM   #180
minhkhoa1990
Nhập môn đệ tử
 
Tham gia ngày: Oct 2010
Bài gửi: 8
:
//
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
minhkhoa1990 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


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


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam