Библиотека для работы с I2C взята из проекта https://radiokot.ru/circuit/digital/home/239/:
Спойлер
Код: Выделить всё
#define SCL 3
#define SDA 4
#define ACK 1
#define NACK 0
#define SCL_HIGH DDRB&=~(1<<SCL)
#define SCL_LOW DDRB|=(1<<SCL)
#define SDA_HIGH DDRB&=~(1<<SDA)
#define SDA_LOW DDRB|=(1<<SDA)
#include <avr/io.h>
#include "TWI.h"
unsigned char k = 0;
void i2c_start (void)
{
SCL_HIGH;
SDA_HIGH;
SDA_LOW;
SCL_LOW;
}
void i2c_stop (void)
{
SDA_LOW;
SCL_HIGH;
SDA_HIGH;
}
void i2c_send_byte (unsigned char data)
{
SCL_LOW;
for(k=8;k>0;k--)
{
if(data&(1<<(k-1))) SDA_HIGH;
else SDA_LOW;
SCL_HIGH;
SCL_LOW;
}
SCL_HIGH;
SCL_LOW;
}
unsigned char i2c_receive_byte (unsigned char ACK_NACK)
{
unsigned char out_data=0;
SCL_LOW;
for(k=8;k>0;k--)
{
SCL_HIGH;
if(PINB&(1<<SDA)) out_data|=(1<<(k-1));
else out_data&=~(1<<(k-1));
SCL_LOW;
}
if(ACK_NACK) SDA_LOW;
else SDA_HIGH;
SCL_HIGH;
SCL_LOW;
SDA_HIGH;
return out_data;
}
Спойлер
Код: Выделить всё
#ifndef F_CPU
# define F_CPU 1200000UL // 1.2 MHz
#endif /* !F_CPU */
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "uart.h"
#include "DS1307.h"
#include "TWI.h"
int main(void)
{
char* time;
char s;
DDRB = (0<<PINB5) | (0<<PINB4) | (0<<PINB3) | (0<<PINB2) | (0<<PINB1) | (0<<PINB0);
PORTB = (0<<PINB5) | (0<<PINB4) | (0<<PINB3) | (1<<PINB2) | (0<<PINB1) | (0<<PINB0);
GIMSK=(1<<PCIE); // кнопка
PCMSK=(1<<PCINT3);
while (1)
{
i2c_start();
i2c_send_byte(0xD0); //отправить адрес устройства с 0 = запись
i2c_send_byte(1); //отправить № байта, с которого начнём работать
i2c_start();
i2c_send_byte(0xD1); //отправить адрес устройства с 1 = чтение
time[0] = i2c_receive_byte(1); //считать минуты
time[1] = i2c_receive_byte(0); //считать секунды
i2c_stop();
uart_putc(time[1]);
_delay_ms(1000);
}
}
Но если выводить буфер часов минуты или секунды, функция uart_putc в Proteus постоянно выводит в HEX что-то не понятное. Если в uart_putc вставить любой символ -> то HEX код символа передается в терминал верно. Видимо где-то не правильно читаю часики? В чем может быть проблема? по идее мне надо прочитать часы, минуты и каждый элемент массива отправить через uart_putc(аргумент); через определенный квант времени? В либе USART еще есть функция uart_puts(аргумент) которая выводит строку. Какой алгоритм лучше использовать?


