0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 156
|
|
1 | |
ATtiny2313a +I2C + DS323126.10.2016, 16:03. Показов 6861. Ответов 2
Метки нет (Все метки)
Здравствуйте.
Перелистал весь интернет и никак не могу решить поставленую задачу. А именно считать часы с 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) { } } Что самое странное что если сменить адрес часов на что-то рандомное то программа работает так-же. Буду благодарен за совет. WinAVR+C.
0
|
26.10.2016, 16:03 | |
Ответы с готовыми решениями:
2
Sinaprog и ATtiny2313A Работа с DS3231 вопросы Не пишется программа в Attiny2313A Постоянно перезагружается attiny2313a. |
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+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 | |
30.10.2016, 17:52 | |
Помогаю со студенческими работами здесь
3
Подключение RTC DS3231 к AVR DS3231. Вывод темпертуры ATtiny2313A - тайминг сбит на 1\10 Проблема с DS3231 ATTiny2313A + TEA5767 DS3231 сбрасывает время странности в чтении байт с ds3231 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |