AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
29.08.2013, 17:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Atmega16+i2c+чайник...
Добрый день. Хочу подключить гироскоп MPU-6050 к атмеге по i2c, но не так сразу же... решил шину изучить на часах ds1307. Вот подключил по схемке, а оно неработает чтото. Хотел сразу вручную процедурами i2c-шины писать, но тоже самое что и процедурами самого ds1307. Помогите начинающему в освоении шинки этой. Читал как она работает на easyelectronics - понял, но не смог пока подправить те хидеры под cvavr. Схемку и код приложил, может кто поможет...?
Интересно было бы повесить на TWI....
Последний раз редактировалось miwutka; 29.08.2013 в 17:38.
|
|
|
|
29.08.2013, 18:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Исправил вверху 0 и 1 на инициализации порта в самом начале - в протеусе работает а в железе 165 все цыфры....
|
|
|
|
29.08.2013, 21:20
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
miwutka, не правильно соединили, надо так как на этой картинке.... Сумеете все сделать по такой схеме - будет работать влегкую... Главное - включите "рентгено-экстрасенсорно-тупоголовной" аппарат.
А если честно, то задолбали таковые вопросы... И это не только в Ваш адрес. Если хотите отладку в Протеусе, то и вопрос туда. И Протеусный вариант проекта с исходниками тоже. Пока вижу одну главную ошибку - используете КаАВРа в варианте программный I2C, но упорно делаете накладку сразу же и на TWI. КадАВР - (особенно в последних вариантах) штука хитрая, доблестный Паша Хайдук пытается соревноваться с екс-югославской Микоэлектроникой и фигачит библиотеки "только в путь", но не всегда адекватно. А уж каКчественно описать у него, как и у Лабцентра - духу не хватает. Поэтому, в новых версиях КадАВРа соседствуют и старые и новые библы периферии, надо юзать прямо там в папке /INC и натолкнетесь даже на специальную ds1307_twi.h? cоб-но чего Вы и хотели. Ну а как и что-надо читать комменты в файлах.
Ну, и еСЧё по теме... Сколько было вопросов по I2С - как правило упираются во времянки. Возможно поэтому - там идет, здесь нет. Выдерживайте заданные скорости и длительности - все будет O'key.
|
|
|
Сказали "Спасибо" Halex07
|
|
|
30.08.2013, 12:19
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
на картинке провода рекламой замазаны... Я так понял атмега-часы: 22-6, 23-5 ножки соединять. А 10к резисторы что ненужны??? А какие там интервалы времени? Выбрал как по ДШ 100кГц и библиотекой стандартной стучусь к часам... а они мне 165 шлют на часы, минуты и секунды...
Последний раз редактировалось miwutka; 30.08.2013 в 12:21.
|
|
|
|
30.08.2013, 17:23
|
|
Заблокирован
Регистрация: 23.09.2007
Сообщений: 761
Сказал спасибо: 84
Сказали Спасибо 352 раз(а) в 151 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Резисторы бы на 4,75 кОм. Подтяжка - классика. На 400 кГц спокойно работает. У меня завелось с первого раза. Я ставил другую микросхему, переделал библиотеку под неё, поэтому даже не знаю, чем помочь. Посмотрите ноги, правильно сконфигурировали? Мож с кварцем процессора чо не то? Диодом поморгайте с периодом 1 сек.
Ещё у меня инклюде сначала 1307, потом bcd
попробуйте с указателем:
void rtc_get_day(unsigned char *day)
{
i2c_start();
i2c_write(0xd0);
i2c_write(3);
i2c_start();
i2c_write(0xd1);
*day=bcd2bin(i2c_read(0));
i2c_stop();
}
rtc_get_day(&week_day);
Последний раз редактировалось kosmos440o; 30.08.2013 в 17:44.
|
|
|
|
30.08.2013, 18:08
|
|
Супер-модератор
Регистрация: 03.05.2007
Сообщений: 2,695
Сказал спасибо: 28
Сказали Спасибо 4,509 раз(а) в 956 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Сообщение от miwutka
|
на картинке провода рекламой замазаны...
|
Не Ёркламой, а мною в качестве подъ*ба - Вы на свою гляньте! Можно понять что-куда-зачем??? Полностью "тупоголовые" поймут, что все в осциллограф, остальным остается включить "рентген".
|
|
|
|
02.09.2013, 10:49
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Сообщение от Halex07
|
Не Ёркламой, а мною в качестве подъ*ба - Вы на свою гляньте! Можно понять что-куда-зачем??? Полностью "тупоголовые" поймут, что все в осциллограф, остальным остается включить "рентген".
|
Сорри, не мог ответить на выходных... Не знал что для проверки 1307 Вам надо видеть куда подключен ЖК.... Вот картинка без подъ*ба...
Последний раз редактировалось miwutka; 02.09.2013 в 10:52.
|
|
|
|
02.09.2013, 14:50
|
|
Прописка
Регистрация: 11.09.2007
Адрес: Муром
Сообщений: 135
Сказал спасибо: 128
Сказали Спасибо 446 раз(а) в 74 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Я шину i2c сначала пощупал на Arduino без использования стандартных библиотек (так кажется нагляднее). Вот простенькие часы на семисегментниках и ds1307. По моему все процедуры наглядны. В приложении ещё код на ардуино для работы с 24с16.
Код:
|
/*
Часы на 7 сегментном четырехразрядном светодиодном индикаторе
аноды A B C D E F G подключены к цифровым пинам 1,2,3,4,5,6,7- 8-пин запятй, 0 не испльзуется
катоды 1 2 3 4 разряда к цифровым пинам 9,10,11,12 через транзисторные ключи
*/
long sec1, sec2, min1, min2, h1, h2, day1, day2, week, mon1, mon2, year1, year2;
int c, temp, delayLed =150;//ждем 200 микросекунд -главное четко увидеть цифры без мелькания
#include ‹Wire.h› //подключаем библиотеку для работы I2C
#define RTC_I2C_ADDR 104 //адрес ds1307 часов
#define RTC_CONTROL1_REG 0x07 //адреса регистров ds1307 часов
#define RTC_SEC_REG 0x00
#define RTC_MIN_REG 0x01
#define RTC_HOUR_REG 0x02
#define RTC_DATE_REG 0x04
#define RTC_WEEKDAY_REG 0x03
#define RTC_MONTH_REG 0x05
#define RTC_YEAR_REG 0x06
byte data[10]={B01111110,B00001100,B10110110,B10011110,B1100110 0,B11011010,B11111010,B00001110,B11111110,B1101111 0};
void setup()
{
/*
h1=0; //выставить одну цифру десятки часов
h2=9; //выставить одну цифру единицы часов
temp = h1 * 16 + h2;
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_HOUR_REG);
Wire.write(temp);
Wire.endTransmission();
min1= 4;//выставить одну цифру десятки минут
min2= 6;//выставить одну цифру единицы минут
temp = min1 * 16 + min2;
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_MIN_REG);
Wire.write(temp);
Wire.endTransmission();
day1=1; //выставить одну цифру десятки дней
day2=9; //выставить одну цифру единицы дней
temp = day1 * 16 + day2;
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_DATE_REG);
Wire.write(temp);
Wire.endTransmission();
mon1= 0;//выставить одну цифру десятки месяца
mon2= 3;//выставить одну цифру единицы месяца
temp = mon1 * 16 + mon2;
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_MONTH_REG);
Wire.write(temp);
Wire.endTransmission();
year1=1; //выставить одну цифру десятки лет
year2=3; //выставить одну цифру единицы лет
temp = year1 * 16 + year2;
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_YEAR_REG);
Wire.write(temp);
Wire.endTransmission();
*/
Wire.beginTransmission(RTC_I2C_ADDR); //При включении часов 7 бит 0 регистра
Wire.write(RTC_SEC_REG); //принудительно надо выставлять в 0
Wire.write(B00000000); //этим запускается тактовый генератор
Wire.endTransmission();
DDRD=B11111111; // пины порта D и B обозначаем выходными
DDRB=B111111;
}
void printcount(int number)
{PORTD=data[number];//устанавливает нужные пины в положение HIGH
}
void loop()
{
// опросим время
Wire.beginTransmission(RTC_I2C_ADDR);
Wire.write(RTC_SEC_REG); // Опрашиваем секундный регистр часов
Wire.endTransmission();
Wire.requestFrom(RTC_I2C_ADDR, 7); // Считываем с него и 7-х следующих регистров
// очерёдность = расположения регистров по даташиту, от 0 до7
if(Wire.available()) // секунды
{
c = Wire.read();
sec2 = c & B00001111; // единицы секунд
sec1 = (c & B01110000) ›› 4; // десятки секунд
};
if(Wire.available()) // минуты
{
c = Wire.read();
min2 = c & B00001111; // единицы минут
min1 = (c & B01110000) ›› 4; // десятки минут
};
if(Wire.available()) // часы
{
c = Wire.read();
h2 = c & B00001111; // единицы часов
h1 = (c & B00110000) ›› 4; // десятки часов
};
if(Wire.available()) // день недели
{
c = Wire.read();
week = c & B00000111; // день недели
};
if(Wire.available()) // число
{
c = Wire.read();
day2 = c & B00001111; // единицы дней
day1 = (c & B00110000) ›› 4; // десятки дней
};
if(Wire.available()) // месяц
{
c = Wire.read();
mon2 = c & B00001111; // единицы месяца
mon1 = (c & B00010000) ›› 4; // десятки месяца
};
if(Wire.available()) // год
{
c = Wire.read();
year2 = c & B00001111; // единицы года
year1 = (c & B11110000) ›› 4; // десятки года
};
if (sec1 == 1) //если секундный регистр от 10 до 19 сек, то показывает дату
//иначе показывае время
{
PORTB=B101110 ;//открываем 4 разряд 0 в 0бите-запятая
printcount(day1);//выводим десятки часов
delayMicroseconds(delayLed);
PORTB=B110110 ;//открываем 3 разряд 1 в 0 бите-запятая
printcount(day2);//выводим единицы часов
delayMicroseconds(delayLed);//ждем 200 микросекунд - можно ставить любое число,
//главное четко увидеть цифры без мелькания
PORTB=B111010;//открываем 2й разряд 0 в 0бите-запятая
printcount(mon1);//выводим десятки минут
delayMicroseconds(delayLed);
PORTB=B111100;//открываем 1 разряд 0 в 0бите-запятая
printcount(mon2);//единицы минут
delayMicroseconds(delayLed);
}
else
{
PORTB=B101110 ;//открываем 4 разряд 0 в 0бите-запятая
printcount(h1);//выводим десятки часов
delayMicroseconds(delayLed);
PORTB=B110111 ;//открываем 3 разряд 1 в 0бите-запятая
printcount(h2);//выводим единицы часов
delayMicroseconds(delayLed);//ждем 200 микросекунд - можно ставить любое число,
//главное четко увидеть цифры без мелькания
PORTB=B111010;//открываем 2й разряд 0 в 0бите-запятая
printcount(min1);//выводим десятки минут
delayMicroseconds(delayLed);
PORTB=B111100;//открываем 1 разряд 0 в 0бите-запятая
printcount(min2);//единицы минут
delayMicroseconds(delayLed);
}
} |
Последний раз редактировалось polli123456; 02.09.2013 в 15:16.
|
|
|
|
02.09.2013, 16:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Еслеб была ардуинка я б уже давно наверно освоил... Коды смотрел с ардуины - алгоритм понял, но почему-то всеравно не пашет. Какая-то передача идет, но непонятно какая. Когда батарейку подключаю то чила меняются со 165 на 80, отключаю батарейку - 165 становиться...
|
|
|
|
03.09.2013, 08:39
|
|
Прописка
Регистрация: 11.09.2007
Адрес: Муром
Сообщений: 135
Сказал спасибо: 128
Сказали Спасибо 446 раз(а) в 74 сообщении(ях)
|
Re: Atmega16+i2c+чайник...
Может Вы не включаете тактовый генератор?
"При включении часов 7 бит 0 регистра принудительно надо выставлять в 0 этим запускается тактовый генератор".
Даташит на русском на ds1307, читайте
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:10.
|
|