Конечно выкладывайте. Всегда найдется человек, которому это будет интересно.vvsector85 писал(а):Если мой "велосипед" кому-то может быть полезен, могу выложить печатки, исходник и прошивки.
Только вы пропустили еще одно важное слово - " схему".
Конечно выкладывайте. Всегда найдется человек, которому это будет интересно.vvsector85 писал(а):Если мой "велосипед" кому-то может быть полезен, могу выложить печатки, исходник и прошивки.
слева!Это не поможет, при запрещении прерываний неизбежен срыв динамической индикации особенно заметен при различных эфектах смены цифр. Да и вообще запрещать прерывания плохая затея советую посмотреть в сторону подключения ds18b20 через uart, я так делаю ничего не запрещаю и проблем нет.vvsector85 писал(а): А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Точно такая же фигня.vvsector85 писал(а):Схему придется нарисовать.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Код: Выделить всё
// Инициализирую DS18B20
void DS18B20_init (void)
{
if ((DS18B20_PIN & (1 << DS18B20)) == 0) ds18b20_err++; // Проверяю КЗ линии данных
DS18B20_PORT &= ~(1 << DS18B20); // Устанавливаю низкий уровень
DS18B20_DDR |= (1 << DS18B20);
_delay_us(490);
DS18B20_DDR &= ~(1 << DS18B20);
_delay_us(68);
if ((DS18B20_PIN & (1 << DS18B20)) > 0) ds18b20_err++; // Ловлю импульс присутствия датчика
// Если датчик не подключен, Presense_errors увеличиваю на 1
_delay_us(422);
}
// Функция чтения байта из DS18B20
uint8_t DS18B20_read (void)
{
uint8_t dat = 0;
for (uint8_t i=0; i<8; i++)
{
DS18B20_DDR |= (1 << DS18B20);
_delay_us(2);
DS18B20_DDR &= ~(1 << DS18B20);
_delay_us(4);
dat = dat >> 1;
if (DS18B20_PIN & (1 << DS18B20))
{
dat |= 0x80;
}
_delay_us(62);
}
return dat;
}
// Функция чтения "блокнота" из DS18B20
void DS18B20_read_scratchpad (void)
{
for (uint8_t i=0; i<9; i++) // Считываю 9 байт данных, или так называемый "блокнот"
{
DS_scratchpad[i] = DS18B20_read();
}
}
// Функция записи байта в DS18B20
void DS18B20_write (uint8_t dat)
{
for (uint8_t i=0; i<8; i++)
{
DS18B20_DDR |= (1 << DS18B20);
_delay_us(2);
if (dat & 0x01)
{
DS18B20_DDR &= ~(1 << DS18B20);
}
else
{
DS18B20_DDR |= (1 << DS18B20);
}
dat = dat >> 1;
_delay_us(62);
DS18B20_DDR &= ~(1 << DS18B20);
_delay_us(2);
}
}
/////////
int curr_temp()
{
cli();
DS18B20_init(); // Инициализирую DS18B20
DS18B20_write(0xCC); // Пропускаю проверку серийного номера DS18B20
DS18B20_write(0x44); // Запускаю температурное преобразование
sei();
_delay_ms(500); // Жду окончания температурного преобразования
cli();
DS18B20_init(); // Инициализирую DS18B20
DS18B20_write(0xCC); // Пропускаю проверку серийного номера DS18B20
DS18B20_write(0xBE); // Команда на чтение содержимого ОЗУ
DS18B20_read_scratchpad(); // Считываю "блокнот"
sei();
Temperature=((DS_scratchpad[1]<<8)+DS_scratchpad[0])/1.60;
if (Temperature < 0)
{
Temperature =-Temperature; // Перевожу отрицательное число в положительное
szero=1;
}
else
// Положительная температура
{
szero=0;
}
return Temperature;
}Код: Выделить всё
sei();
_delay_ms(500); // Жду окончания температурного преобразования
cli();Вот ещё один котейко который схем не рисует.vvsector85 писал(а):Схему придется нарисовать.
Код: Выделить всё
#include <avr/io.h>
#include <util/delay.h>
#include "stdio.h"
#include "stdlib.h"
#include "I2c.h"
#define I2C_SDA_PIN PD7 //линия SDA
#define I2C_SCL_PIN PB0 //линия SCL
#define I2C_SDA_PORT_READ PIND //порт входа
#define I2C_SDA_PORT_DIR DDRD //порт направления
#define I2C_SCL_PORT_DIR DDRB //порт направления
#define I2C_SDA_PORT PORTD //порт выхода
#define I2C_SCL_PORT PORTB //порт выхода
#define SET(reg, bit) (reg |= (1 << bit))
#define CLR(reg, bit) (reg &= ~(1 << bit))
#define GETBIT(byte, bit) ((byte >> bit) & 1)
#define SETBIT(byte, bit) (byte | (1 << bit))
#define I2C_SDA_LOW (SET(I2C_SDA_PORT_DIR, I2C_SDA_PIN))
#define I2C_SDA_HIGH (CLR(I2C_SDA_PORT_DIR, I2C_SDA_PIN))
#define I2C_SCL_LOW (SET(I2C_SCL_PORT_DIR, I2C_SCL_PIN))
#define I2C_SCL_HIGH (CLR(I2C_SCL_PORT_DIR, I2C_SCL_PIN))
#define I2C_SDA_VALUE (GETBIT(I2C_SDA_PORT_READ, I2C_SDA_PIN))
//#define _delay_us(n) __delay_cycles(8*(unsigned short)n)
void i2c_init() {
CLR(I2C_SDA_PORT, I2C_SDA_PIN);
CLR(I2C_SCL_PORT, I2C_SCL_PIN);
I2C_SDA_HIGH;
I2C_SCL_HIGH;
}
void i2c_start() {
I2C_SDA_LOW;
_delay_us(I2C_DELAY);
}
void i2c_start_rep() {
I2C_SCL_LOW;
_delay_us(I2C_DELAY);
I2C_SDA_HIGH;
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
I2C_SDA_LOW;
_delay_us(I2C_DELAY);
}
void i2c_stop() {
I2C_SCL_LOW;
I2C_SDA_LOW;
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
I2C_SDA_HIGH;
_delay_us(I2C_DELAY);
}
signed char i2c_write(unsigned char byte) {
unsigned char i;
for(i = 0; i < 8; i ++) {
I2C_SCL_LOW;
if(GETBIT(byte, 7)) {
I2C_SDA_HIGH;
} else {
I2C_SDA_LOW;
}
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
byte <<= 1;
}
I2C_SCL_LOW;
I2C_SDA_HIGH;
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
if(I2C_SDA_VALUE == 1) {
return -1;
}
return 0;
}
unsigned char i2c_read(unsigned char ack) {
I2C_SCL_LOW;
I2C_SDA_HIGH;
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
unsigned char i, result = I2C_SDA_VALUE;
for(i = 0; i < 7; i ++) {
I2C_SCL_LOW;
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
result <<= 1;
if(I2C_SDA_VALUE == 1) {
result |= 1;
}
}
I2C_SCL_LOW;
if(ack == I2C_ACK) {
I2C_SDA_LOW;
} else {
I2C_SDA_HIGH;
}
_delay_us(I2C_DELAY);
I2C_SCL_HIGH;
_delay_us(I2C_DELAY);
return result;
}
void i2c_address(unsigned char address, unsigned char rw, unsigned char wait) {
if(wait == I2C_WAIT) {
while(i2c_write((address << 1) + rw) == -1) {
i2c_stop();
i2c_start();
}
} else {
i2c_write((address << 1) + rw);
}
}