Здравствуйте.. Нужно, чтобы ведомый отправлял мастеру 1 байтовое число, а тот выводил его на любой из портов..
2 ATmega 128... Логика написания кода вроде мне ясна.
Мастер:
1) Отправка "Старт"
2) Отправка адреса подчиненного
3) Ожидание подтверждения
4) Прием данных
5) Отправка стоп
Ведомый:
1) Запись своего адреса в TWAR
2) TWCR = 0b01000100
3) Ожидание собственного адреса от мастера
4) Отправка подтверждения
5) Отправка данных
Почему он может не работать??
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Master:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#define RTC_ADDR 0b11111111 // Адрес ведомого, с которым хотим общаться
#define SLA_R RTC_ADDR|0b00000001 // 7 бит адреса ведомого + 1 бит чтения
#define SLA_W RTC_ADDR&0b11111110 // 7 бит адреса ведомого + 1 бит записи
unsigned char I2C_GetStatus(void) // Чтение регистра статуса
{
unsigned char status; //переменная хранения
status = TWSR & 0xF8; //маска
return status;
}
void Master_start(){ // формирование условия "СТРАТ"
TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);
while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)
}
void Master_restart(){ // формирование условия "РЕСТАРТ"
TWCR = (1<<TWINT)|(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);
while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)
}
void Master_stop(){ // Формирование условия "СТОП"
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);
}
void MASTER_SLA_R(){ // Отправка адреса ведомого + 1 бит чтения
TWDR = SLA_R;
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);
while (!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания TWI)
}
void MASTER_OPERATION (){ //
Master_start();
MASTER_SLA_R();
if(I2C_GetStatus()==0x58) //пришли данные от ведущего
{
PORTA=TWDR;//читаем значение
TWCR|=(1<<TWEN);//сбрасываем флаг
}
Master_stop();
}
int main(void){
DDRA=0xFF; //порт на выход
while(1){
MASTER_OPERATION();
}
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Slave:
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
//адрес на который отвечает приемник
#define ME_ADDR 0b11111111
unsigned char I2C_GetStatus(void) // Чтение регистра статуса
{
unsigned char status; //переменная хранения
status = TWSR & 0xF8; //маска
return status;
}
void Slave_ALL_ready(){ // Инициализация ведомого передатчика
TWBR = 0xFF;
TWAR = ME_ADDR;
TWCR = (0<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE); // Подтверждение
}
void UPload(){
if(I2C_GetStatus()==0xA8){ // Если был принят собственный адрес и передано подстверждение
TWDR = 0b10100101;
TWCR = (1<<TWINT)|(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE);
while(!(TWCR & (1<<TWINT))); // Ожидание выполнения (флаг прерывания модуля TWI)
}
}
int main(void){
Slave_ALL_ready();
while(1){
UPload();
_delay_ms(500);
}
}
Не судите строго, я только недавно изучаю МК
Раздел: Школьникам и студентам