roboforum.ru

Технический форум по робототехнике.

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

Аппаратный 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:

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

avr123.nm.ru » 05 апр 2010, 23:36

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

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

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

ALHIMIK » 05 апр 2010, 23:43

подтяжка в 82К не слабовата ?

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
Так что с программой? В таком виде должна она работать, или нет?

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

avr123.nm.ru » 06 апр 2010, 01:20

Рекомендуют 4.7 кОм

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

Michael_K » 06 апр 2010, 01:53

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

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

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

Почему не работает - не знаю.

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

Алексей » 06 апр 2010, 02:23

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

Апноут смотрел. Внимательно. Уже неделю об него бьюсь :(

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

avr123.nm.ru » 06 апр 2010, 02:59

PROTEUS может значительно сократить время.

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

Алексей » 06 апр 2010, 12:12

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

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

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

=DeaD= » 06 апр 2010, 12:14

А точно I2C поступает на вход МК? Может правда в протеусе запустить пару МК один со своей программкой SLAVE, а второй типа мастер и там глянуть что и как?

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

ALHIMIK » 06 апр 2010, 20:27

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

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

Scorpio » 06 апр 2010, 23:31

I2Cmsg[1]=0x10; и должно заработать
Последний раз редактировалось Scorpio 06 апр 2010, 23:46, всего редактировалось 1 раз.

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; и должно заработать

Решил проверить, хотя и так было ясно, что дело не в этом. К сож., чуда не случилось.

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

Scorpio » 07 апр 2010, 00:12

Вот тут есть кое-что по теме.

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

Алексей » 07 апр 2010, 00:23

Спс. Я видел. Но там так аппаратный TWI и не запустился.


Rambler\'s Top100 Mail.ru counter