Страница 1927 из 2449

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 06:48:56
RoboC
vvsector85 писал(а):Если мой "велосипед" кому-то может быть полезен, могу выложить печатки, исходник и прошивки.
Конечно выкладывайте. Всегда найдется человек, которому это будет интересно.

Только вы пропустили еще одно важное слово - " схему". :tea:

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 08:18:25
vvsector85
Схему придется нарисовать.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 08:46:18
*Trigger*
:facepalm:
У Вас термодатчик по I2C подключен, что ли? Шина I2C синхронная, поэтому на время работы с ней прерывания можно не выключать, в отличие от асинхронной 1Wire, чувствительной к таймингам сигналов.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 08:46:40
Topaloff
...может выключать анодные ключи все?

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 08:56:42
Apparatchik
vvsector85 писал(а): А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Это не поможет, при запрещении прерываний неизбежен срыв динамической индикации особенно заметен при различных эфектах смены цифр. Да и вообще запрещать прерывания плохая затея советую посмотреть в сторону подключения ds18b20 через uart, я так делаю ничего не запрещаю и проблем нет.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 08:57:59
RoboC
Вы все равно собирались выкладывать исходники. Чтоб не гадать как у Вас все сделано.
Блымает скорее опрос 18b20, если вы конечно не запретили прерывания и при опросе 1307.
Обычно,я прячу опрос датчика в задержку между включением следующей цифры,когда все лампы потушены. 200 тиков таймера идёт индикация 50 задержка. Частота ~122Гц.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 11:29:05
uldemir
В 1-wire критичен только тайм-слот. Который длится всего 120 мкс максимум. Вот на именно это время и следует запрещать прерывания. Все остальное время задержки совершенно не критичны.

А еще тайм-слоты можно делать аппаратно. Используя, например, таймер с compare-capture регистрами, UART-ом или, даже, SPI. Тогда вообще никаких задержек не будет.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 11:32:15
prinv
vvsector85 писал(а):Схему придется нарисовать.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Точно такая же фигня.
Думаю даже от динамической индикации отказаться.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 11:37:47
uldemir
Странно, в моём термометре тоже 1-wire термометр и динамическая индикация. И ничего не блымкает.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 11:41:56
vvsector85
Я запретил прерывания и при опросе 1307. Наверное, придется разрешить.
18В20 подключен по I2c, по крайней мере, библиотека так называется, но после запрета прерываний, глюки с неправильными данными прошли.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 12:00:51
abc
А что мешает использовать любой другой датчик ?
Вам же не цыплят выращивать, по мне, так и аналоговый (с заводской калибровкой) вполне подойдет.
LM35, напр.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 12:19:31
vvsector85
Блымание при опросе 18В20, в принципе, не проблема, т. к. опрос происходит только по нажатию кнопки или раз в 2 минуты в режиме с индикацией температуры.
Спойлер

Код: Выделить всё

// Инициализирую 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;
}
Вот код по 18В20

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 12:31:43
vvsector85
ну так у меня перед задержкой прерывания разрешаются:

Код: Выделить всё

sei();
_delay_ms(500);      // Жду окончания температурного преобразования
cli();
Или задержку можно вовсе убрать?

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 12:44:42
SLvik
vvsector85 писал(а):Схему придется нарисовать.
Вот ещё один котейко который схем не рисует.
:beer: :beer: :beer:
:beer: :beer:
:beer:

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 12:46:51
abc
vvsector85
да, сорри, увидел :)

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 14:28:54
vvsector85
В общем, убрал запрет на прерывание при опросе 1307, а на 18В20 оставил. Пока все нормально. Выглядит вот так:
Изображение
Изображение

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 15:21:06
a_winner
vvsector85, только не говорите, что у Вас ещё и работа с квадратной шиной программно реализована ногодрыгом...
а 18b20 - это 1wire, а не i2c.

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 15:33:35
vvsector85
Судя по всему - да. Я взял за основу проект BARSa, для I2C использовал ту же библиотеку, что у него.

Вот она:
Спойлер

Код: Выделить всё

#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);
  }
}

Re: Часы на газоразрядных индикаторах

Добавлено: Пн июн 06, 2016 22:00:32
a_winner
Ндя... в плане портабельности - это хорошо, можно и на attiny запустить, но в меге есть аппаратный i2c всё сильно бы упростилось и кода меньше.
Ну да ладно... Выше Вам правильно сказали, строго выдерживать тайминги i2c нет необходимости, потому что шина синхронная, прерывания можно не запрещать и нічого не буде блимати.

Re: Часы на газоразрядных индикаторах

Добавлено: Вт июн 07, 2016 10:40:31
КАШАК
Всем привет :)
Народ, может есть у кого чертеж отверстия для лицевой панели корпуса под ИН-17? А то не представляю, как измерить изгиб на торцах лампы чтобы корпус правильно нарисовать.