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 11-06-2011, 09:02 AM   #181
minhkhoa1990
Nhập môn đệ tử
 
Tham gia ngày: Oct 2010
Bài gửi: 8
:
ko có bác nào giúp em ah. hix
minhkhoa1990 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-06-2011, 06:32 PM   #182
truongvanquan
Nhập môn đệ tử
 
Tham gia ngày: Oct 2010
Bài gửi: 3
:
Trích:
Nguyên văn bởi minhkhoa1990 View Post
//
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

Theo em nghĩ thì đây là một chương trình con.

ở trên bác dùng một biến: int16 read_I2C_2byte(int8 slave_address)
nên ở dưới nó sẽ dùng biến này!

VD như bác điều khiển DS1307 thì địa chỉ của nó là 0b1101000x. (0xD..)
như vậy i2c_write(slave_address+1) sẽ là i2c_write(0xD1) ->> đọc thông tin từ DS1307

thân,
truongvanquan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-07-2011, 11:24 AM   #183
moonlight_mta
Nhập môn đệ tử
 
moonlight_mta's Avatar
 
Tham gia ngày: Jul 2011
Bài gửi: 3
:
Mình mới học về giao tiếp I2C,mình viết code cho PIC6F877A và DS1307 hiển thị LCD.Mình không sử dụng các hàm có sẵn của CCS.Khi chạy thì nó không thoát ra được khỏi vòng lặp wait_ngắt,tức chờ cho cờ ngắt SSPIF = 1.Code của nó như sau,các bạn giúp mình nhé
#include<16f877a.h>
#include<def_877.c>
#include<LCD_mod.h>
#use delay(clock = 20000000)
void wait_ngat(void);
unsigned char DECBCD2(unsigned char);
void main()
{
unsigned char s,p,h,d,m,y;
TRISB = 0x00;
TRISD = 0x00;
wrcmd(0x38);
wrcmd(0x01);
wrcmd(0x0e);

SSPCON = 0x38; //ko truyen du lieu vao sspbuf khi che do truyen du lieu chua san sang
//ko du lieu dc nhan vao sspbuf khi du lieu cu chua dc doc
// cho phep cong giao tiep mssp
// che do I2C master mode,cl SCL= Fosc/(4*(SSPADD+1)
SSPADD = 0;
INTCON7 = 1; //cho phep tat ca ngat
INTCON6 = 1; //cho phep ngat ngoai vi

PIE13 = 1; // cho phep ngat ssp

// bat dau wa trinh truyen nhan du lieu
TRISC3 = 0; // cac pin sda va scl
TRISC4 = 0;
PORTC3 = 1;
PORTC4 = 1;
SSPCON20 = 1; // sspcon2<0> = 1 thiet lap start
wait_ngat();
SSPBUF = 11010000; // address and write
PIR13 = 0;

wait_ngat();
SSPBUF = 0;
PIR13 = 0;

wait_ngat();
SSPBUF = 0;
PIR13 = 0;

wait_ngat();
SSPBUF = 0;
PIR13 = 0;

wait_ngat();
SSPBUF = 0;
PIR13 = 0;

wait_ngat();
SSPBUF = 0x01;
PIR13 = 0;

wait_ngat();
SSPBUF = 0x01;
PIR13 = 0;

wait_ngat();
SSPBUF = 0x01;
PIR13 = 0;

wait_ngat();
SSPBUF = 0x11;
PIR13 = 0;

SSPCON22 = 1;
wait_ngat();
PIR13 = 0;

//................................
SSPCON20 = 1;
wait_ngat();
SSPBUF = 11010000;
PIR13 = 0;

wait_ngat();
SSPBUF = 0;
PIR13 = 0;

wait_ngat();
SSPCON22 = 1;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
//.....................................
TRISC3 = 1;
TRISC4 = 1;
SSPCON20 = 1;
wait_ngat();
SSPBUF = 11010001;
PIR13 = 0;

wait_ngat();
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
s = SSPBUF;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
p = SSPBUF;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
h = SSPBUF;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
d = SSPBUF;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
m = SSPBUF;
PIR13 = 0;

wait_ngat();
PIR13 = 0;
wait_ngat();
y = SSPBUF;
PIR13 = 0;

SSPCON22 = 1;
wait_ngat();
PIR13 = 0;

//...........................
DECBCD2(s);
DECBCD2(p);
DECBCD2(h);
DECBCD2(d);
DECBCD2(m);
DECBCD2(y);
wrdata(s);
wrdata(p);
wrdata(h);
wrdata(d);
wrdata(m);
wrdata(y);
}
//........................
void wait_ngat(void)
{
while(PIR13 == 0);
}
//........................
unsigned char DECBCD2(unsigned char BCD)
{
unsigned char L,H;
L = BCD & 0x0f;
H = (BCD>>4) *10;
return(L+H);
}
moonlight_mta vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-11-2011, 07:15 PM   #184
tan_truong
Đệ tử 1 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 17
:
I2C...........slave->master

Đụng lại vấn đề cũ của mấy huynh
Em mô phỏng chuẩn I2C giữa 2 con 18f4431, tình hình là nó chạy rất tào lao( tại người làm chuối quá)
Em gửi kèm file mô phỏng, mấy anh xem hộ cho thèn em với
Cảm ơn mọi người
File Kèm Theo
File Type: rar mophong.rar (169.8 KB, 57 lần tải)
tan_truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 16-11-2011, 02:36 PM   #185
tan_truong
Đệ tử 1 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 17
:
I2C----->>Master<==>Slave

Chào tất cả mọi nguời, sau 1 khi tìm hiểu về I2C để giải quyết vấn đề mình có đặt ra bên trên thì tạm thời mình mô phỏng được việc truyền nhận dữ liệu 2 chiều Master<==>Slave
Mọi nguời có hứng thì tham khảo và góp ý nhé
P/S: 1) Cảm ơn anh Hoanf và tất cả mọi nguời đã đóng góp xây dựng thread này
2) Vấn đề mình thắc mắc ở trên thì vẫn chưa giải quyết ^^, tiếp tục help me nhé
File Kèm Theo
File Type: rar I2C_truyen nhan 2 chieu.rar (41.0 KB, 130 lần tải)
tan_truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-11-2011, 11:19 PM   #186
chuvanhuu
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 5
:
các bác ơi, cho em hỏi chút, có phải I2C là nhất thiết phải dùng ngắt ko ạ?
ko biết là có bác nào từng nghiên cứu vấn đề này chưa, nhưng mình thấy là dùng lệnh while đi kèm lệnh điều kiện thì chức năng cũng có thể gần giống ngắt, ví dụ như chương trình này, (mình làm ko thành công, nên thuật giải cũng ko chắc chắn đúng)
<code>//chuong trinh cho slave
#include <16f877a.h>
#include <def_877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, address=0x10)
int8 data, state;
#define slave 0x10
void main()
{
data=0;
trisd=0;
while(1)
{
state= i2c_isr_state();
switch (state)
{
case 0x80:
{
data++;
if( data==255 )
{
data= 0;
}
i2c_write(data);
break;
}
case 0x81: i2c_write(slave);
break;
}
portd= data;
}
}</code>
chuvanhuu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 28-11-2011, 10:50 AM   #187
tan_truong
Đệ tử 1 túi
 
Tham gia ngày: Nov 2010
Bài gửi: 17
:
Chào bạn,
Thứ 1, bạn viết chương trình cho Slave mà sao hok có hàm nhận mà chỉ có hàm truyền ko vậy?
Thứ 2, nếu bạn dùng ccs thì vào phần help để xem lại lệnh state=i2c_isr_state(); bạn xem thử giá trị state bằng bao nhiêu thì gửi, bao nhiêu thì nhận.
Thứ 3, nếu con vđk của bạn còn làm việc khác nữa thì nên xem lặp cách dùng vòng lặp thế này.
Chúc bạn thành công.
tan_truong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 30-11-2011, 12:38 AM   #188
chuvanhuu
Nhập môn đệ tử
 
Tham gia ngày: Nov 2011
Bài gửi: 5
:
cảm ơn bạn, đây là code con master, cái này thực ra ko phải mình viết
<code>
// chuong trinh cho master
#include <16f877a.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use i2c(master, SDA=PIN_C4, SCL=PIN_C3)
int8 data, bo, i;
#define slave 0x10
void doc_i2c()
{
i= 0;
while( i!=2)
{
i++;
i2c_start();
i2c_write( slave+1); //nhan du lieu tu Slave
switch ( i)
{
case 1: data= i2c_read( 1);
break;
case 2: bo= i2c_read( 0);
break;
}
}
}
void main()
{
trisd= 0;
portd= 0;
while(true)
{
doc_i2c();
portd= data;
delay_ms( 100);
}
}
</code>
===============================================

còn đây là code cho Slave nguyên mẫu, code slave bên trên do mình chỉnh sửa từ đây
<code>
// chuong trinh cho master
#include <16f877a.h>
#include <def_877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock= 4000000)
#use i2c(master, SDA=PIN_C4, SCL=PIN_C3)
int8 data, bo, i;
#define slave 0x10
void doc_i2c()
{
i= 0;
while( i!=2)
{
i++;
i2c_start();
i2c_write( slave+1); //nhan du lieu tu Slave
switch ( i)
{
case 1: data= i2c_read( 1);
break;
case 2: bo= i2c_read( 0);
break;
}
}
}
void main()
{
trisd= 0;
portd= 0;
while(true)
{
doc_i2c();
portd= data;
delay_ms( 100);
}
}

</code>
chuvanhuu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-12-2011, 12:24 AM   #189
slove
Nhập môn đệ tử
 
Tham gia ngày: Jul 2011
Bài gửi: 1
:
Có bạn nào truyền giữa 1 master với nhiều slave chưa? Không hiểu sao không đúng địa chỉ mà của mình mà slave vần nhảy vào ngắt nhận và đọc giá trị từ buffer về.
Mình truyền cho 5 con slave thì cả 5 lần cả 5 con đều nhảy vào ngắt nhận. Không hiểu tại sao nữa.
slove vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2012, 11:22 AM   #190
vangtranglanh
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Nơi Cư Ngụ: da nang
Bài gửi: 1
:
Cần anh chị giúp I2C

Em mới chập chững học i2c nên còn nhiều thắc mắc và nhiều chỗ không hiểu ,anh chị cho em hỏi giả sử bên slave của em có một biến đếm n,cứ sau 1 giây thì n++;bây h em mún gởi giá trị của n qua máter thì code ở mater và slave sẽ được viết như thế nào ạ?
Mong anh chị giúp dỡ ,xin cảm ơn!
vangtranglanh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 12-04-2012, 01:16 AM   #191
truong298
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 2
:
các anh ơi. e mới học pic. giờ đang phải làm giao tiếp giữa pic và eeprom(truyền dữ liệu cho eeprom) và giao tiếp với ds1307. e kô biết phải làm sao. mong các anh giúp đỡ
truong298 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-05-2012, 12:16 PM   #192
neunhu50
Nhập môn đệ tử
 
Tham gia ngày: Oct 2010
Bài gửi: 6
:
có bạn nào làm 1 pic master điều khiển 3 pic slave để điều khiển 12 động cơ step chưa (1pic 4 stepmotor), chia sẽ mình với.
neunhu50 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-05-2012, 11:17 AM   #193
quyen bk
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 5
:
giao tiếp với eeprom ngoài(24c64)

Help!
Các anh(chị) ơi help me em với!
Em có nhận bài tập của ông thầy với nội dung đề ra:
Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

+ nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
Em thank trước nha!!!!!!!!!!!!
quyen bk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-05-2012, 11:19 AM   #194
quyen bk
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 5
:
giaotiếp với eeprom ngoài(24c64)

Help!
Các anh(chị) ơi help me em với!
Em có nhận bài tập của ông thầy với nội dung đề ra:
Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

+ nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
Em thank trước nha!!!!!!!!!!!!
mail của em nề: vanquyen1690@gmail.com
File Kèm Theo
File Type: rar help.rar (16.8 KB, 8 lần tải)
quyen bk vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-05-2012, 11:21 AM   #195
quyen bk
Nhập môn đệ tử
 
Tham gia ngày: Mar 2012
Bài gửi: 5
:
Red face giaotiếp với eeprom ngoài(24c64)

Help!
Các anh(chị) ơi help me em với!
Em có nhận bài tập của ông thầy với nội dung đề ra:
Viết chương trình nhập từ bàn phím 4x4 với các số tùy ý từ 0-9, rồi hiển thị các số vừa nhập đó ra lcd, nhưng các số vừa nhập đó sẽ được lưu vào eeprom ngoài (dùng eeprom 24c64) và khi ta nhập lại số lúc đầu nếu nhập đúng thì xuât ra lcd với dòng chữ là ‘ok’, còn nhập sai thì là là dòng chữ “sai” ví dụ:
Lần 1: lúc đầu ta nhập “1234” nhấn nút ok( nút ok cụ thể là nút dấu = trong mô phỏng)
Lần 2: + Nếu ta nhập lại “1234” thì xuất ra lcd ở dòng 1 là “1234” và ở dòng 2 là chữ “ok”

+ nếu ta nhập “2356.v.v.” thì xuất ra lcd ở dòng 1 là “2356.v.v.” và ở dòng 2 là chữ “sai”
Về phần cứng em nghĩ ra và vẽ như thế đã đúng chưa anh( chị)?
Vậy xin các anh (chị) có làm qua hay gặp vấn đề tương tự thì giúp em, em đang tìm hiểu về ccs nếu có code C thì quá tốt rồi!
Em thank trước nha!!!!!!!!!!!!
mail của em nề: vanquyen1690@gmail.com
File Kèm Theo
File Type: rar help.rar (16.8 KB, 6 lần tải)

thay đổi nội dung bởi: quyen bk, 20-05-2012 lúc 11:22 AM. Lý do: thiếu phần file đính kèm
quyen bk 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à 02:20 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