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

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

Сообщение RoboC »

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

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

Сообщение vvsector85 »

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

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

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

Сообщение Topaloff »

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

Сообщение Apparatchik »

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

Сообщение RoboC »

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

Сообщение uldemir »

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

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

Сообщение prinv »

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

Сообщение uldemir »

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

Сообщение vvsector85 »

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

Сообщение abc »

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

Сообщение vvsector85 »

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

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

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

Сообщение SLvik »

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

Сообщение abc »

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

Сообщение vvsector85 »

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

Сообщение a_winner »

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

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

Сообщение a_winner »

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

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

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

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