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