Часы из амперметров и М4761

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Ответить
Marogon
Родился
Сообщения: 1
Зарегистрирован: Вт июл 09, 2013 14:40:43

Часы из амперметров и М4761

Сообщение Marogon »

Мур-мяу товарищи!
Увидел http://radiokot.ru/circuit/digital/home/93/, решил сделать:) сделал, почти работает) После калибровки стрелки как были в максимальном положении так и остаются. Позже оказалось что прибор имеет логарифмическую характеристику... вот тут я и задумался, а что же мне делать дальше? При настройке часов видно что стрелки дергаются, т.е. время выставляется. Собирать схемку для обратной логарифмической хар-ки, что бы они в месте прямую давали? Можно поменять на другие, условно нормальные, но эти тогда валяться будут:)
Реклама
sinod
Родился
Сообщения: 1
Зарегистрирован: Чт апр 04, 2013 14:44:31

Re: Часы из амперметров и М4761

Сообщение sinod »

Сделал сии часы. Не работают....Начал разглядывать схему и возник вопрос: А чем задается секундная частота? Кварца на 32 кГц не видно.
Реклама
котМатроскин
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Сб фев 02, 2013 10:34:39

кто знает си?

Сообщение котМатроскин »

делаю часы
http://radiokot.ru/circuit/digital/home/93/
при срабатывании будильника на 19 вывод подаются пачки импульсов:
около 2 секунд идёт куча импульсов, 2 секунды ноль

а мне нужно не пачки импульсов, а 2 секунды лог1, 2 секунды лог 0
Спойлер

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

/*
 * METER-CLOCK AND WATCH
 * Часы с будильником и индикацией при помощи стрелочных миллиамперметров
 *
 */
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
#include "avr_helper.h"

// число "тиков" 0-го таймера за 1 секунду
#define TICKS_PER_SEC		125
// шкала времени - 12-часовая, т.к. 24 деления на индикаторе - слишком много
#define HOURS_SCALE			12
// значение максимума для 10-битного ШИМА часов
#define PWM_MAX_H			1023UL
// значение максимума для 10-битного ШИМА минут
#define PWM_MAX_M			1023UL

// шаг ШИМа в 1 часе
#define PWM_HOUR_STEP		(PWM_MAX_H / HOURS_SCALE)
// шаг ШИМа в 1 минуте
#define PWM_MIN_STEP		(PWM_MAX_M / 60)
// вывод, к которому подключени вспомогательный индикатор
#define DIV_PIN				_BV(PB2)
// вывод, к которому подключен сигнал будильника
#define ALARM_OUT			_BV(PB7)
// вывод, к которому подключен переключатель КОРРЕКЦИИ ЧАСОВ
#define SET_HOUR			_BV(PD6)
// вывод, к которому подключен переключатель КОРРЕКЦИИ МИНУТ
#define SET_MIN				_BV(PD5)
// вывод, к которому подключен переключатель режима индикации ЧАСЫ-БУДИЛЬНИК
#define ALARM_MODE			_BV(PD0)
// коэффициент ШИМа вспомогательного индикатора ДО ПОЛУДНЯ
#define DIVIDER_AM			20
// коэффициент ШИМа вспомогательного индикатора ПОСЛЕ ПОЛУДНЯ
#define DIVIDER_PM			100
// коэффициент ШИМа вспомогательного индикатора ЦЕНТР
#define DIVIDER_CENTER		62
// для "плавной" индикации надо задать следующий макрос равным НЕ НУЛЮ
#define SOFT_TIME			0

// проверка правильности коэффициентов ШИМа вспомогательного индикатора
#if (DIVIDER_AM > TICKS_PER_SEC) | (DIVIDER_PM > TICKS_PER_SEC) | (DIVIDER_CENTER > TICKS_PER_SEC)
#error DIVIDER_xxx must equal or lower than TICKS_PER_SEC
#endif

// макрос проверки включения режима индикации будильника
#define is_alarm_mode() 	((PIND & ALARM_MODE) == 0)
// макрос проверки режима КОРРЕКЦИИ
#define is_set_mode()		(((PIND & (SET_HOUR | SET_MIN)) ^ (SET_HOUR | SET_MIN)) != 0)
// макрос проверки режима КОРРЕКЦИИ ЧАСОВ
#define is_set_hour_mode()	((PIND & (SET_HOUR | SET_MIN)) == SET_MIN)
// макрос, контролирующий "плавную" индикацию времени
#define soft_time()			(SOFT_TIME && !is_alarm_mode() && !is_set_mode())

// флажок "прошла 1 секунда"
volatile uint8_t 	one_sec_flag;
// текущее время
volatile uint8_t	hour = 10;
volatile uint8_t 	min = 36;
volatile uint8_t 	sec = 0;
// вспомогательный флажок, инвертирующися каждую секунду
volatile uint8_t 	toggle = 0;

// ячеки в EEPROM для хранения уставки будильника
EEMEM uint8_t		dummy = 0;			// это индикатор "первого" запуска программы
EEMEM uint8_t		e_hour, e_min;

// вывод времени на индикаторы
static void show_time(uint8_t h, uint8_t m, uint8_t s){
	static uint8_t sec_ocr = 0;
	uint16_t ocr;

	// индикация на вспомогательном индикаторе
	if(toggle){
		sec_ocr = DIVIDER_CENTER;
	} else {
		sec_ocr = h < HOURS_SCALE ? DIVIDER_AM : DIVIDER_PM;
	}
	OCR0B = sec_ocr;
	toggle = !toggle;

	// вычисление значения коэффициента ШИМ для индикатора часов
	if(h > HOURS_SCALE) h -= HOURS_SCALE;
	ocr = PWM_HOUR_STEP * h;
	if(soft_time() && !(h == HOURS_SCALE)) ocr += PWM_HOUR_STEP * m / 60;
	OCR1A = ocr;

	// вычисление значения коэффициента ШИМ для индикатора минут
	ocr = PWM_MIN_STEP * m;
	if(soft_time()) ocr += PWM_MIN_STEP * s / 60;
	OCR1B = ocr;
}

// обработчик прерывания по совпадению канала B 0-го таймера
ISR(TIMER0_COMPB_vect){
	// выключение сигнала на вспомогательном индикаторе
	PORTB &= ~DIV_PIN;
}

// Обработчик прерывания по совпадению 0-го таймера
// Вызывается TICKS_PER_SEC раз в секунду
ISR(TIMER0_COMPA_vect){
	static uint8_t counter = TICKS_PER_SEC;
	// считаем время
	if(!--counter){
		counter = TICKS_PER_SEC;
		if(++sec >= 60){
			sec = 0;
			if(++min >= 60){
				min = 0;
				sec = 28; // корректировка - каждый час +28.8 секунд
				if(++hour >= (HOURS_SCALE*2)){
					hour = 0;
				}
			}
		}
		// устанавливаем флажок каждую секунду
		one_sec_flag = 1;
	}
	// включаем сигнал на вспомогательном индикаторе
	PORTB |= DIV_PIN;
}

MAIN(){
	// уставка будильника
	uint8_t	alarm_hour, alarm_min;

	if(eeprom_read_byte(&dummy) != 0){
		// первый запуск - EEPROM чистая
correct_alarm:
		eeprom_update_byte(&e_hour, 7);
		eeprom_update_byte(&e_min, 0);
		eeprom_update_byte(&dummy, 0);
	}

	// считывание уставки будильника
	alarm_hour = eeprom_read_byte(&e_hour);
	alarm_min = eeprom_read_byte(&e_min);
	// корректировка уставки для страховки
	if(alarm_hour >= 24){
		alarm_hour = 7;
		goto correct_alarm;
	}
	if(alarm_min >= 60){
		alarm_min = 0;
		goto correct_alarm;
	}

	// таймер 0 - счет времени: делитель 256 и режим CTC с коэффициентом 125 - итого деление 32000
	// а так же управление индикатором-разделителем в режиме программного ШИМ
	OCR0A = TICKS_PER_SEC;
	TCCR0A = _BV(WGM01); 		// CTC
	TCCR0B = TIMER_CLK_DIV_256;

	// таймер 1 обеспечивает просто 10-битный FastPWM для управления стрелками часов и минут
	TCCR1A = _BV(WGM10) | _BV(WGM11) | TIMER_OC_CLEAR(1A) | TIMER_OC_CLEAR(1B);
	TCCR1B = TIMER_CLK_DIV_1;
	// прерывания разрешены от 0-го таймера по совпадению каналов А и B
	TIMSK = _BV(OCIE0A) | _BV(OCIE0B);

	// порты переключателей
	DDRD = 0;
	PORTD = 255;

	sei();

	while(1){
		if(ACSR & _BV(ACO)){
			// если компаратор сработал - питание от батарейки - выключить индикацию
			DDRB &= ~(_BV(PB4) | _BV(PB3) | DIV_PIN);
		} else {
			// иначе обычная индикация
			DDRB |= (_BV(PB4) | _BV(PB3) | DIV_PIN);
		}

		while((PIND & (_BV(PD4) | _BV(PD3) | _BV(PD2))) ^ (_BV(PD4) | _BV(PD3) | _BV(PD2))){
			// режим калибровки индикаторов
			OCR1A = PWM_MAX_H;
			OCR1B = PWM_MAX_M;
		}

		if(is_alarm_mode()){
			// режим будильника
			if(is_set_mode()){
				// режим корректировки
				if(is_set_hour_mode()){
					// корректировка часов
					if(++alarm_hour >= (HOURS_SCALE * 2)) alarm_hour = 0;
				} else {
					// корректировка минут
					if(++alarm_min >= 60) alarm_min = 0;
				}
			}
			// вывод уставки будильника
			show_time(alarm_hour, alarm_min, 0);
			// обновление памяти
			eeprom_update_byte(&e_hour, alarm_hour);
			eeprom_update_byte(&e_min, alarm_min);
		} else {
			// режим индикации времени
			if(is_set_mode()){
				// режим корректировки
				if(is_set_hour_mode()){
					// коррекция часов
					if(++hour >= (HOURS_SCALE * 2)) hour = 0;
				} else {
					// корреция минут
					if(++min >= 60) min = 0;
				}
			}
			// индикация времени
			show_time(hour, min, sec);
		}
		// срабатывание будильника
		if((hour == alarm_hour) && (min == alarm_min) && toggle){
			PORTB |= ALARM_OUT;
		} else {
			PORTB &= ~ALARM_OUT;
		}
		// ожидание флага обновления
		while(!one_sec_flag && );
		one_sec_flag = 0;
	}
}

я так понял порту назначна переменная ALARM_OUT, но на неё выхода ШИМ нету :shock:
Последний раз редактировалось Gudd-Head Пт мар 21, 2014 14:35:09, всего редактировалось 1 раз.
Причина: Сюда перенёс. Нарушение п.2.6 Правил Форума
котМатроскин
Нашел транзистор. Понюхал.
Сообщения: 193
Зарегистрирован: Сб фев 02, 2013 10:34:39

Re: Часы из амперметров и М4761

Сообщение котМатроскин »

здесь же никто не ответит :kill: :kill: :kill:
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Quark_p
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Вт ноя 05, 2013 18:12:13
Откуда: Полтава

Re: Часы из амперметров и М4761

Сообщение Quark_p »

Собрал на весу схемку, вроде работает. Сейчас проверю точность хода. Будильник не проверял пока. Перерисовал схему в более удобоваримом виде. Печатку делать не буду, хватит и монтажки. Пойду завтра на рынок искать винтажные микроамперметры. Во вложении схема, фьюзы, прошивка, исходники. Потребляет 38-40 мА по 5В. Жаль автора на форуме не видно с 2012 года.
Изображение
Вложения
Ampermetr_clock.rar
(907.7 КБ) 599 скачиваний
Реклама
Аватара пользователя
Quark_p
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Вт ноя 05, 2013 18:12:13
Откуда: Полтава

Re: Часы из амперметров и М4761

Сообщение Quark_p »

Собрал таки на печатке, но будильник не работает. Может кто посмотрит исходники что там не так. Часики прикольные получаются. Нужно есче подсветку зеленую сделать. Во вложении печатка.
Изображение
Вложения
clock-amp-lay.rar
(15.31 КБ) 559 скачиваний
Реклама
Fed5v
Родился
Сообщения: 18
Зарегистрирован: Чт апр 02, 2015 09:19:06

Re: Часы из амперметров и М4761

Сообщение Fed5v »

Собрал часы. Будильник не работает. Пробовал подправить прошивку но при компилировании выдает ошибку. Тогда решил скомпилировать авторский исходник на си без моих исправлений все равно ошибка. Обращаюсь ко всем , кто силен в программировании, помогите советом как это исправить, а с будильником сам попробую разобраться.

Изображение

Изображение
Вложения
IMG_4313_1_1.jpg
(73.85 КБ) 1746 скачиваний
Без имени-2.jpg
(67.59 КБ) 1835 скачиваний
авторская прошивка.rar
(5.39 КБ) 359 скачиваний
Аватара пользователя
Quark_p
Потрогал лапой паяльник
Сообщения: 316
Зарегистрирован: Вт ноя 05, 2013 18:12:13
Откуда: Полтава

Re: Часы из амперметров и М4761

Сообщение Quark_p »

Надо будет достать свои и потыкать осцилом, что там появляется на ножках МК при срабатывании будильника. Может там нужен бузер со встроенным генератором.
Fed5v
Родился
Сообщения: 18
Зарегистрирован: Чт апр 02, 2015 09:19:06

Re: Часы из амперметров и М4761

Сообщение Fed5v »

Разобрался с будильником. Подключил BUZ через составной транзистор.Все работает.
Ответить

Вернуться в «Статьи»