Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 18.03.2009, 12:39   #1
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию Mega 8 + TWI (I2C) Slave Помогите.

Добрый день. Конечно тема избитая, но все-же помогите разобраться.
Иметься некое мастер –устройство I2C (а именно LEGO MINDSTORMS NXT)
Подключаю Мегу8 (аппаратный TWI Slave) в итоге получаю что-то не очень понятное.
Может я что-то напутал в коде.
Код меги.
######################################
#include ‹mega8.h›
#include ‹lcd.h›
#include ‹delay.h›
unsigned char w,r;

interrupt [TWI] void twi_isr(void) // 2 Wire bus interrupt service routine
{

if (TWSR == 0xA{TWDR=r;};
TWCR=0xC5;//в прерывании устанавливаются биты 7(TWINT),6(TWEA),2(TWEN) и 0(TWIE)-иначе не работает
w=TWDR;
//w=w/2;

}
#asm
.equ __lcd_port=0x12 ;PORTD // Alphanumeric LCD Module functions
#endasm

void main(void)
{
r=0;
w=0;
ACSR=0x80;//аналоговый компаратор ВЫКЛ
TWBR=0x0C;// Bit Rate: 100,000 kHz
TWAR=0x64;//любой адрес,который хочется,но нулевой бит отвечает за поведение при общем вызове(0-откл;1-вкл)
TWCR=0x45;//включаем для режима работы "ведомый приёмник" 0(TWIE), 2(TWEN) и 7(TWEA) биты

//lcd_init(16); // LCD module initialization
#asm("sei") // Global enable interrupts

while (1)
{
r=w+5;
};
}
################################################## ###

Данный код не совсем мой… Нашел где-то тут.

В итоге вот что получаю:
Отправляю с мастера ##адрес##дата1(число 20 )##дата2(число 33) ##
Полуаю на мастер ответ ##адрес##дата1(число 40 +5 )##

Вопрос почему я получил Удвоенную Дату1+5. почему именно Удвоенная?
Вопрос почему я НЕ получил в мегу Дату2 (число 33). почему?

Просьба помочь …
Реклама:
west1111 вне форума  
Непрочитано 18.03.2009, 13:26   #2
Vov123
Вид на жительство
 
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
Vov123 на пути к лучшему
По умолчанию

Да,этот код не ваш,этот код мой,давненько это было.Ну,попробуйте так:
interrupt [TWI] void twi_isr(void)
{
TWCR=0xC5;
}

void main(void)
{
unsigned char a;
ACSR=0x80;
TWBR=0x0C;
TWAR=0x64;//назначенный адрес ведомого
TWCR=0x45;// режим-"ведомый приёмник"

#asm("sei") // Global enable interrupts

while (1)
{
a=TWDR;
};
}
Vov123 вне форума  
Непрочитано 18.03.2009, 14:02   #3
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию

Прежде всего Спасибо, за Ваш ответ и за Ваш код.
Вы повторили Ваш старый код, он отлично работает. (ну по крайней мере на мастере ошибок нету (пишет что «отправлено» и «получено», а в меге8 я не знаю т.к. к ней ничего не подключал даже элементарных свтодиодиков).
Я хотел немного усложнить задачу. Т.е. принять некоторое число, что-то сделать с ним , и отправить обратно мастеру. Т.е. Slave (мега должна работать как Приемник и Передатчик.
Вот поэтому я в прерывании и воткнул if (TWSR == 0xA{TWDR=r;};
Т.е я проверяю отправил ли Мастер запрос у Слайва на прием данных …. Если есть › то в TWDR пишем некоторое значение › присваиваем TWINT единицу и едем дальше….
И вот я потерялся… в какой момент Контроллер прерывается ? в момент получения «своего» адреса от мастера… ??? значит я воде правильно сделал…
west1111 вне форума  
Непрочитано 18.03.2009, 14:17   #4
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию

Я наверное немного всех запутал. (в первую очередь себя)
Нужно как-то менять у меги (slave) с приемника на передатчик и обратно. вот только я не могу понять как мне это сделать.
west1111 вне форума  
Непрочитано 18.03.2009, 14:37   #5
Vov123
Вид на жительство
 
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
Vov123 на пути к лучшему
По умолчанию

Посмотрите разницу в коде у мастер
//=============ПЕРЕДАЧА==============
Start;
while(Execute);

TWDR=0x70;//отсылаем пакет-адрес и передача
Send;
while(Execute);

TWDR=a;
Send;
while(Execute);

Stop;
delay_us(20);
goto m1;

//============ПРИЁМ=====================

Start;
while(Execute);

TWDR=0x71;//отсылаем пакет-адрес и приём
Send;
while(Execute);


Send;
while(Execute);
b=TWDR;

Stop;
delay_us(20);

А у slave отправка просто,к примеру:
TWDR=b;
и делайте в программе всё чего хотите.
А в обработчике прерывания оставте только
TWCR=0xC5;
Vov123 вне форума  
Непрочитано 18.03.2009, 15:05   #6
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию

Спасибо, вечером попробую.
В любом случае, отпишусь.
west1111 вне форума  
Непрочитано 18.03.2009, 23:30   #7
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию

Ну вот что у меня получилось . )))

Я попробовал последовать Вашему совету , но даже в протеусе выдавала с мелкими глюками , (проскакивали какие-то промежуточные цифры от TWDR ) . Там мне пришлось поставить пузу delay_us(7000); сразу после строчки TWCR=0xC5; //в прерывании ……… тогда вроде ничего не проскакивало.
и в «железе» были те-же глюки… ( и еще с учетом того что я только примерно знаю скорость и прочие характеристики шины-I2C работающей в LEGO – я уверен что там тоже много ошибок. т.к. шина там не 100% I2C а написана кем-то программно…. )
ну после некоторых «танцев с бубном» получил вот такое более менее работающее чудо…


#include ‹mega8.h›
#include ‹delay.h›

unsigned char w,t;

interrupt [TWI] void twi_isr(void) // 2 Wire bus interrupt service routine
{

if (TWSR == 0xA{TWDR=t; TWCR=0xC5; while (TWSR == 0xC0){};} // ждем пока не получим подтверждение передачи

TWCR=0xC5; //в прерывании устанавливаются биты 7(TWINT),6(TWEA),2(TWEN) и 0(TWIE)-иначе не работает
while (TWSR == 0x80){w=TWDR;} // читаем TWDR только после получения подтверждения приема иначе читает весь мусор из TWDR

}

void main(void)
{
w=0;
t=0;
ACSR=0x80;//аналоговый компаратор ВЫКЛ

TWBR=0x0C;// Bit Rate: 100,000 kHz
TWAR=0x64;//любой адрес,который хочется,но нулевой бит отвечает за поведение при общем вызове(0-откл;1-вкл)
TWCR=0x45;//включаем для режима работы "ведомый приёмник" 0(TWIE), 2(TWEN) и 7(TWEA) биты

#asm("sei") // Global enable interrupts

while (1)
{
t=w+1; // ну это так вроде что-то делаем
};
}

Спасибо… Ваш код помог мне разобраться…
west1111 вне форума  
Непрочитано 19.03.2009, 00:45   #8
Vov123
Вид на жительство
 
Регистрация: 03.06.2007
Сообщений: 368
Сказал спасибо: 3
Сказали Спасибо 59 раз(а) в 52 сообщении(ях)
Vov123 на пути к лучшему
По умолчанию

https://kazus.ru/forum/topics/f_1100...hlight=#110097
Vov123 вне форума  
Непрочитано 03.06.2009, 03:05   #9
_OXY_GEN_
Частый гость
 
Регистрация: 02.06.2009
Сообщений: 19
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
_OXY_GEN_ на пути к лучшему
По умолчанию

Уважаемые!Помогите пожалуйста!
Требуется создать сеть МК которые осуществляют обмен данными между друг другом по TWI!
Вопрос вот в чем стоит: можно ли чтобы slave устройсво стало master(и наоборот), после того как slave принял от master даные, перешел в режим мастера и передал их другому slave устройству!И как это все реализовать!
_OXY_GEN_ вне форума  
Непрочитано 03.06.2009, 10:27   #10
west1111
Частый гость
 
Регистрация: 19.01.2007
Сообщений: 13
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
west1111 на пути к лучшему
По умолчанию

Боюсь ошибиться, но с мастера на слейв, переключить не удастся, (только через ресет наверное), могу предложить иначе.
Допустим имееться один мастер и слейв1, слейв2. мастер › на слейв1 затем слейв1 › мастеру информацию+адрес слайв2, а потом мастер передает инфу, уже по адресу. то-есть мастер будет как буфер.
west1111 вне форума  
Закрытая тема

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
pic18f452 i2c slave int9 PIC 13 11.09.2013 00:02
Величина подтягивающих резизторов TWI(I2C) на 3.3 В svad0 Микроконтроллеры, АЦП, память и т.д 7 02.03.2009 14:34
TWI as master и USI as slave duritskiy Микроконтроллеры, АЦП, память и т.д 20 06.09.2007 19:18
МК в I2C как SLAVE CERGEI1982 Микроконтроллеры, АЦП, память и т.д 11 27.08.2007 09:23
ATMega16L TWI Master + ATTiny26L USI SLAVE duritskiy Микроконтроллеры, АЦП, память и т.д 1 21.11.2006 15:11


Часовой пояс GMT +4, время: 22:24.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot