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

 
 
Ðiều Chỉnh Xếp Bài
Prev Previous Post   Next Post Next
Old 10-08-2011, 11:18 AM   #1
kitten_spkt
Nhập môn đệ tử
 
Tham gia ngày: Jun 2010
Bài gửi: 1
:
help SPI!!!

Các anh chị pro làm ơn xem giúp em với, em viết mà chẳng biết lỗi ở đâu hết. Mô phỏng protues thì có truyền nhận được phần giao tiếp máy tính, nhưng lại không chạy được các chương trình con.
Em mới viết thử cho 1 con slave thôi. cái này là code master:

#include <htc.h>
#include <stdio.h>
__CONFIG(HS&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROT ECT&BORDIS&IESODIS&FCMDIS&LVPDIS);

int a;
char data;

void putchar(char c);

//manual
void forward();
void backward();
void b_left();
void b_right();
void stop_b();

void up();
void down();
void h_left();
void h_right();
void stop_h();

void main()
{
//digital I/O
ANSEL=ANSELH=0;

//khới tạo UART
TXSTA=0x24;
RCSTA=0x90;
BRG16=1;
SPBRGH=0;
SPBRG=520;

//SPI master
SSPCON=0X20;
SMP=0;
CKP=0;
CKE=0;

TRISC3=0; //SCK
TRISC4=1; //SDI
TRISC5=0; //SDO
TRISA0=0; //gọi slave1
RA0=1; //chưa gọi
TRISA1=0; //gọi slave2
RA1=1; //chưa gọi

RCIE=1; //ngắt UART
RCIF=0;
PEIE=1;
GIE=1;

while(1)
{
}
}

void interrupt isr()
{
if (RCIE&&RCIF)
{
RCIF=0;
data=RCREG;
putchar(RCREG);

if (data=='a') forward();

else if (data=='b') backward();

else if (data=='c') b_left();

else if (data=='d') b_right();

else if (data=='e') up();

else if (data=='f') down();

else if (data=='g') h_left();

else if (data=='h') h_right();

else if (data=='i')
{
stop_b();
stop_h();
}
}
}

void putchar(char c)
{
while(!TXIF);
TXREG=c;
}

void forward()
{
RA0=0;
RA1=1;
WCOL=0;
SSPIF=0;
SSPBUF=1;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA0=1;
RA1=1;
}

void backward()
{
RA0=0;
RA1=1;
WCOL=0;
SSPIF=0;
SSPBUF=2;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA0=1;
RA1=1;
}

void b_left()
{
RA0=0;
RA1=1;
WCOL=0;
SSPIF=0;
SSPBUF=3;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA0=1;
RA1=1;
}

void b_right()
{
RA0=0;
RA1=1;
WCOL=0;
SSPIF=0;
SSPBUF=4;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA0=1;
RA1=1;
}

void up()
{
RA0=1;
RA1=0;
WCOL=0;
SSPIF=0;
SSPBUF=5;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}

void down()
{
RA0=1;
RA1=0;
WCOL=0;
SSPIF=0;
SSPBUF=6;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}
void h_left()
{
RA0=1;
RA1=0;
WCOL=0;
SSPIF=0;
SSPBUF=7;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}

void h_right()
{
RA0=1;
RA1=0;
WCOL=0;
SSPIF=0;
SSPBUF=8;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}

void stop_b()
{
RA0=0;
RA1=1;
WCOL=0;
SSPIF=0;
SSPBUF=9;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}

void stop_h()
{
RA0=1;
RA1=0;
WCOL=0;
SSPIF=0;
SSPBUF=10;
while (!SSPIF);
a=SSPBUF;
_delay(100000);
RA1=1;
RA1=1;
}


code slave:


#include <htc.h>
#include <stdio.h>
__CONFIG (HS & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT& BORDIS & IESODIS & FCMDIS & LVPDIS);

char a;
bit test;

void forward();
void backward();
void b_left();
void b_right();
void stop_b();

void main()
{
ANSEL=ANSELH=0;

//SPI
SSPCON=0X24; //chế độ slave, cho phép chân SS

SMP=0;
CKP=0;
CKE=0;

TRISC3=1; //SCK
TRISC4=1; //SDI
TRISC5=0; //SDO
TRISA5=1; //SS

SSPIE=1;
SSPIF=0;
PEIE=1;
GIE=1;

//pwm f=20khz
TRISC1=TRISC2=0;
PR2=249; // T=1/f=(PR2=TMR2)*4*pre*pos/Fosc
TMR2=0;
T2CON=0; //postscale 1:1
//TMR2 off
//prescale 1
CCP1CON=0x0C;
CCP2CON=0x0C;

TRISA0=TRISA1=0; //motor trái RA0-tới, RA1-lùi
TRISA2=TRISA3=0; //motor phải RA2-tới, RA3-lùi RA0=RA1=RA2=RA3=0;

while(1)
{
if (CCPR1L>17||CCPR2L>17) test=0;
else test=1;
}
}

void forward()
{
if (test==1)
{
CCPR1L=10;
CCPR2L=10;
TMR2ON=1;
RA0=RA2=1;
RA1=RA3=0;
}

else stop_b();
}

void backward()
{
if (test==1)
{
CCPR1L=10;
CCPR2L=10;
TMR2ON=1;
RA0=RA2=0;
RA1=RA3=1;
}

else stop_b();
}

void b_left()
{
if (test==1)
{
CCPR1L=17;
CCPR2L=0;
TMR2ON=1;
RA1=1;
RA0=RA2=RA3=0;
}

else stop_b();
}

void b_right()
{
if (test==1)
{
CCPR1L=0;
CCPR2L=17;
TMR2ON=1;
RA3=1;
RA0=RA1=RA2=0;
}

else stop_b();
}

void stop_b()
{
TMR2ON=0;
RA0=RA1=RA2=RA3=0;
}

void interrupt isr()
{
if (SSPIE&&SSPIF)
{
SSPIF=0;
a=SSPBUF;
SSPBUF=0;

if (RA5==0&&test==1)
{
switch (a)
{
case (1):
forward();
break;

case (2):
backward();
break;

case (3):
b_left();
break;

case (4):
b_right();
break;

case (9):
stop_b();
break;
}
}
}
}



PLEASE, HELP ME!!!

thay đổi nội dung bởi: kitten_spkt, 10-08-2011 lúc 11:25 AM. Lý do: NHÌN RÕ RA
kitten_spkt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
 


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:17 AM.


Đượ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