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

странности в чтении байт с ds3231

01.04.2019, 01:47. Показов 5656. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Atmega323p(в дуне), работает на 16 МГц, подключен экран OLED 128х64 на чипе SSD1306. Плюс часы реального времени DS3231. Сначала выводило вместо часов и минут цифру одног разряда(5 или 7) потом кое-что исправил, вывел секунды - их вывело корректно, затем в код функции между чтением разрядов(сек, мин, часы) вставил еще Повстарт и адрес часов, стали выводиться и минуты и часы. Но по разным источникам, чтение нескольких разрядов идет один за другим, видимо у меня в коде вместо ACK функция выдает NACK, но я никак не могу понять как в аппаратном TWI режиме чтения мастером формируется передача от мастера к слейву бита NACK или ACK. В последнем байте мастер должен отправить в ответ NACK. Понимаю, что при записи байтов в переферию слейв посылает подтверждение, и это можно понять через регистр статуса TWSR, а вот как я могу именно контролировать передачу от мастера к слейву в программе битов подтверждения?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void twi_Start(void){
        TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); //TWSTA - флаг состояния СТАРТ.
        while(!(TWCR & (1<<TWINT))){};  //Ожидание установки флага TWINT. Это покажет, что START был передан.
        }
 
void twi_SendByte(unsigned char Inf){
        TWDR=Inf;
        TWCR=(1<<TWINT)|(1<<TWEN);      //Очищает бит TWINT в TWCR для запуска передачи данных.      
        while(!(TWCR & (1<<TWINT))){};//Ожидание установки флага TWINT. Это показывает, что DATA были переданы, и принят ACK/NACK.
        }
 
 
 
char twi_GetByte(void){       //чтение с слейва
        TWCR = (1<<TWINT)|(1<<TWEN);
        while (!(TWCR & (1<<TWINT)));
        char Inf=TWDR;
        return Inf;
        }
 
void ds3231_read_time(char *sec, char *min, char *hour){
 
    twi_Start();
    twi_SendByte(0xD0);   // передача адреса устройства, режим записи
        twi_SendByte(0x00);            // передача адреса памяти 
        //twi_Stop();                // остановка i2c, я эту функцию удалил и ничего в работе не поменялось
 
    twi_Start();     // повстарт
    twi_SendByte(0xD1);         // передача адреса устройства, режим чтения
    
    *sec = twi_GetByte();       // получить секунды
    twi_Start();
    twi_SendByte(0xD1); //просто с повстартом без передачи адреса вообще на экран ничего не выводится
        *min = twi_GetByte();       // чтение минут
    twi_Start();
    twi_SendByte(0xD1); 
        *hour = twi_GetByte();      // чтение часов
        
        twi_Stop();                 // остановка i2c
 
}
Добавлено через 5 часов 6 минут
Разобрался, в статусном регистре TWCR нужно перед считыванием данных поставить 1 в TWEA, чтоб отправить ACK, если нужен NACK, то просто не записываете этот TWEA. Пришлось делать 2 функции с записью 1 в TWEA и без записи, когда последний байт читаешь перед СТОПом
C
1
2
3
 *min = twi_GetByteAck();       // чтение минут, ACK
    
    *hour = twi_GetByteAck();       // чтение часов, ACK
функция с ack:
C
1
2
3
4
5
6
char twi_GetByteAck(void){
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
        while (!(TWCR & (1<<TWINT)));
        char Inf=TWDR;
        return Inf;
        }
с NACK:
C
1
2
3
4
5
6
char twi_GetByte(void){
        TWCR = (1<<TWINT)|(1<<TWEN);
        while (!(TWCR & (1<<TWINT)));
        char Inf=TWDR;
        return Inf;
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.04.2019, 01:47
Ответы с готовыми решениями:

Откуда при чтении из COM-порта берутся 99 байт?
Здравствуйте! Этот отрывок кода взят из рабоче программы, которая работает около 2-х лет и судя по...

Зависание приложения при чтении байт в TcpClient
Добрый день. Подскажите, пожалуйста, почему может быть зависание при выполнении последней...

Qt. Изменение порядка байт в массиве (или при чтении из файла)
Здравствуйте. Посоветуйте, пожалуйста, метод решения следующей проблемы : Имеется большой массив...

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

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

0
01.04.2019, 01:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2019, 01:47
Помогаю со студенческими работами здесь

ATtiny2313a +I2C + DS3231
Здравствуйте. Перелистал весь интернет и никак не могу решить поставленую задачу. А именно...

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

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

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

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


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

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