I2C в CodeVisionAvr

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Сообщение grinay »

Такая проблема возникла.
Есть две ацпшки mcp3421 - протокол обмена у них i2c.
Проблема в том что у обоих заводом запрограммирован одинаковый адрес.И запрограммировать другой адрес могут тоже только они- под заказ.
Естественно оба чипа я повесил на разные ноги. Но проблема как опрашивать их поочереди с помоью стандартной библиотеки i2c.

Настройки i2c такие
#asm
.equ __i2c_port=0x12 //PORTD
.equ __sda_bit=6
.equ __scl_bit=7
#endasm
второй чип весит на 4,5 бите(ноге).

Надо сделать чтото вроде
bit ADC=0;

if(ADC==0){
.equ __sda_bit=6
.equ __scl_bit=7
}else {

.equ __sda_bit=4
.equ __scl_bit=5
}

Но такая конструкция работать не будет и компилятор сразу же начнет ругатся.
Возможно ли решить проблему стандартными средствами? или же все таки придется писать обмен данными с нуля(не хочется тратить время- только поэтому и выбрал CVA)
Аппаратная модификация типа мультиплексирования - тоже не вариант%)
Реклама
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Сообщение phenomen »

Посмотри здесь. Думаю, правка кода много времени не отберет.
Реклама
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Сообщение grinay »

нету такого _BV в CVA.
К тому же это опять же реализация протокола с нуля. Эт я и сам могу сделать. Просто интересен тот файкт возможно ли сделать это средствами самой ide.
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Сообщение phenomen »

Код: Выделить всё

#define _BV(bit) (1 << (bit))
По поводу вопроса - нет. Можно посадить на одну линию, а подтяжку для линии SCL сделать отдельную (нужен первый - включили подтяжку первого, нужен второй - включили подтяжку второго) :)) но
grinay писал(а):Аппаратная модификация типа мультиплексирования - тоже не вариант
Последний раз редактировалось phenomen Вт дек 13, 2011 15:54:40, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Сообщение Vov123 »

один повесь на TWI,а другой на I2C.
Реклама
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Сообщение grinay »

Так лады. Все это сказаное выше я и так знаю:) Меня интересует именно эта либо и имено переопределение битов scl и sda/- короче не возможно сделать . Вывод пишу свою реализацию протокола обмена..
Реклама
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Сообщение phenomen »

Вариант! :idea:
Недодумался сам :facepalm:
Открыл глаза
Сообщения: 44
Зарегистрирован: Пн июл 06, 2009 07:42:07

Сообщение grinay »

До чего не додумался? Вопрос мой прочитай внимательно. Я сказал сразу что реализацию обмена по протоколу я и сам могу написать. Но нужно именно использовать библиотеку i2c стандартную от CVA
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Сообщение phenomen »

Vov123 писал(а):один повесь на TWI,а другой на I2C.
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

Вродебы CD4052 должны решить эут проблему да ещё и + 4 порта i2c :)
или например две CD4051
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

а можете привести код, генерируемый CVA для протокола i2c? он использует программную реализацию или аппаратную?
я в нем никогда не работал, поэтому не знаю. Если генерируется библиотека, то почему бы не доработать ее напильником, и используя одни и те же подпрограммы (чтение, запись) реализовать на разных ногах протокол.

еще подумал насчет параллельного опроса и записи (дублированием сигналов на двух ногах SCL/SDA), но забыл, что еще нужно ждать ACK. В принципе может получиться) Ведь АЦПешки одинаковые и реагировать должны одинаково. С надежностью конечно в этом случае хуже)
Ставим плюсы: )
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Сообщение phenomen »

Реализация программная.
Включение I2C:

Код: Выделить всё

#asm
   .equ __i2c_port=0x12 //PORTD
   .equ __sda_bit=6
   .equ __scl_bit=7
#endasm 

#include <i2c.h>
Функции для использования:

Код: Выделить всё

i2c_start();
i2c_write(unsigned char);
i2c_read(unsigned char);
i2c_stop();
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

понятно, а i2c.c (или i2c.s), как я полагаю уже есть где-то в недрах CVA? или он добавляется в workspace и так же проходит компиляцию?
если так, то можно этот файлик поправить для себя, добавив в параметры функции переменную char, и проверку этой переменной в самом начале функции.
функцию изменить так:

Код: Выделить всё

void i2c_... (a, data)
{
   case (a)
      ch1:
      ch2:
.....
}
определить так:

Код: Выделить всё

enum{ch1,ch2};
#define __i2c_port_1 = PORTD
#define __sda_bit_1 = 0
#define __scl_bit_1 = 1

#define __i2c_port_2 = PORTD
#define __sda_bit_2 = 2
#define __scl_bit_2 = 3
(ну или через .equ)
вызывать так:

Код: Выделить всё

i2c_start(ch1);
i2c_start(ch2);
i2c_write(ch1, unsigned char);
i2c_write(ch2, unsigned char);
i2c_read(ch1, unsigned char);
i2c_read(ch2, unsigned char);
i2c_stop(ch1);
i2c_stop(ch2);
Ставим плюсы: )
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

ребят..ну что за детский сад? тяжело скачать кодевижн?

вот заголовочный файл

Код: Выделить всё

/*
  CodeVisionAVR C Compiler
  (C) 1998-2000 Pavel Haiduc, HP InfoTech S.R.L.

  Prototypes for I2C bus master functions

  BEFORE #include -ING THIS FILE YOU
  MUST DECLARE THE I/O ADDRESS OF THE
  DATA REGISTER OF THE PORT AT WHICH
  THE I2C BUS IS CONNECTED AND
  THE DATA BITS USED FOR SDA & SCL

  EXAMPLE FOR PORTB:

    #asm
        .equ __i2c_port=0x18
        .equ __sda_bit=3
        .equ __scl_bit=4
    #endasm
    #include <i2c.h>
*/

#ifndef _I2C_INCLUDED_
#define _I2C_INCLUDED_

#pragma used+
void i2c_init(void);
unsigned char i2c_start(void);
void i2c_stop(void);
unsigned char i2c_read(unsigned char ack);
unsigned char i2c_write(unsigned char data);
#pragma used-

#endif

из которого видно что это сугубо внутренняя реализация библиотеки и что он будет генерить знает только он сам

хотя вот например тини 13 и i2c
вот какие функции оно генерит

Код: Выделить всё

_i2c_init:
	cbi  __i2c_port,__scl_bit
	cbi  __i2c_port,__sda_bit
	sbi  __i2c_dir,__scl_bit
	cbi  __i2c_dir,__sda_bit
	rjmp __i2c_delay2
_i2c_start:
	cbi  __i2c_dir,__sda_bit
	cbi  __i2c_dir,__scl_bit
	clr  r30
	nop
	sbis __i2c_pin,__sda_bit
	ret
	sbis __i2c_pin,__scl_bit
	ret
	rcall __i2c_delay1
	sbi  __i2c_dir,__sda_bit
	rcall __i2c_delay1
	sbi  __i2c_dir,__scl_bit
	ldi  r30,1
__i2c_delay1:
	ldi  r22,13
	rjmp __i2c_delay2l
_i2c_stop:
	sbi  __i2c_dir,__sda_bit
	sbi  __i2c_dir,__scl_bit
	rcall __i2c_delay2
	cbi  __i2c_dir,__scl_bit
	rcall __i2c_delay1
	cbi  __i2c_dir,__sda_bit
__i2c_delay2:
	ldi  r22,27
__i2c_delay2l:
	dec  r22
	brne __i2c_delay2l
	ret
_i2c_read:
	ldi  r23,8
__i2c_read0:
	cbi  __i2c_dir,__scl_bit
	rcall __i2c_delay1
__i2c_read3:
	sbis __i2c_pin,__scl_bit
	rjmp __i2c_read3
	rcall __i2c_delay1
	clc
	sbic __i2c_pin,__sda_bit
	sec
	sbi  __i2c_dir,__scl_bit
	rcall __i2c_delay2
	rol  r30
	dec  r23
	brne __i2c_read0
	ld   r23,y+
	tst  r23
	brne __i2c_read1
	cbi  __i2c_dir,__sda_bit
	rjmp __i2c_read2
__i2c_read1:
	sbi  __i2c_dir,__sda_bit
__i2c_read2:
	rcall __i2c_delay1
	cbi  __i2c_dir,__scl_bit
	rcall __i2c_delay2
	sbi  __i2c_dir,__scl_bit
	rcall __i2c_delay1
	cbi  __i2c_dir,__sda_bit
	rjmp __i2c_delay1

_i2c_write:
	ld   r30,y+
	ldi  r23,8
__i2c_write0:
	lsl  r30
	brcc __i2c_write1
	cbi  __i2c_dir,__sda_bit
	rjmp __i2c_write2
__i2c_write1:
	sbi  __i2c_dir,__sda_bit
__i2c_write2:
	rcall __i2c_delay2
	cbi  __i2c_dir,__scl_bit
	rcall __i2c_delay1
__i2c_write3:
	sbis __i2c_pin,__scl_bit
	rjmp __i2c_write3
	rcall __i2c_delay1
	sbi  __i2c_dir,__scl_bit
	dec  r23
	brne __i2c_write0
	cbi  __i2c_dir,__sda_bit
	rcall __i2c_delay1
	cbi  __i2c_dir,__scl_bit
	rcall __i2c_delay2
	ldi  r30,1
	sbic __i2c_pin,__sda_bit
	clr  r30
	sbi  __i2c_dir,__scl_bit
	rjmp __i2c_delay1

отсюда можно сделать вывод что как-то таки это можно было бы и обозвать переменной...типа задекларировать какой-то чар в определенный регистр ...и при обращении через этот чар указывать номер порта или битов....Но помоему операнд sbi вторым параметром принимает номер бита а не регистр откуда нужно этот номер прочитать....следовательно....это не сделать....
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

выход всегда есть, но проще самому написать, чем ассемблерный листинг сейчас молотить.
как вариант (я уже предлагал) продублировать команды обращения к портам для каждого порта. тогда функция будет ногодрыгать на двух/четырех ножках одновременно.
я бы не парился и написал свой. это не так долго, как кажется.
Ставим плюсы: )
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

можно ещё изгольнуться - питать микру через резюк 100 омм и на время "выключения" ненужную садить любым полевиком-биполярником на землю - убил питание - микруха не работает...хотя тут надо проверить есть ли диоды по входам SDA SCL

в любом случае можно либо подсматривая в листинг написать свою функцию общения...либо заюзать внешние комутаторы...прикольная конечно АЦП но...это ж капец...нельзя никак поменять адрес....бред?
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

выдержка из даташита:
5.3.1
I2C DEVICE ADDRESSING
The first byte after the START bit is always the address
byte of the device, which includes the device code
(4 bits), address bits (3 bits), and R/W bit. The device
code of the MCP3421 is 1101, which is programmed at
the factory. The device code is followed by three
address bits (A2, A1, A0) which are also programmed
at the factory. The three address bits allow up to eight
MCP3421 devices on the same data bus line.
получается, что все же адреса могут отличаться. Надо эти АЦП подключить на одни линии и при инициализации программы опросить 8 разных адресов ожидая ответа. Так определить адреса и записать их в EEPROM. если ТС это уже сделал, пусть уточнит, действительно ли адреса совпадают?

И кстати идея с коммутацией питания тоже может быть успешной в реализации, т.к. SCL и SDA выводы в даташите позиционируются как "с открытым стоком".
Ставим плюсы: )
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса

Сообщение clawham »

А почему никто не дочитал даташит до конца?

полное название микросхемы
к примеру

MCP3421A0T-E/OT

и тут же дана расшифровка

Address Options: XX A2 A1 A0
A0 * = 0 0 0
A1 = 0 0 1
A2 = 0 1 0
A3 = 0 1 1
A4 = 1 0 0
A5 = 1 0 1
A6 = 1 1 0
A7 = 1 1 1

получапется адреса - это разные микросхемы
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

clawham писал(а):А почему никто не дочитал даташит до конца?
и тут же дана расшифровка
получапется адреса - это разные микросхемы
:))) :))) :))) ну я не дочитал, потому как нашел интересующую инфу, отписался и решил, что проблема решена)))
тогда откуда ТС взял вот это???
grinay писал(а):Проблема в том что у обоих заводом запрограммирован одинаковый адрес.И запрограммировать другой адрес могут тоже только они- под заказ.
верно говорят в сервисных центрах (можно провести аналогию с форумом, та же помощь) "Клиент всегда пи*дит"
ТС изначально ввел в заблуждение, а мы сразу поверили.
Ставим плюсы: )
Родился
Сообщения: 3
Зарегистрирован: Пн янв 09, 2012 17:26:46

Сообщение KpuBoHic »

Здраствуйте. Я новичок-любитель в МП-програмировании и пока что еще учусь, поэтому нужна помощь профи!!
Задача состоит в подключении АЦП (MCP3421) к ATMEGA8 и через I2C правильно считать информацию с АЦП. Но пока что не получаеться правильно отладить считывание данных.
Изображение
Вот есть функции для использования I2C но не понятно что за переменные должны быть заместь unsigned char, на что и ругаеться компилятор (CodeVisonAVR). Подскажите как правильно это сделать или где это можно узнать.

Код: Выделить всё

         i2c_start();
         i2c_write(unsigned char);
         i2c_read(unsigned char);
         i2c_stop();
Прошу строго не судить.
Заранее спасибо.
Ответить

Вернуться в «AVR»