|
Tài trợ cho PIC Vietnam |
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 |
10-08-2011, 11:18 AM | #1 |
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 |
|
|