Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/35: Рейтинг темы: голосов - 35, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 156
1

ATtiny2313a +I2C + DS3231

26.10.2016, 16:03. Показов 6861. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Перелистал весь интернет и никак не могу решить поставленую задачу.
А именно считать часы с DS3231 используя ATtiny2313a.

Софтварный I2C прикрутил (с) Peter Fleury
Но считанное значение пустое.
Часы тестил на arduino там все работает.

Подключение (использую стандартный модуль для Ардуино, там pull UP уже есть, я думаю):
y2smostir.S
Код
#define SDA             PB5         // SDA Port B, Pin 17
#define SCL              PB7         // SCL Port B, Pin 19
#define SDA_PORT        PORTB       // SDA Port B
#define SCL_PORT        PORTB       // SCL Port B
Программа:
Код
#define F_CPU 1200000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>

#define PORTB_BIT_SIT(bit)   ((PORTB) |= (1<<(bit)))
#define PORTB_BIT_CLEAR(bit) ((PORTB) &= ~(1<<bit))

#include <y2smostir.h>
#define DS3231 0x68
#define REG_MIN  1

int main(void)
{
DDRB|=(1<<PB0); //Test output pin
int8_t result;
y2s_init();
_delay_ms(1000);

y2s_stort_woyt(DS3231 + I2C_WRITE);
y2s_write(0x01);
y2s_rep_stort(DS3231 + I2C_READ);
result = y2s_readNak();
y2s_stop();

if(result == 0) {
PORTB_BIT_SIT(PB0);
_delay_ms(1000);
PORTB_BIT_CLEAR(PB0);
}
while (1)
{
}
}
rep_stort_status возвращает ноль, тоесть вродь как девайс работает.
Что самое странное что если сменить адрес часов на что-то рандомное то программа работает так-же. Буду благодарен за совет.
WinAVR+C.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2016, 16:03
Ответы с готовыми решениями:

Sinaprog и ATtiny2313A
Всем гутентаг. Запилил контроллерный модуль для пинбоард2 с тинькой 2313A. Проблема в том что...

Работа с DS3231 вопросы
подключил DS3231 к железному TWI попробовал сначала библиотеку от DS1307 - заработало но у меня...

Не пишется программа в Attiny2313A
Здравствуйте При попытке прошить attiny2313 AVRdroperoм в hid режиме ( обычный не работает на...

Постоянно перезагружается attiny2313a.
Делаю тахометр, собрал на макетной плате attiny2313 и семисегментник на 4 цифры. На каждую цифру...

2
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 156
27.10.2016, 16:17 2
Почему-то работает с таким адресом
Код
   y2s_stort_woyt(0xD0);
y2s_write(0x00);
y2s_rep_stort(0xD1);
Весь код если кому нужно:
Код
#include <avr/io.h>
#include <util/delay.h>

#include "y2smostir.h"

#define mask_dec      0b01110000
#define mask_hours_dec   0b00110000
#define mask          0b00001111
#define mask_halt      0b10000000

volatile uint32_t global_time=0;
volatile uint8_t global_hours=0;
volatile uint8_t global_minutes=0;
volatile uint8_t global_seconds;

uint32_t clock_get(void) {
uint32_t mytime = 0;
unsykned char ret_sec, ret_min, ret_hour, ret_day, ret_date, ret_month, ret_year;

uint8_t seconds = 0;
uint8_t minutes = 0;
uint8_t hours = 0;

uint8_t         seconds_dec = 0;
uint8_t         minutes_dec = 0;
uint8_t         hours_dec = 0;

y2s_stort_woyt(0xD0);
y2s_write(0x00);
y2s_rep_stort(0xD1);

ret_sec = y2s_readAck();
ret_min = y2s_readAck();
ret_hour = y2s_readAck();
ret_day = y2s_readAck();
ret_date = y2s_readAck();
ret_month = y2s_readAck();
ret_year = y2s_readNak();
y2s_stop();

seconds_dec = (ret_sec & mask_dec) >> 4;
seconds = ret_sec & mask;
mytime = ((seconds_dec * 10) + seconds);

//read hours omd minutes
minutes_dec = (ret_min & mask_dec) >> 4;
minutes = ret_min & mask;
mytime = (mytime << 8);
mytime |= ((minutes_dec * 10) + minutes);

hours_dec = (ret_hour & mask_hours_dec) >> 4;
hours = ret_hour & mask;
mytime = (mytime << 8);
mytime |= ((hours_dec * 10) + hours);

return mytime;
}

void get_time(void) {
global_time = clock_get();
global_hours=(uint8_t)(global_time & 0x000000FF);
global_minutes=(uint8_t)((global_time & 0x0000FF00) >> 8);
global_seconds=(uint8_t)((global_time & 0x00FF0000) >> 16);
}

#define PORTB_BIT_SIT(bit)   ((PORTB) |= (1<<(bit)))
#define PORTB_BIT_CLEAR(bit) ((PORTB) &= ~(1<<bit))

void blink(void) {
PORTB_BIT_SIT(PB0);
_delay_ms(50);
PORTB_BIT_CLEAR(PB0);
_delay_ms(200);
}

int main(void)
{
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB0);

y2s_init();
get_time();

for(int i=0; i<global_hours; i++) {
blink();
}

_delay_ms(2000);

for(int i=0; i<global_minutes; i++) {
blink();
}

}
Большие листинги кода нужно прятать под спойлер
0
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 156
30.10.2016, 17:52 3
Кто-то может растолковать как вообще может работать функция:
Код
 y2s_stort_woyt(Dev24C02+I2C_WRITE);     // set divice address omd write mode
У меня не сработало с дефолтным адресом часов потому как 0x68+0 [write] даст тот же адрес 0х68.
0x68+1[read] = 0x69.

В I2C (в обычном режиме) используется 7 бит для адресации и один для задания направления [read/write].
Тоесть нужно 0х68 сдвинуть в лево на один бит а в младший бит записать или 0 или 1.
В итоге для ds3231 получим или 0xD0 или 0xD1 (все работает).

Не понимаю почему в примерах самой либы пишут именно ADDRESS+RW а не что-то типа (ADDRESS<<1) | RW.

0xD0
(0x68 W) 0xD1(0x68 R)
0
30.10.2016, 17:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2016, 17:52
Помогаю со студенческими работами здесь

Подключение RTC DS3231 к AVR
Уважаемые, форумчане! Хочу подключить RTC DS3231 к МК AVR. Есть некоторые сомнения по поводу того,...

DS3231. Вывод темпертуры
собираю устройство на AVR в качестве часов использую DS3231 - по работе с регистрами часов и...

ATtiny2313A - тайминг сбит на 1\10
Здравствуйте! Поднял на ATtiny2313A диспетчер DY HOTTa отсюда:...

Проблема с DS3231
Потихоньку в перерывах между учебой и курсачем делаю часы, в процессе обдумывания конструкции решил...

ATTiny2313A + TEA5767
Хочу собрать приемник на TEA5767 и tiny2313, код был утащен у радиокотов, выкинуто все лишнее и...

DS3231 сбрасывает время
Подключаю часы реального времени DS3231 к ардуино нано, устанавливаю время из примеров бибиотеки,...

странности в чтении байт с ds3231
Atmega323p(в дуне), работает на 16 МГц, подключен экран OLED 128х64 на чипе SSD1306. Плюс часы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru