PDA

View Full Version : help SPI!!!


kitten_spkt
10-08-2011, 11:18 AM
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&DUNPROTECT&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!!!