Часы из амперметров и М4761
Часы из амперметров и М4761
Мур-мяу товарищи!
Увидел http://radiokot.ru/circuit/digital/home/93/, решил сделать:) сделал, почти работает) После калибровки стрелки как были в максимальном положении так и остаются. Позже оказалось что прибор имеет логарифмическую характеристику... вот тут я и задумался, а что же мне делать дальше? При настройке часов видно что стрелки дергаются, т.е. время выставляется. Собирать схемку для обратной логарифмической хар-ки, что бы они в месте прямую давали? Можно поменять на другие, условно нормальные, но эти тогда валяться будут:)
Увидел http://radiokot.ru/circuit/digital/home/93/, решил сделать:) сделал, почти работает) После калибровки стрелки как были в максимальном положении так и остаются. Позже оказалось что прибор имеет логарифмическую характеристику... вот тут я и задумался, а что же мне делать дальше? При настройке часов видно что стрелки дергаются, т.е. время выставляется. Собирать схемку для обратной логарифмической хар-ки, что бы они в месте прямую давали? Можно поменять на другие, условно нормальные, но эти тогда валяться будут:)
Re: Часы из амперметров и М4761
Сделал сии часы. Не работают....Начал разглядывать схему и возник вопрос: А чем задается секундная частота? Кварца на 32 кГц не видно.
-
котМатроскин
- Нашел транзистор. Понюхал.
- Сообщения: 193
- Зарегистрирован: Сб фев 02, 2013 10:34:39
кто знает си?
делаю часы
http://radiokot.ru/circuit/digital/home/93/
при срабатывании будильника на 19 вывод подаются пачки импульсов:
около 2 секунд идёт куча импульсов, 2 секунды ноль
а мне нужно не пачки импульсов, а 2 секунды лог1, 2 секунды лог 0
я так понял порту назначна переменная ALARM_OUT, но на неё выхода ШИМ нету
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, но на неё выхода ШИМ нету
Последний раз редактировалось Gudd-Head Пт мар 21, 2014 14:35:09, всего редактировалось 1 раз.
Причина: Сюда перенёс. Нарушение п.2.6 Правил Форума
Причина: Сюда перенёс. Нарушение п.2.6 Правил Форума
-
котМатроскин
- Нашел транзистор. Понюхал.
- Сообщения: 193
- Зарегистрирован: Сб фев 02, 2013 10:34:39
Re: Часы из амперметров и М4761
здесь же никто не ответит


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

- Вложения
-
- Ampermetr_clock.rar
- (907.7 КБ) 597 скачиваний
- Quark_p
- Потрогал лапой паяльник
- Сообщения: 316
- Зарегистрирован: Вт ноя 05, 2013 18:12:13
- Откуда: Полтава
Re: Часы из амперметров и М4761
Собрал таки на печатке, но будильник не работает. Может кто посмотрит исходники что там не так. Часики прикольные получаются. Нужно есче подсветку зеленую сделать. Во вложении печатка.

- Вложения
-
- clock-amp-lay.rar
- (15.31 КБ) 558 скачиваний
Re: Часы из амперметров и М4761
Собрал часы. Будильник не работает. Пробовал подправить прошивку но при компилировании выдает ошибку. Тогда решил скомпилировать авторский исходник на си без моих исправлений все равно ошибка. Обращаюсь ко всем , кто силен в программировании, помогите советом как это исправить, а с будильником сам попробую разобраться.


- Вложения
-
- IMG_4313_1_1.jpg
- (73.85 КБ) 1741 скачивание
-
- Без имени-2.jpg
- (67.59 КБ) 1830 скачиваний
-
- авторская прошивка.rar
- (5.39 КБ) 358 скачиваний
- Quark_p
- Потрогал лапой паяльник
- Сообщения: 316
- Зарегистрирован: Вт ноя 05, 2013 18:12:13
- Откуда: Полтава
Re: Часы из амперметров и М4761
Надо будет достать свои и потыкать осцилом, что там появляется на ножках МК при срабатывании будильника. Может там нужен бузер со встроенным генератором.
Re: Часы из амперметров и М4761
Разобрался с будильником. Подключил BUZ через составной транзистор.Все работает.