I2C в CodeVisionAvr
I2C в CodeVisionAvr
Такая проблема возникла.
Есть две ацпшки 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)
Аппаратная модификация типа мультиплексирования - тоже не вариант%)
Есть две ацпшки 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)
Аппаратная модификация типа мультиплексирования - тоже не вариант%)
Re: I2C в CodeVisionAvr
Посмотри здесь. Думаю, правка кода много времени не отберет.
Re: I2C в CodeVisionAvr
нету такого _BV в CVA.
К тому же это опять же реализация протокола с нуля. Эт я и сам могу сделать. Просто интересен тот файкт возможно ли сделать это средствами самой ide.
К тому же это опять же реализация протокола с нуля. Эт я и сам могу сделать. Просто интересен тот файкт возможно ли сделать это средствами самой ide.
Re: I2C в CodeVisionAvr
Код: Выделить всё
#define _BV(bit) (1 << (bit))По поводу вопроса - нет. Можно посадить на одну линию, а подтяжку для линии SCL сделать отдельную (нужен первый - включили подтяжку первого, нужен второй - включили подтяжку второго)
grinay писал(а):Аппаратная модификация типа мультиплексирования - тоже не вариант
Последний раз редактировалось phenomen Вт дек 13, 2011 15:54:40, всего редактировалось 1 раз.
Re: I2C в CodeVisionAvr
один повесь на TWI,а другой на I2C.
Re: I2C в CodeVisionAvr
Так лады. Все это сказаное выше я и так знаю:) Меня интересует именно эта либо и имено переопределение битов scl и sda/- короче не возможно сделать . Вывод пишу свою реализацию протокола обмена..
Re: I2C в CodeVisionAvr
Вариант!
Недодумался сам
Недодумался сам

Re: I2C в CodeVisionAvr
До чего не додумался? Вопрос мой прочитай внимательно. Я сказал сразу что реализацию обмена по протоколу я и сам могу написать. Но нужно именно использовать библиотеку i2c стандартную от CVA
Re: I2C в CodeVisionAvr
Vov123 писал(а):один повесь на TWI,а другой на I2C.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: I2C в CodeVisionAvr
Вродебы CD4052 должны решить эут проблему да ещё и + 4 порта i2c 
или например две CD4051
или например две CD4051
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: I2C в CodeVisionAvr
а можете привести код, генерируемый CVA для протокола i2c? он использует программную реализацию или аппаратную?
я в нем никогда не работал, поэтому не знаю. Если генерируется библиотека, то почему бы не доработать ее напильником, и используя одни и те же подпрограммы (чтение, запись) реализовать на разных ногах протокол.
еще подумал насчет параллельного опроса и записи (дублированием сигналов на двух ногах SCL/SDA), но забыл, что еще нужно ждать ACK. В принципе может получиться) Ведь АЦПешки одинаковые и реагировать должны одинаково. С надежностью конечно в этом случае хуже)
я в нем никогда не работал, поэтому не знаю. Если генерируется библиотека, то почему бы не доработать ее напильником, и используя одни и те же подпрограммы (чтение, запись) реализовать на разных ногах протокол.
еще подумал насчет параллельного опроса и записи (дублированием сигналов на двух ногах SCL/SDA), но забыл, что еще нужно ждать ACK. В принципе может получиться) Ведь АЦПешки одинаковые и реагировать должны одинаково. С надежностью конечно в этом случае хуже)
Ставим плюсы: )
Re: I2C в CodeVisionAvr
Реализация программная.
Включение I2C:
Функции для использования:
Включение 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
понятно, а i2c.c (или i2c.s), как я полагаю уже есть где-то в недрах CVA? или он добавляется в workspace и так же проходит компиляцию?
если так, то можно этот файлик поправить для себя, добавив в параметры функции переменную char, и проверку этой переменной в самом начале функции.
функцию изменить так:
определить так:(ну или через .equ)
вызывать так:
если так, то можно этот файлик поправить для себя, добавив в параметры функции переменную 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вызывать так:
Код: Выделить всё
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
ребят..ну что за детский сад? тяжело скачать кодевижн?
вот заголовочный файл
из которого видно что это сугубо внутренняя реализация библиотеки и что он будет генерить знает только он сам
хотя вот например тини 13 и i2c
вот какие функции оно генерит
отсюда можно сделать вывод что как-то таки это можно было бы и обозвать переменной...типа задекларировать какой-то чар в определенный регистр ...и при обращении через этот чар указывать номер порта или битов....Но помоему операнд sbi вторым параметром принимает номер бита а не регистр откуда нужно этот номер прочитать....следовательно....это не сделать....
вот заголовочный файл
Код: Выделить всё
/*
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
выход всегда есть, но проще самому написать, чем ассемблерный листинг сейчас молотить.
как вариант (я уже предлагал) продублировать команды обращения к портам для каждого порта. тогда функция будет ногодрыгать на двух/четырех ножках одновременно.
я бы не парился и написал свой. это не так долго, как кажется.
как вариант (я уже предлагал) продублировать команды обращения к портам для каждого порта. тогда функция будет ногодрыгать на двух/четырех ножках одновременно.
я бы не парился и написал свой. это не так долго, как кажется.
Ставим плюсы: )
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: I2C в CodeVisionAvr
можно ещё изгольнуться - питать микру через резюк 100 омм и на время "выключения" ненужную садить любым полевиком-биполярником на землю - убил питание - микруха не работает...хотя тут надо проверить есть ли диоды по входам SDA SCL
в любом случае можно либо подсматривая в листинг написать свою функцию общения...либо заюзать внешние комутаторы...прикольная конечно АЦП но...это ж капец...нельзя никак поменять адрес....бред?
в любом случае можно либо подсматривая в листинг написать свою функцию общения...либо заюзать внешние комутаторы...прикольная конечно АЦП но...это ж капец...нельзя никак поменять адрес....бред?
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: I2C в CodeVisionAvr
выдержка из даташита:
И кстати идея с коммутацией питания тоже может быть успешной в реализации, т.к. SCL и SDA выводы в даташите позиционируются как "с открытым стоком".
получается, что все же адреса могут отличаться. Надо эти АЦП подключить на одни линии и при инициализации программы опросить 8 разных адресов ожидая ответа. Так определить адреса и записать их в EEPROM. если ТС это уже сделал, пусть уточнит, действительно ли адреса совпадают?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.
И кстати идея с коммутацией питания тоже может быть успешной в реализации, т.к. SCL и SDA выводы в даташите позиционируются как "с открытым стоком".
Ставим плюсы: )
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: I2C в CodeVisionAvr
А почему никто не дочитал даташит до конца?
полное название микросхемы
к примеру
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
получапется адреса - это разные микросхемы
полное название микросхемы
к примеру
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
clawham писал(а):А почему никто не дочитал даташит до конца?
и тут же дана расшифровка
получапется адреса - это разные микросхемы
тогда откуда ТС взял вот это???
верно говорят в сервисных центрах (можно провести аналогию с форумом, та же помощь) "Клиент всегда пи*дит"grinay писал(а):Проблема в том что у обоих заводом запрограммирован одинаковый адрес.И запрограммировать другой адрес могут тоже только они- под заказ.
ТС изначально ввел в заблуждение, а мы сразу поверили.
Ставим плюсы: )
Re: I2C в CodeVisionAvr
Здраствуйте. Я новичок-любитель в МП-програмировании и пока что еще учусь, поэтому нужна помощь профи!!
Задача состоит в подключении АЦП (MCP3421) к ATMEGA8 и через I2C правильно считать информацию с АЦП. Но пока что не получаеться правильно отладить считывание данных.

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

Вот есть функции для использования I2C но не понятно что за переменные должны быть заместь unsigned char, на что и ругаеться компилятор (CodeVisonAVR). Подскажите как правильно это сделать или где это можно узнать.
Код: Выделить всё
i2c_start();
i2c_write(unsigned char);
i2c_read(unsigned char);
i2c_stop();Прошу строго не судить.
Заранее спасибо.