реклама на сайте
подробности

 
 
> Программный I2C Atmega 8, Не могу считать.
ikm
сообщение Aug 14 2017, 15:26
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Пытаюсь считать данные из регистров устройства. Но не получается.
Возникло много вопросов:
1. Вопрос и самый главный где CAVR можно выставить частоту I2C. У меня версия 2.05 -вкладки I2C в свойствах проекта нет, но при этом есть в визарде, но там не указана частота, только назначение выводов.
Пытался сменой частоты МК, но тут тоже странности. По дефолту стоит на 8 МГц, когда меняю на 16 МГц, CAVR пишет, что SCL будет увеличен до 430 кГц, но по факту (смотрю осцилографом частота становится меньше), соответственно ставлю 1 МГц, прога предупреждает что SCL снизится до 200 кГц, но по факту она возрастает.
2. Запустил проверку кода в Протеусе, анализатор показывает последовательность верную. Запускаю в железе, ответа не получаю. При этом запись проходит успешно.
Несколько раз проходило считывание. Но не систематически и повторить не удалось.

Код использовал стандартный, по идее 100% рабочий
Код
unsigned char TDA_read(unsigned char address) //Функция чтения из TDA
{
i2c_start();                                    // "Cтарт" на шину I2C
i2c_write(TDA_5414_Adr);             // адрес TDA
i2c_write(address);                       //Регистр откуда считываем ошибки
i2c_start();                                  //RE "старт" в шину
i2c_write(TDA_5414_Adr | 1);     //Обращаемся к TDA в режиме чтения, т.е. по адресу 11011001
data=i2c_read(0);                       //Принимаем данные с шины и сохраняем в переменную
i2c_stop();                                 //Посылаем команду "Cтоп"
return data;                              //Возвращаем значение прочитанного
}

.....
Вызов функции для проверки что получен правильный ответ.:
TDA_read(0x00);                        //Считываем ошибки по адресу 0х00
Data_call = data;
if (Data_call == 0x30) led1_on(), led2_on();


подключение сейчас на небольших ~5см, проводах.
Ниже скрины осциллограмм команды считывания через переходник USART-I2C, через него проходит исправно, а так же с Atmega, на "пониженной" скорости (кристалл на 16МГц). На скринах разное разрешение по горизонтали.
У же даже не знаю куда копать.

Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ikm
сообщение Aug 15 2017, 07:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 891
Регистрация: 25-12-06
Из: С-Пб
Пользователь №: 23 894



Частота задается внутренним генератором.
Для меня asm, это такой темный лес.... даже не знаю, что выкладывать:
,
CODE
;// I2C Bus functions
;#asm
.equ __i2c_port=0x08 ;PORTC
.equ __sda_bit=0
.equ __scl_bit=1
; 0000 0023 #endasm
;#include <i2c.h>

_TDA_read:
; 0000 0041 i2c_start(); //Кидаем команду "Cтарт" на шину I2C
; address -> Y+0
RCALL _i2c_start
; 0000 0042 i2c_write(TDA_5414_Adr); //Кидаем на шину адрес TDA
LDI R30,LOW(216)
ST -Y,R30
RCALL _i2c_write
; 0000 0043 i2c_write(address); //Указываем байт откуда считываем ошибки
LD R30,Y
ST -Y,R30
RCALL _i2c_write
; 0000 0044 i2c_start(); //Снова посылаем "старт" в шину
RCALL _i2c_start
; 0000 0045 i2c_write(TDA_5414_Adr | 1); //Обращаемся к TDA в режиме чтения, т.е. по адресу 11011001
LDI R30,LOW(217)
ST -Y,R30
RCALL _i2c_write
; 0000 0046 data=i2c_read(0); //Принимаем данные с шины и сохраняем в переменную
LDI R30,LOW(0)
ST -Y,R30
RCALL _i2c_read
MOV R6,R30
; 0000 0047 i2c_stop(); //Посылаем команду "Cтоп"
RCALL _i2c_stop
; 0000 0048 return data; //Возвращаем значение прочитанного
MOV R30,R6
ADIW R28,1
RET
; 0000 0049 }

; 0000 00DF // I2C Bus initialization
; 0000 00E0 i2c_init();
RCALL _i2c_init
; 0000 00E1
; 0000 00E2 TDA_read(0x00); //Считываем ошибки по адресу 0х00
LDI R30,LOW(0)
ST -Y,R30
RCALL _TDA_read
; 0000 00E3 Data_call = data;
MOV R7,R6
; 0000 00E4 if (Data_call == 0x30) led1_on(), led2_on();
LDI R30,LOW(48)
CP R30,R7
BRNE _0x13
SBI 0xB,0
SBI 0xB,6
; 0000 00E5 delay_ms (2000);


Сейчас попробую поставить более поздний CAVR. У этого в настройках не нашел ничего, но мне кажется очень странным, когда повышаешь тактовую частоту, а тебе снижают SCL.

Внизу скрины SCL, та, что с Atmega с меньшей частотой (но на скрине кажется что больше, там разрешение мс/дел больше)
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 


--------------------
ОБХОДЯ РАЗЛОЖЕННЫЕ ГРАБЛИ - ТЫ ТЕРЯЕШЬ ДРАГОЦЕННЫЙ ОПЫТ!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 10:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01374 секунд с 7
ELECTRONIX ©2004-2016