E đang học về SPI . E đang làm 1 bài tập nho nhỏ như sau :
Giao tiếp 2 con Atmega8 . Nếu nhấn BUTTON 1 ở Master thì LED(SLAVE) tăng lên 1 , còn nhấn BUTTON 2 thì LED(SLAVE)=0.
Tuy nhiên em viết code rồi chỉnh sửa thế nào vẫn ko dc .
Hiện tương khi e chay PROTEUS là :
Nhấn BUTTON 1 : ko phản ứng gì
Nhấn BUTTON 2 3 lần thì SPI_debugger hiển thị như trong hình đính kèm ah --> nó chỉ truyền dc 1 bit phải ko ah ?
Nhưng SPI thì có thể tự động chuyển lần lượt 8bit mà ,nó còn nhận cùng lúc đó 8bit của SLAVE nữa .
Ai biết e sai cái gì thì chỉ em với E xin CẢM ƠN các anh trước
E đau đầu vì nó cả tuần rồi .
P/s: Thầy trên trường e thì sài Codevision nó co thư viện <spi.h> . Nhưng từ đầu e đã học trên hocavr.com nên e toàn sài Atmel Studio ( sài nó thấy rất nhìu cái hay nên sài luôn ).
Code đây ah:
con MASTER
Con SLAVE
Giao tiếp 2 con Atmega8 . Nếu nhấn BUTTON 1 ở Master thì LED(SLAVE) tăng lên 1 , còn nhấn BUTTON 2 thì LED(SLAVE)=0.
Tuy nhiên em viết code rồi chỉnh sửa thế nào vẫn ko dc .
Hiện tương khi e chay PROTEUS là :
Nhấn BUTTON 1 : ko phản ứng gì
Nhấn BUTTON 2 3 lần thì SPI_debugger hiển thị như trong hình đính kèm ah --> nó chỉ truyền dc 1 bit phải ko ah ?
Nhưng SPI thì có thể tự động chuyển lần lượt 8bit mà ,nó còn nhận cùng lúc đó 8bit của SLAVE nữa .
Ai biết e sai cái gì thì chỉ em với E xin CẢM ƠN các anh trước
E đau đầu vì nó cả tuần rồi .
P/s: Thầy trên trường e thì sài Codevision nó co thư viện <spi.h> . Nhưng từ đầu e đã học trên hocavr.com nên e toàn sài Atmel Studio ( sài nó thấy rất nhìu cái hay nên sài luôn ).
Code đây ah:
con MASTER
Code:
/* * Test_SPI.cpp * * Created: 4/21/2013 11:11:01 PM * Author: DANGKIET */ #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <stdio.h> #define clear_bit(port,bit) (port)&=~(1<<(bit)) #define set_bit(port,bit) (port)|=(1<<(bit)) #define SCK 5 #define MISO 4 #define MOSI 3 #define SS 0 #define SPI_PORT PORTB #define SPI_DDR DDRB #define BUT1 0 // o PORTC #define BUT2 6 void SPI_Masterinit() { SPI_DDR=(1<<MOSI)|(1<<SCK)|(1<<SS); SPI_PORT=(1<<MISO)|(1<<SS); SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0); } void SPI_transmit(char data) { SPDR=data; while(bit_is_clear(SPSR,SPIF)); // cho chuyen phat thanh cong; // da thu dong nay while(!(SPSR & (1<<SPIF))); trong datasheet van ko an thau } volatile char master_data=2; int main(void) { SPI_Masterinit(); _delay_ms(400); // cho cho SLAVE khoi dong xong DDRC=0x00; // huong du lieu cho BUTTON PORTC=0xff; // dien tro keo len while(1) { if(PINC==0b11111110) // BUTTON 1 nhan || em lam hoai ko dc nen ghi nhi phan cho chac { clear_bit(SPI_PORT,SS); SPI_transmit(master_data++); set_bit(SPI_PORT,SS); _delay_ms(10); } if (PINC==0b10111111) //BUTTON 2 nhan { clear_bit(SPI_PORT,SS); SPI_transmit(4); set_bit(SPI_PORT,SS); _delay_ms(10); } } return 0; }
Code:
/* * test_SPI__slave.cpp * * Created: 4/21/2013 11:57:44 PM * Author: DANGKIET */ #define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> #define clear_bit(port,bit) (port)&=~(1<<(bit)) #define set_bit(port,bit) (port)|=(1<<(bit)) #define SCK 5 #define MISO 4 #define MOSI 3 #define SS 2 #define SPI_PORT PORTB #define SPI_DDR DDRB #define LED PORTC #define LED_DDR DDRC void SPI_Slaveinit() { SPI_DDR=(1<<MISO); SPI_PORT=(1<<MOSI)|(1<<SS); SPCR= (1<<SPIE)|(1<<SPE)|(1<<SPR0); /// co sung dung ngat khi data nhan } void giaimaled7 (uint8_t i) { uint8_t n[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; LED= n[i]; } volatile char slave_data=0; int main() { SPI_Slaveinit(); sei(); LED_DDR=0xff; while(1) { } return 0; } ISR(SPI_STC_vect) { slave_data=SPDR; giaimaled7(slave_data); _delay_ms(100); }
Comment