I2C в CodeVisionAvr

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

I2C в CodeVisionAvr

Сообщение 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)
Аппаратная модификация типа мультиплексирования - тоже не вариант%)
phenomen
Потрогал лапой паяльник
Сообщения: 310
Зарегистрирован: Пт дек 17, 2010 14:41:25

Re: I2C в CodeVisionAvr

Сообщение phenomen »

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

Re: I2C в CodeVisionAvr

Сообщение grinay »

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

Re: I2C в CodeVisionAvr

Сообщение phenomen »

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

#define _BV(bit) (1 << (bit))

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

Re: I2C в CodeVisionAvr

Сообщение Vov123 »

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

Re: I2C в CodeVisionAvr

Сообщение grinay »

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

Re: I2C в CodeVisionAvr

Сообщение phenomen »

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

Re: I2C в CodeVisionAvr

Сообщение grinay »

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

Re: I2C в CodeVisionAvr

Сообщение phenomen »

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

Re: I2C в CodeVisionAvr

Сообщение clawham »

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

Re: I2C в CodeVisionAvr

Сообщение ibiza11 »

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

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

Re: I2C в CodeVisionAvr

Сообщение 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();
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: I2C в CodeVisionAvr

Сообщение 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);
Ставим плюсы: )
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: I2C в CodeVisionAvr

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

Re: I2C в CodeVisionAvr

Сообщение ibiza11 »

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

Re: I2C в CodeVisionAvr

Сообщение clawham »

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

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

Re: I2C в CodeVisionAvr

Сообщение 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 выводы в даташите позиционируются как "с открытым стоком".
Ставим плюсы: )
clawham
Поставщик валерьянки для Кота
Сообщения: 1957
Зарегистрирован: Пт окт 31, 2008 09:38:55
Откуда: Одесса
Контактная информация:

Re: I2C в CodeVisionAvr

Сообщение 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

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

Re: I2C в CodeVisionAvr

Сообщение ibiza11 »

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

Re: I2C в CodeVisionAvr

Сообщение KpuBoHic »

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

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

         i2c_start();
         i2c_write(unsigned char);
         i2c_read(unsigned char);
         i2c_stop();

Прошу строго не судить.
Заранее спасибо.
Ответить

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