|
ATmega2561: соединить с ЦАПом ТС1230 по I2С, прописывание внешнего устройства по I2C |
|
|
|
Nov 12 2010, 08:29
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Пытаюсь уже 3-й день в AVRStudio соединить AtMega 2561 с ЦАП ТС1320 по I2c! Но на выходе так ничего и не обнаруживаю. Может что-то не так задаю( Помогите советом! Спасибо!
Кусок осн программы привожу ниже:
ldi r18, 0xD0 sts XMCRA, r18 ; Enable External Memory
ldi r18, 0x80 sts XMCRB, r18 ; Whole PortC for XRAM
ldi r16, 0x91 sts TWAR,r16 ; Slave address to TWAR
ldi START, 0xF8
;-----------------I2с sending -------------------------------------------
ldi r16,(1<<TWINT)|(1<<TWSTA)|(1<<TWEN) sts TWCR, r16 ; Send s-t-a-r-t condition
wait1: lds r16,TWCR sbrs r16,TWINT rjmp wait1 ; Wait for START bit to be transmitted
ldi r16, 0x90 sts TWDR,r16 ; Load Address in TWDR ldi r16, (1<<TWINT)|(1<<TWEN) sts TWCR, r16 ; Clear TWINT bit
wait2: lds r16,TWCR sbrs r16,TWINT rjmp wait2 ; Wait for ADRESS to be transmitted
ldi r16, 0x00 sts TWDR,r16 ; Load 00h - command for TC1320 to send next byte as Data ldi r16, (1<<TWINT)|(1<<TWEN) sts TWCR, r16 ; Clear TWINT bit
wait5: lds r16,TWCR sbrs r16,TWINT rjmp wait5 ; Wait for ADRESS to be transmitted
ldi r16, 0x3B sts TWDR,r16 ; Load DATA in TWDR ldi r16, (1<<TWINT)|(1<<TWEN) sts TWCR, r16 ; Clear TWINT bit in TWCR to start transmittion of DATA
wait3: lds r16,TWCR sbrs r16,TWINT rjmp wait3 ; Wait for DATA to be transmitted
ldi r16,(1<<TWINT)|(1<<TWEN)|(1<<TWSTO) sts TWCR, r16 ; Send s-t-o-p condition
nop
|
|
|
|
|
Nov 12 2010, 10:04
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(kovigor @ Nov 12 2010, 12:52)  Нескромный вопрос. Как электронщик электронщику. Вы хоть осциллографом на шину-то вставали ? Посылки пробовали захватить ? Что он показывает ? А так - первым делом проверьте правильность адреса, по которому вы обращаетесь (помните, что младший разряд адреса задает режим доступа R/W), а также наличие PULLUPs на линиях шины ... Мне собственно нужен ЦАП вместе с инвертирующим Операц Усилителем для получения отрицательного аналог напряжения для управления контрастностью на LCD. Осциллографом вставал на шину, посылки захватил: и адреса и данные. Видно четко. Адрес устройства ТС 1320 1001 000 прописал, младший разряд адреса задает режим доступа R/W - т.е. 0, получилось 10010000 - (0х90h) Pull up подвешены. Но уровень на выходе не изменяется..(
|
|
|
|
|
Nov 12 2010, 10:26
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(kovigor @ Nov 12 2010, 14:11)  ЦАП подтверждает обращение к нему (ACK вводит) ? А вот это я не знаю как проверять. Даташит Атмеги говорит после моего цикла проверки отправки адреса wait2: .. rjmp wait2 ; Wait for TWINT flag set. This indicates that the SLA+W has been transmitted, and ACK/NACK has been received проверять ACK следущим: lds r16, TWSR andi r16,0xF8 cpi r16, MT_SLA_ACK brne ERROR ; Check value of TWI Status Register. Mask Prescaler bits. If status different from MT_SLA_ACK go to the ERROR Во первых не понял что же такое MT_SLA_ACK? Во вторых подумал это лишнее,т.к. мой цикл wait2 и так оповещает меня установкой TWINT флага о том, что ACK передан.
|
|
|
|
|
Nov 12 2010, 10:34
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Slavast @ Nov 12 2010, 14:26)  А вот это я не знаю как проверять. ... А что же вы тогда осциллографом-то смотрели ??????? ЦАП должен подтвердить обращение к нему, опустив в ноль линию данных шины I2C в ответ на 9-й тактовый бит, вводимый вашей АТМЕГой. Если этого нет, говорить вообще не о чем. Поищите в даташите на ЦАП (или на любую ИС памяти вроде 24LC16) слово ACK или ACKNOWLEDGE, и разберитесь, что же все-таки должно быть на шине ... P.S. Вот, я сегодня добрый: " 3.5 Acknowledge Each receiving device, when addressed, is obliged to generate an acknowledge after the reception of each byte. The master device must generate an extra clock pulse which is associated with this acknowledge bit. The device that acknowledges, has to pull down the SDA line during the acknowledge clock pulse in such a way that the SDA line is stable LOW during the HIGH period of the acknowledge related clock pulse. Of course, setup and hold times must be taken into account. ... "
|
|
|
|
|
Nov 12 2010, 10:38
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Не увидел вот это - есть? ;************************************************** ;* ;;/Init Bit Rate fot TWI;;* * ;************************************************** ldi temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR sts TWBR,temp ;+ Частота TWI=384 Кгц
Да и протокол общения с DAC Вы не выполнили до конца , он не знает что ему делать и к тому же похоже вообще спит. Разберитесь с командами , которые необходимо послать , что бы он заработал.
И вот это всё сведите в одну подпрограмму
XXXX: lds r16,TWCR sbrs r16,TWINT rjmp XXXXX
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 12 2010, 10:58
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(kovigor @ Nov 12 2010, 14:34)  А что же вы тогда осциллографом-то смотрели ??????? ЦАП должен подтвердить обращение к нему, опустив в ноль линию данных шины I2C в ответ на 9-й тактовый бит, вводимый вашей АТМЕГой. Е Осциллографом вижу четко посылку байта адреса, байта данных. Значит ACK приходит по умолчанию. Все в том же цикле wait2. Вопрос тогда в том - как мне это в программе задать, чтоб я в каком то порту или регистре увидел значение бита АСК? Нужно ли мне перенастраивать TWI на прием этого АСК, а потом снова на передачу? Цитата(ILYAUL @ Nov 12 2010, 14:38)  Не увидел вот это - есть? ;************************************************** ;* ;;/Init Bit Rate fot TWI;;* * ;************************************************** ldi temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR sts TWBR,temp ;+ Частота TWI=384 Кгц Есть, только TWI получается 490 кГц: SCL = CPU(16 Мгц)/ (16+2*TWBR(0xFFh)*4в степени TWPS(задал 3)) Хотя пишут что больше 400кГц TWI не работает(.. Может через прерывания нужно осуществлять мою программу, где будет проводится проверка на окончание передачи данных?
|
|
|
|
|
Nov 12 2010, 11:08
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Slavast @ Nov 12 2010, 13:58)  SCL = CPU(16 Мгц)/ (16+2*TWBR(0xFFh)*4в степени TWPS(задал 3))
Хотя пишут что больше 400кГц TWI не работает(..
Может через прерывания нужно осуществлять мою программу, где будет проводится проверка на окончание передачи данных? А он и не работает , у него максимум 100 кгц. DATA SHEET читали? ldi temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR sts TWBR,temp ;+ Частота TWI=384 Кгц где в Вашем случае, введите эти две строчки в код , он сам посчитает .EQU SYSCLK = 16000000 ;+ Системная частота .EQU SCL_Freq = 100000 ;+ Частота TWI И разберитесь с тем о чём написал в предыдущем посте т.е снова прочтите DS, а уж потом осциллограф
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 12 2010, 11:48
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(ILYAUL @ Nov 12 2010, 15:08)  А он и не работает , у него максимум 100 кгц. DATA SHEET читали?
ldi temp,SYSCLK/(2*SCL_Freq)-8 ;TWI Bit Rate Register - TWBR sts TWBR,temp ;+ Частота TWI=384 Кгц
где в Вашем случае, введите эти две строчки в код , он сам посчитает
.EQU SYSCLK = 16000000 ;+ Системная частота .EQU SCL_Freq = 100000 ;+ Частота TWI
И разберитесь с тем о чём написал в предыдущем посте т.е снова прочтите DS, а уж потом осциллограф DS еще раз прочту. Может он в режиме Sleep по умолчанию?... И надо задавать отдельно еще в регистр управления DAC на пробуждение. А вот по поводу частоты не совсем понятно. В TWBR загоняю 11111111 A в биты TWPS1:TWPS0 регистра TWSR загоняю 1:1 - т.е. Prescaler bits равен 64. Вот и получаю свое число. Формула из Даташита: Формула в даташите ATMega: Цитата(Slavast @ Nov 12 2010, 15:22)  Формула в даташите ATMega: С частотой разобрался! Получал то не 490кГц, а 490 Гц!!!! В голове явно опилки! В TWPS 0:0. В TWBR (0x12h) И ScL четко получается 100kHz.
Эскизы прикрепленных изображений
|
|
|
|
|
Nov 12 2010, 12:06
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Slavast @ Nov 12 2010, 14:48)  Формула в даташите ATMega: Вам надо посчитать не частоту с которой Вы будете работать , Вы ее и так знаете , чего ее считать , а значение регистра TWBR , которое надо в него загнать , что бы получить Вашу частоту TWI при Вашей тактовой частоте. Т.е приведённую в DS Atmel формулу надо преобразовать , для расчёта TWBR , вот ее то я Вам и дал - осталось только подставить Ваши значения - тоже написал, и всё вставить в код программы , где нибудь в инит После, этого ради любопытсва , можете посмотреть значение TWBR- должно быть 0x48 Я насчитал очень поверхностно ( времени пока нет) , приблизительно 4 команды , которые необходимо загнать в DAC , что бы он начал работать.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 12 2010, 12:18
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(ILYAUL @ Nov 12 2010, 16:06)  Вам надо посчитать не частоту с которой Вы будете работать , Вы ее и так знаете , чего ее считать , а значение регистра TWBR , которое надо в него загнать , что бы получить Вашу частоту TWI при Вашей тактовой частоте. Т.е приведённую в DS Atmel формулу надо преобразовать , для расчёта TWBR , вот ее то я Вам и дал - осталось только подставить Ваши значения - тоже написал, и всё вставить в код программы , где нибудь в инит После, этого ради любопытсва , можете посмотреть значение TWBR- должно быть 0x48 Я насчитал очень поверхностно ( времени пока нет) , приблизительно 4 команды , которые необходимо загнать в DAC , что бы он начал работать. Совершенно верно! В конечном перерасчете у меня тоже получилось 0х48h! Какие же команды надо загнать в DAC для его работы?
|
|
|
|
|
Nov 12 2010, 12:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Slavast @ Nov 12 2010, 15:18)  Какие же команды надо загнать в DAC для его работы? Вообще-то название микросхем принято писать англицкими буковками, на будущее 1. Command Set -01 2 Включить DAC 3. Command Set 00 4. Данные для Data register приблизительно так
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 12 2010, 13:16
|
Частый гость
 
Группа: Участник
Сообщений: 81
Регистрация: 25-10-10
Пользователь №: 60 395

|
Цитата(ILYAUL @ Nov 12 2010, 16:46)  1. Command Set -01 2 Включить DAC 3. Command Set 00 4. Данные для Data register приблизительно так Спасибо огромное!) Сейчас будем пробовать прописывать! И еще вопрос - нужно ли ставить Микроконтроллер в режим Receiver, когда DAC свой выставляет девятый подтверждающий Acknowledgment бит ? Цитата(Slavast @ Nov 12 2010, 17:06)  И еще вопрос - нужно ли ставить Микроконтроллер в режим Receiver, когда DAC свой выставляет девятый подтверждающий Acknowledgment бит ? Или просто проверяя регистр статуса TWSR проверять пришел ли этот бит (По идее вроде как только ACK бит приходит, статус меняется в TWSR на значение в таблице Даташита)?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|