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 điều khiển động cơ DC (http://www.picvietnam.com/forum/showthread.php?t=29757)

khienpzo 27-07-2012 01:44 AM

Giao tiếp I2C điều khiển động cơ DC
 
Em có một đề tài về I2C rất mong được sự chia sẻ của các anh chị đi trước ạ . EM có 2 PIC 16f877a giao tiếp I2C để điều khiển tốc độ or vị trí động cơ DC . PICA : Bàn phím nhập thông số tốc độ or vị trí (góc quay) . PICB : điều khiển động cơ DC và hiển thị thông số trên led 7 đoạn. Em mới bắt tay vào làm nên còn nhiều bỡ ngỡ mong các anh chị chỉ giáo . Em xin chân thành cảm ơn

oattao 27-09-2012 07:12 PM

Vấn đề giao tiếp I2C giữa Pic16f877a với eeprom 24C00
 
1 Attachment(s)
Mình muốn ghi 1 byte (0xAA) vào ô nhớ 0xF1 trong Eeprom 24C00 qua I2C, sau đó đọc dữ liệu từ ô nhớ đó (0xF1) xuất ra PORTB, nhưng không hiểu sao kết quả toàn ra là PORTB = 0xFF.
Nhờ mọi người xem đoạn code của mình viết bằng CSS C có vấn đề gì không? Ngồi cả ngày mãi không được chán quá.

#include "C:\Users\oattao\Desktop\Draft\I2C.h"
void InitI2C();
void SendByte(int8 data, int8 address);
int8 ReadByte(int8 address);

void main()
{
TRISB = 0x00;
TRISC = 0xFF;
InitI2C();
SendByte(0xAA, 0xF1);
PORTB = ReadByte(0xF1);
while(1);
}
void InitI2C()
{
SSPEN = 1; // MSSP enalbe

SSPM3 = 1; // Master mode SSPM3 = ob1000
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;

CKE = 0;

SMP = 1; // Standard speed mode
SSPADD = 0x28;
}
void SendByte(int8 data, int8 address)
{
// Send start condition
SEN = 1;
while(!SSPIF);
SSPIF = 0;

// Select device
SSPBUF = 0b10101110;
while(!SSPIF);
SSPIF = 0;

// Selec address in device
SSPBUF = address;
while(!SSPIF);
SSPIF = 0;

// Move data to device
SSPBUF = data;
while(!SSPIF);
SSPIF = 0;

// Send stop conditon
PEN = 1;
while(!SSPIF);
SSPIF = 0;
}
int8 ReadByte(int8 address)
{
int8 data;
// Send start conditon
SEN = 1;
while(!SSPIF);
SSPIF = 0;

// Select device
SSPBUF = 0b10101110;
while(!SSPIF);
SSPIF = 0;

// Select address in device
SSPBUF = address;
while(!SSPIF);
SSPIF = 0;

// Send Restart bit
RSEN = 1;
while(!SSPIF);
SSPIF = 0;

SSPBUF = 0b10101111; // Select device
while(!SSPIF);
SSPIF = 0;

// Set RCEN
RCEN = 1;
while(!SSPIF);
SSPIF = 0;

data = SSPBUF;

// Send NACK bit
ACKEN = 1;
while(!SSPIF);
SSPIF = 0;

// Send stop bit
PEN = 1;
while(!SSPIF);
SSPIF = 0;

return data;
}

toancdt 27-09-2012 10:03 PM

Trích:

Nguyên văn bởi oattao (Post 77996)
Mình muốn ghi 1 byte (0xAA) vào ô nhớ 0xF1 trong Eeprom 24C00 qua I2C, sau đó đọc dữ liệu từ ô nhớ đó (0xF1) xuất ra PORTB, nhưng không hiểu sao kết quả toàn ra là PORTB = 0xFF.
Nhờ mọi người xem đoạn code của mình viết bằng CSS C có vấn đề gì không? Ngồi cả ngày mãi không được chán quá.

#include "C:\Users\oattao\Desktop\Draft\I2C.h"
void InitI2C();
void SendByte(int8 data, int8 address);
int8 ReadByte(int8 address);

void main()
{
TRISB = 0x00;
TRISC = 0xFF;
InitI2C();
SendByte(0xAA, 0xF1);
PORTB = ReadByte(0xF1);
while(1);
}
void InitI2C()
{
SSPEN = 1; // MSSP enalbe

SSPM3 = 1; // Master mode SSPM3 = ob1000
SSPM2 = 0;
SSPM1 = 0;
SSPM0 = 0;

CKE = 0;

SMP = 1; // Standard speed mode
SSPADD = 0x28;
}
void SendByte(int8 data, int8 address)
{
// Send start condition
SEN = 1;
while(!SSPIF);
SSPIF = 0;

// Select device
SSPBUF = 0b10101110;
while(!SSPIF);
SSPIF = 0;

// Selec address in device
SSPBUF = address;
while(!SSPIF);
SSPIF = 0;

// Move data to device
SSPBUF = data;
while(!SSPIF);
SSPIF = 0;

// Send stop conditon
PEN = 1;
while(!SSPIF);
SSPIF = 0;
}
int8 ReadByte(int8 address)
{
int8 data;
// Send start conditon
SEN = 1;
while(!SSPIF);
SSPIF = 0;

// Select device
SSPBUF = 0b10101110;
while(!SSPIF);
SSPIF = 0;

// Select address in device
SSPBUF = address;
while(!SSPIF);
SSPIF = 0;

// Send Restart bit
RSEN = 1;
while(!SSPIF);
SSPIF = 0;

SSPBUF = 0b10101111; // Select device
while(!SSPIF);
SSPIF = 0;

// Set RCEN
RCEN = 1;
while(!SSPIF);
SSPIF = 0;

data = SSPBUF;

// Send NACK bit
ACKEN = 1;
while(!SSPIF);
SSPIF = 0;

// Send stop bit
PEN = 1;
while(!SSPIF);
SSPIF = 0;

return data;
}

code ví dụ giao tiếp giữa 16f877a và 24c16 http://www.mediafire.com/?op7fw6p1bha53cr


Múi giờ GMT. Hiện tại là 06:51 AM.

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