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

Что бы еще такого сделать?... Предлагайте! Обсудим все!!!
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

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

Только вы пропустили еще одно важное слово - " схему". :tea:
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение vvsector85 »

Схему придется нарисовать.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

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

Сообщение *Trigger* »

:facepalm:
У Вас термодатчик по I2C подключен, что ли? Шина I2C синхронная, поэтому на время работы с ней прерывания можно не выключать, в отличие от асинхронной 1Wire, чувствительной к таймингам сигналов.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
Topaloff
Потрогал лапой паяльник
Сообщения: 349
Зарегистрирован: Вс фев 03, 2013 00:47:59
Откуда: Киев

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

Сообщение Topaloff »

...может выключать анодные ключи все?
Аватара пользователя
Apparatchik
Держит паяльник хвостом
Сообщения: 908
Зарегистрирован: Вс май 23, 2010 13:55:42
Откуда: Украина, Александрия

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

Сообщение Apparatchik »

vvsector85 писал(а): А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Это не поможет, при запрещении прерываний неизбежен срыв динамической индикации особенно заметен при различных эфектах смены цифр. Да и вообще запрещать прерывания плохая затея советую посмотреть в сторону подключения ds18b20 через uart, я так делаю ничего не запрещаю и проблем нет.
«И всё-таки она вертится!»
Аватара пользователя
RoboC
Мудрый кот
Сообщения: 1795
Зарегистрирован: Ср апр 04, 2012 09:55:53
Откуда: Северодонецк
Контактная информация:

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

Сообщение RoboC »

Вы все равно собирались выкладывать исходники. Чтоб не гадать как у Вас все сделано.
Блымает скорее опрос 18b20, если вы конечно не запретили прерывания и при опросе 1307.
Обычно,я прячу опрос датчика в задержку между включением следующей цифры,когда все лампы потушены. 200 тиков таймера идёт индикация 50 задержка. Частота ~122Гц.
У того, кто делает — получается редко. У того, кто не делает — не получается никогда.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

В 1-wire критичен только тайм-слот. Который длится всего 120 мкс максимум. Вот на именно это время и следует запрещать прерывания. Все остальное время задержки совершенно не критичны.

А еще тайм-слоты можно делать аппаратно. Используя, например, таймер с compare-capture регистрами, UART-ом или, даже, SPI. Тогда вообще никаких задержек не будет.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
prinv
Вымогатель припоя
Сообщения: 677
Зарегистрирован: Чт янв 20, 2011 09:07:08
Откуда: Пермь
Контактная информация:

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

Сообщение prinv »

vvsector85 писал(а):Схему придется нарисовать.
А на счет запрещения прерываний - обнаружился мелкий глюк - при опросе 1307 едва заметно блымает одна из цифр - запрещение нарушает развертку. Не соображу, как это побороть. Может, частоту развертки повысить? Сейчас около 200Гц.
Точно такая же фигня.
Думаю даже от динамической индикации отказаться.
Никакая контра не уйдёт от нас
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7359
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

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

Сообщение uldemir »

Странно, в моём термометре тоже 1-wire термометр и динамическая индикация. И ничего не блымкает.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение vvsector85 »

Я запретил прерывания и при опросе 1307. Наверное, придется разрешить.
18В20 подключен по I2c, по крайней мере, библиотека так называется, но после запрета прерываний, глюки с неправильными данными прошли.
Аватара пользователя
abc
Друг Кота
Сообщения: 3684
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

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

Сообщение abc »

А что мешает использовать любой другой датчик ?
Вам же не цыплят выращивать, по мне, так и аналоговый (с заводской калибровкой) вполне подойдет.
LM35, напр.
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение 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
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение vvsector85 »

ну так у меня перед задержкой прерывания разрешаются:

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

sei();
_delay_ms(500);      // Жду окончания температурного преобразования
cli();
Или задержку можно вовсе убрать?
Аватара пользователя
SLvik
Друг Кота
Сообщения: 7622
Зарегистрирован: Ср май 28, 2008 00:32:54
Откуда: г. Россия
Контактная информация:

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

Сообщение SLvik »

vvsector85 писал(а):Схему придется нарисовать.
Вот ещё один котейко который схем не рисует.
:beer: :beer: :beer:
:beer: :beer:
:beer:
Последний раз редактировалось SLvik Пн июн 06, 2016 17:12:36, всего редактировалось 2 раза.
Аватара пользователя
abc
Друг Кота
Сообщения: 3684
Зарегистрирован: Чт мар 20, 2008 01:06:40
Откуда: Севастополь

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

Сообщение abc »

vvsector85
да, сорри, увидел :)
>(*.*)<
Котище огромно, ушасто, пушисто, глазасто, зубасто, колючелапо и мявай. (c)
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение vvsector85 »

В общем, убрал запрет на прерывание при опросе 1307, а на 18В20 оставил. Пока все нормально. Выглядит вот так:
Изображение
Изображение
Аватара пользователя
a_winner
Грызет канифоль
Сообщения: 275
Зарегистрирован: Чт сен 24, 2015 17:46:26
Откуда: Обираловка, МО
Контактная информация:

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

Сообщение a_winner »

vvsector85, только не говорите, что у Вас ещё и работа с квадратной шиной программно реализована ногодрыгом...
а 18b20 - это 1wire, а не i2c.
Errare humanum est
Аватара пользователя
vvsector85
Грызет канифоль
Сообщения: 282
Зарегистрирован: Ср июл 08, 2015 22:36:31
Откуда: Харьков, Украина

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

Сообщение 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);
  }
}
Аватара пользователя
a_winner
Грызет канифоль
Сообщения: 275
Зарегистрирован: Чт сен 24, 2015 17:46:26
Откуда: Обираловка, МО
Контактная информация:

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

Сообщение a_winner »

Ндя... в плане портабельности - это хорошо, можно и на attiny запустить, но в меге есть аппаратный i2c всё сильно бы упростилось и кода меньше.
Ну да ладно... Выше Вам правильно сказали, строго выдерживать тайминги i2c нет необходимости, потому что шина синхронная, прерывания можно не запрещать и нічого не буде блимати.
Errare humanum est
Аватара пользователя
КАШАК
Это не хвост, это антенна
Сообщения: 1303
Зарегистрирован: Вс апр 19, 2009 17:20:22
Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
Контактная информация:

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

Сообщение КАШАК »

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

Вернуться в «Умные мысли»