Аппаратный I2C slave на меге

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Аппаратный I2C slave на меге

Сообщение Алексей » 05 апр 2010, 23:26

Пытаюсь подключить мегу 8 к NXT. Компилятор CVAVR. Атмеловский апноут по subj сделан на IAR. Вроде переписал на CVAVR, даже откомпилировалось, но не работает. Решил упростить задачу до безобразия: NXT тупо в цикле каждые 100 мсек шлет устройству '02' один байт. Мега должна при попадании в прерывание зажечь светик на ноге С0.
Все равно не работает :(
Код меги:
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V2.04.6 Evaluation
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 04.04.2010
Author  : Freeware, for evaluation and non-commercial use only
Company :
Comments:


Chip type               : ATmega8L
Program type            : Application
AVR Core Clock frequency: 1,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>   

// Two Wire bus interrupt service routine
interrupt [TWI] void twi_isr(void)
{
  PORTC.0 = 1;

}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x01;

PORTD=0x00;
DDRD=0x00;


// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Two Wire Bus initialization
// Bit Rate: 9,615 kHz
TWBR=0x2C;
// Two Wire Bus Slave Address: 10h
// General Call Recognition: On
TWAR=0x05;
// Generate Acknowledge Pulse: Off
// TWI Interrupt: On
TWCR=0x05;
TWSR=0x00;

// Global enable interrupts
#asm("sei")
 
  PORTC.0 = 1;
  delay_ms(300);
  PORTC.0 = 0;
 
while (1)
      {
      }
}

Код NXT:
Код: Выделить всё
task main {
  SetSensorType(S4, sensorLowSpeed);
  sbyte I2Cmsg[4];
  I2Cmsg[1]=0x02;
  I2Cmsg[2]=0x42;
  I2Cmsg[0]=2;
  while (1) {
     sendI2CMsg(S4, I2Cmsg[0], 1);
     wait1Msec(100);
  }
}

Похоже на решение уравнения с 3 неизвестными. NXT, Mega и соединение между ними.
В коде NXT я более-менее уверен - стандартная работа по I2C. Опыт работы с такими датчиками есть - Mindsensors'овский серво контроллер используется уже несколько месяцев. Но что-бы не рисковать, конкретно этот фрагмент скопировали из блога одного из разработчиков RobotC.
Соединение проверяли несколько раз - все подключено правильно. Подтягивающие резисторы 82К стоят.
Осцилографа нету, пытался проверить уровни напряжений тестером. До начала передачи на SCL - 2.35, на SDA - 3.26. После запуска проги на NXT на SCL стало 3.16, на SDA - 3.20.
Посмотрите пож. код Меги - должен он работать? :sorry:
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

Re: Аппаратный I2C slave на меге

Сообщение avr123.nm.ru » 05 апр 2010, 23:36

Если будет настроение сделайте проектик в PROTEUS и шлите чтонибудь аппаратным i2c twi второй меги в схеме.

Подтяжка надеюсь есть на линиях ?
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Аппаратный I2C slave на меге

Сообщение ALHIMIK » 05 апр 2010, 23:43

подтяжка в 82К не слабовата ?
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

Re: Аппаратный I2C slave на меге

Сообщение Алексей » 06 апр 2010, 00:05

Ну такую лего рекомендует в своем "LEGO MINDSTORMS NXT Hardware Developer Kit". В инете видел описания нескольких таких проектов - у всех такая стоит. Вот тут у парня были проблемы, пока он не выпаял из ардуины "лишние" резюки.http://mightor.wordpress.com/2009/08/04/connecting-the-nxt-to-an-arduinomega/

Добавлено спустя 16 минут 18 секунд:
avr123.nm.ru писал(а):Если будет настроение сделайте проектик в PROTEUS и шлите чтонибудь аппаратным i2c twi второй меги в схеме.

Подтяжка надеюсь есть на линиях ?

Proteus еще не освоил (к сожалению).

Стоят. 82К.

Вроде схема смешная, но на всякий случай, вот:
IMGP0102.JPG

Разъем NXT:
1 и 2- аналоговое питание и земля(в i2c датчиках не используются)
3 - GND
4 - VCC
5 - SCL
6 - SDA
Так что с программой? В таком виде должна она работать, или нет?
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

Re: Аппаратный I2C slave на меге

Сообщение avr123.nm.ru » 06 апр 2010, 01:20

Рекомендуют 4.7 кОм
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Аппаратный I2C slave на меге

Сообщение Michael_K » 06 апр 2010, 01:53

Не слушайте про подтяжку - в NXT так сделано.
(последовательно в линии воткнуты защитные резюки, поэтому и подтяжки высокоомные и скорости низкие)
NXT рекомендуют 82к.

Проблема, уверен, в АВР-ке.
Бит-рейт можно поднять - на скорость обмена для слэйва он все равно не влияет,
но ограничения есть - частота на слейве должна быть выше, чем битрейт*16 - у вас все впритык.

Вообще I2C-слейва сделать на АВР-ке - это геморрой, а сделать это на прерывании - это _большой_ геморрой :wink:
Посмотрите хотя бы в аппноуте AVR311 на фигу 7 - это ж убицца :shock: :oops:

Почему не работает - не знаю.
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Аппаратный I2C slave на меге

Сообщение Алексей » 06 апр 2010, 02:23

С номиналами подтяжек сомнений нет.
Частоты вроде тоже хватает. У NXT lowspeed где-то в районе 10К. Т.е. у меня частота проца в 100 раз больше битрейта, а атмел говорит что мин. нужно в 16. Так что тут вроде можно не волноваться. На всякий сл. завтра попробую поставить кварц.

Апноут смотрел. Внимательно. Уже неделю об него бьюсь :(
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

Re: Аппаратный I2C slave на меге

Сообщение avr123.nm.ru » 06 апр 2010, 02:59

PROTEUS может значительно сократить время.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва

Re: Аппаратный I2C slave на меге

Сообщение Алексей » 06 апр 2010, 12:12

avr123.nm.ru писал(а):PROTEUS может значительно сократить время.

Не очень понимаю, каким образом в данном случае. Судя по всему сигналы на ноги МК приходят. Программа - проще уже не придумаешь, но тем не менее прерывание не возникает. Если не сложно, ответьте пож. на основной вопрос топика: "Все ли правильно в программе или я чего-то в ней не учел?" А если все правильно, то в каком направлении копать дальше, поскольку у меня идеи иссякли. :sorry:
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

Re: Аппаратный I2C slave на меге

Сообщение =DeaD= » 06 апр 2010, 12:14

А точно I2C поступает на вход МК? Может правда в протеусе запустить пару МК один со своей программкой SLAVE, а второй типа мастер и там глянуть что и как?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Аппаратный I2C slave на меге

Сообщение ALHIMIK » 06 апр 2010, 20:27

а нхт нужный адрес использует ?
Аватара пользователя
ALHIMIK
 
Сообщения: 997
Зарегистрирован: 05 окт 2008, 14:41
Откуда: СПб
прог. языки: C,Python

Re: Аппаратный I2C slave на меге

Сообщение Scorpio » 06 апр 2010, 23:31

I2Cmsg[1]=0x10; и должно заработать
Последний раз редактировалось Scorpio 06 апр 2010, 23:46, всего редактировалось 1 раз.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Аппаратный I2C slave на меге

Сообщение Алексей » 06 апр 2010, 23:53

Поставил кварц 8Мгц. Без изменений.

ALHIMIK писал(а):а нхт нужный адрес использует ?

Да. 02:
I2Cmsg[1]=0x02;
В меге:
TWAR=0x05;

В комментарии остался старый - 10h. Реально в регистр адреса пишется 2, сдвигается на 1 бит влево и нулевым битом выставляется "General Call Recognition: On". Т.о. получаем 5.

Добавлено спустя 6 минут 37 секунд:
Scorpio писал(а):I2Cmsg[1]=0x10; и должно заработать

Решил проверить, хотя и так было ясно, что дело не в этом. К сож., чуда не случилось.
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

Re: Аппаратный I2C slave на меге

Сообщение Scorpio » 07 апр 2010, 00:12

Вот тут есть кое-что по теме.
Аватара пользователя
Scorpio
 
Сообщения: 2681
Зарегистрирован: 30 сен 2008, 18:49
Откуда: Где-то в Латинской Америке

Re: Аппаратный I2C slave на меге

Сообщение Алексей » 07 апр 2010, 00:23

Спс. Я видел. Но там так аппаратный TWI и не запустился.
Алексей
 
Сообщения: 152
Зарегистрирован: 12 дек 2009, 23:44
Откуда: Киев
ФИО: Алексей Диомидов

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 28