Перейти к содержанию

Atmega 128 / I2C / Ведомый - Передатчик, Мастер - Приемник


Рекомендуемые сообщения

Здравствуйте.. Нужно, чтобы ведомый отправлял мастеру 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);

}

}

Не судите строго, я только недавно изучаю МК

post-174858-0-90302100-1418549408_thumb.png

Изменено пользователем Cneltyn
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Первое, что бросается в глаза, это отсутствие инициализации мастера.

Вы про скорость?? Я тоже думал об этом, но данные передает ведомый...

Получается мастер принимает с той же частотой, что ведомый отдает

TWBR есть в инициализации ведомого

Изменено пользователем Cneltyn
Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вы про скорость?? Я тоже думал об этом, но данные передает ведомый...

Ведомый без запроса мастера пискнуть не имеет права. Сначала мастер должен передать запрос на прием данных, а как он его передаст, если не задана скорость?

Ссылка на комментарий
Поделиться на другие сайты

Вы про скорость?? Я тоже думал об этом, но данные передает ведомый...

Ведомый без запроса мастера пискнуть не имеет права. Сначала мастер должен передать запрос на прием данных, а как он его передаст, если не задана скорость?

Инициализация мастера:

void I2C_Initial()

{

TWBR=0xFF;//скорость передачи

}

.

.

.

int main(void){

I2C_Initial();

DDRA=0xFF;//порт на выход

while(1){

.

.

.

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Инициализация ведомого:

void Slave_ALL_ready(){ // Инициализация ведомого передатчика

TWAR = ME_ADDR;

TWCR = (0<<TWINT)|(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|(0<<TWWC)|(1<<TWEN)|(0<<TWIE); // Отправка подтверждения

}

.

.

.

int main(void){

Slave_ALL_ready();

while(1){

UPload();

_delay_ms(500);

}

}

Исправил. Не помогло...

Осциллограф молчит, это получается что даже старт не отправляется

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...