Самые простые часы на AVR


Задумал я к дню рождения любимой собрать часы. Выпаял со старой платы микроволновки семисегментный индикатор с двоеточием и полез в интернет искать схему и прошивку на предмет простого повторения.

И вот просматриваю я одну за одной огромные статьи с описанием часов с огромным количеством функций, будильником, таймером, календарем и датчиком температуры и думаю: в часах мне нужно только отображение времени, и по большому счету, в тех, что висят у меня на стенке, не хватает только ночной подстветки. Так что мне нужны только функции времени. И потому схему и программу нужно максимально упростить.

UPD: Оформил в корпус.


Ради упрощения схемы я решил не использовать микросхемы часов реального времени и сделать все на одном микроконтроллере. После беглого просмотра даташитов, я остановился на ATmega16 в корпусе TQFP, который нашелся у меня в коробке.

Все, что нам нужно — подключить семисегментник в режиме динамической индикации, две кнопки для установки часов и минут и организовать часы.

Чуть не забыл! Нужно сделать резервное питание, чтобы при отключении основного источника часы не сбрасывались, но выключалась индикация и потребление снижалось до минимума.

Схема получилась вот такая:
Самые простые часы на AVR
Индикатор с общим анодом, аноды подключены напрямую к порту C микоконтроллера, резисторы сегментов я поставил 220 Ом, можно даже меньше больше, ночью очень ярко светятся (То есть, можно и меньше, но не меньше 100 Ом, тогда на каждую ножку порта будет нагрузка 35мА максимум, а по даташиту можно 40мА). Неправильно посчитал. Надо больше. Гораздо больше… Переделал на 560 Ом, и то ток больше чем по даташиту. Но работает.
На транзисторе Q1 сделан детектор напряжения питания. Он, как и кнопки, подключен на линии внешних прерываний, у ATMega16 их всего три.

Часы организуются с помощью асинхронного режима Тimer2. В этом режиме таймер тактируется от внешнего кварца на 32768 Гц и не останавливается в спящем режиме микроконтроллера, что мы и будем использовать при работе часов от резервного источника.

Теперь разберем код:
Динамическая индикация использует Timer0, часы на Timer2, кнопки на внешних прерываниях Int0 и Int1, контроль питания на внешнем прерывании Int2.
В основном цикле осталось только преобразование времени в двоично-десятичное и уход в спячку, причем функцию Bin2BCD специально сократил, потому что минут и часов не бывает больше 100, значит, нет смысла проверять ее на 10000, 1000 и 100.
Сама функция времени была взята из AVR ApNote134 и урезана до необходимых размеров.
Установку часов и минут сначала поместил в обработку прерывания счетчика секунд, но потом решил, что шаг в одну секунду — это слишком медленно и переместил в обработчик динамической индикации, подобрав опытным путем количество переполнений таймера для нормальной скорости коррекции.

// ANTONLUBA 2013
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>
#include "bits_macros.h"

typedef struct{ 
    unsigned char second;
    unsigned char minute;
//    unsigned char hour;
//    unsigned char date;
//    unsigned char month;
//    unsigned int year;
}time;

time t;

uint8_t segment[] = 
		//pgfedcba
		{
		0b00111111, 	//0
		0b00000110,	//1
		0b01011011,	//2
		0b01001111,	//3
		0b01100110,	//4
		0b01101101, 	//5
		0b01111101,	//6
		0b00000111,	//7
		0b01111111, 	//8
		0b01101111	//9
		};

#define SEG_PORT PORTA	
#define SEG_DDR DDRA
#define SEG_CONN 0b01111111

#define DRV_PORT PORTC	
#define DRV_DDR DDRC
#define DRV_CONN 0b00011111

uint8_t digits[5];
uint8_t current_digit;

void BIN2BCD(uint8_t *buffer, unsigned int n)
{
	buffer[1]=0;
	while(n>=10) {buffer[1]++;n-=10;}
	buffer[0]=n;
}

uint8_t power_on = 1;		//питание есть
uint8_t m_pressed = 0, h_pressed=0; //нажаты кнопки
uint8_t button_delay;		//счетчик цикла задержки
int main(void)
{ 
    // Ждем стабилизации внешнего резонатора.
    _delay_ms(500);

    // Конфигурируем порты семисегментника
	SEG_PORT=0xFF;
	SEG_DDR=SEG_CONN;

	DRV_PORT=0x00;
	DRV_DDR=DRV_CONN;

	PORTD|= 0b1100;		//Это подтяжка для кнопок
	DDRD=0;

	SetBit(PORTB,2);	//Это подтяжка для датчика питания
	DDRB=0;
	//таймер0 для динамической индикации
	TCCR0 = (1<<CS01)|(1<<CS00);//3
	
	//внешние прерывания
	MCUCR |= (0<<ISC11)|(1<<ISC10)|(0<<ISC01)|(1<<ISC00);//прерывания INT0 и INT1 по изменению
	MCUCSR |= (1<<ISC2); //прерывание 2 по нарастанию
	GICR |= (1<<INT1)|(1<<INT0)|(1<<INT2); //включить внешние прерывания

    // Отключаем прерывания Таймера 2.
    TIMSK &= ~(_BV(TOIE2) | _BV(OCIE2));

    // Переводим Таймер 2 в асинхронный режим (тактирование от
    // часового кварцевого резонатора).
    ASSR |= _BV(AS2);

    TCNT2 = 0x00;
    TCCR2 = 0x05; //Устанавливаем коэффициент деления равным 128.
    OCR2  = 0x00;

    // Ждем готовности таймера.
    while (ASSR & (_BV(TCN2UB) | _BV(OCR2UB) | _BV(TCR2UB)));

    // Разрешаем прерывание от Таймера 2.
    TIMSK |= _BV(TOIE2);
	// И таймера0
	TIMSK |= (1<<TOIE0);

    // Разрешаем прерывания глобально.
    sei();

    while(1)
    {
	if (power_on)
	{	
		BIN2BCD(&*digits, t.minute);
		BIN2BCD(&*digits+2, t.hour);
	}
	sleep_enable();
	sleep_cpu();
        sleep_disable();

	// Не понял, что это, но без него работает
       // TCCR2=0x05;           // Write dummy value to Control register
        // Ждем готовности таймера 2.
       // while (ASSR & (_BV(TCN2UB) | _BV(OCR2UB) | _BV(TCR2UB)));
    }

    return 0;
}


ISR(TIMER2_OVF_vect) //overflow interrupt vector
{ 	
	//Это просто взято из аппноута, кроме суток, месяцев и лет
    if (++t.second==60)     //keep track of hours minutes
    {
        t.second=0;
     	
		if (++t.minute==60)
        {
            t.minute=0;

            if (++t.hour==24)
            {
                t.hour=0;
            }
        }
    } 
}

ISR(INT0_vect)
{
h_pressed=(BitIsClear(PIND, 2)); //нажатие кнопки часов
}

ISR(INT1_vect)
{
m_pressed=(BitIsClear(PIND, 3)); //нажатие кнопки минут
}

ISR(INT2_vect)
{
ClearBit(GICR,INT2);		//отключим прерывание INT2

InvBit(MCUCSR,ISC2);		//переключим на ожидание спада
power_on=(BitIsSet(MCUCSR,ISC2));//установим переменную

if (power_on)		//если питание есть
	{
	DRV_DDR=DRV_CONN;	//включаем аноды
	TCCR0 |= (1<<CS01)|(1<<CS00);//включаем таймер0
	}
else			//если питания нет
	{
	DRV_DDR=0;	//отключаем аноды
	TCCR0 &= ~((1<<CS01)|(1<<CS00)); //выкл таймер0
	}

SetBit(GICR,INT2);	//вкл прерывание INT2

}

ISR(TIMER0_OVF_vect)
{
	if (power_on) // если питание включено
	{
		DRV_PORT=0;	//выкл все разряды
		if (current_digit==4)	//если точечки
		{
			if (BitIsSet(t.second,0)) //включить-выключить точечки
			{
				SEG_PORT=0b01111001;
			}
			else
			{
				SEG_PORT=0b01111111;
			}
		}
		else		//если цифра
		{
			SEG_PORT=~segment[digits[current_digit]]; //вывести цифру
		}
		SetBit(DRV_PORT, current_digit);    //включить текущий разряд
		if (++current_digit==5)		//если прошли все разряды				
		{
			current_digit=0;	//сначала
			
			if (++button_delay==20)	// с задержкой
			{
				button_delay=0;
				if (h_pressed)	//если нажата кнопка часов
				{
	   				if (++t.hour==24)//корректировать часы
            		{
	            		t.hour=0;
    	        	}
				}
				if (m_pressed) //если нажата кнопка минут
				{
					if (++t.minute==60) //корректировать минуты
        			{
            			t.minute=0;
					}
				}
			}
		}
	}
}


Для начала я собрал макет на Pinboard2:


После того, как все заработало, на радостях быстро развел платку, вытравил, просверлил запаял, но когда начал припаивать проводки для прошивки, увидел, что после недавней работы с Mega8, забыл про самое главное — вывод сброса ))). Пришлось кидать проводок.

Плату делал ЛУТом. Сначала попробовал ламинатором, но, видимо, температуры в 170 градусов оказалось недостаточно и перевелось все плохо. Так что сделал по-старинке утюгом. В этой плате я впервые провел две дорожки под резистором 1206. Как видите, получилось нормально.

Во фьюзах нужно выставить внутренний RC-генератор на 4 или 8 МГц и отключить JTAG.

Ну и, как обычно, несколько фоток:



Во вложении исходник, схема, файл Протеуса для моделирования, прошивка.

UPD: Оформил в корпус:

Коробочку взял от автомобильного ароматизатора. Под индикатор подложил антистатический пакетик в один слой.
Кстати, параметры делителя датчика напряжения питания в итоге получились 39кОм и 6.2кОм.
END_UPD
Файлы в топике: SClock.zip

Комментарии (86)

RSS свернуть / развернуть
Извиняюсь за критику, но я второй раз подряд в Ваших статьях вижу выражения типа

BIN2BCD(&*digits+2, t.hour);


Зачем разадресовывать указатель я потом брать адрес?

Можно просто
BIN2BCD(digits+2, t.hour);

ну или так
BIN2BCD(&digits[2], t.hour);
0
ну или так
BIN2BCD(&digits[2], t.hour);
Делал так, работало, но компилятор почему-то выдавал warning
а сейчас ничего не выдает.
Правда, я в причинах не разбирался особо, может, нужно было этот варнинг отключить просто…
0
BIN2BCD(&digits[2], t.hour);
Делал так, работало, но компилятор почему-то выдавал warning

Странно, данная конструкция законна, варниногов быть не должно.
Но все же более «классической» является запись BIN2BCD(digits+2, t.hour);
0
второй раз подряд
кстати, в этой программе просто копипаста с прошлой программы))))
0
что жена сказала?
0
Понравились
0
Вы всётаки постарайтесь свои конструкции как-то оформлять. Нравиться ей голая плата с индикатором может только потому что бы вас не обидеть.
0
Согласен. Без светофильтра при свете плохо видно индикацию.
0
для светофильтра пока ничего подходящего не нашел
0
У меня была индикация красными семисегментниками. Я просто взял прозрачное оргстекло и из балончика покрасил его чёрным. Сначала см с 20 разок, просушил, подсветил, решил что мало, прошёл ещё раз. Стало отлично. Индикатор не видно, а цифры через тонкий слой отлично просвечиваются. Краска в балоне из автомагазина. Для твоего индикатора можно другой цвет попробовать.
0
Красный?  — легко! Кто раньше занимался плёночной фотографией, сейчас распродают оборудование за копейки. Из светофильтра от красного лабораторного фонаря можно нарезать немало красных окошек. Вот с зелёными, жёлтыми и другими стёклами — трудности.
0
Я для светофильтра в часах на семисегментниках использовал антистатичный пакетик в два слоя, в котором детали приходят, на вид он немного зеркальный. В выключенном состоянии за ним ничего не видно а во включенном видны только горящие сегменты, при любом освещении.
Сверху такой светофильтр прижат кусочком прозрачного пластика (от коробки CD) а ещё сверху наклейка с вырезом ровно под индикатор, чобы скрыть неровные края сфетофильтра.
0
(То есть, можно и меньше, но не меньше 100 Ом, тогда на каждую ножку порта будет нагрузка 35мА максимум, а по даташиту можно 40мА).
А ты случаем не забыл, что при этом через пин разряда идет ток в восемь раз больше? В частности, у тебя — порядка 130мА на пин. Кроме того, даже если есть разрядные ключи — не стоит забывать о предельно допустимом токе через шины питания МК (обычно в диапазоне 200-400мА для атмег).
На транзисторе Q1 сделан детектор напряжения питания.
А зачем транзистор? Что мешало непосредственно на пин завести? Ну, не совсем непосредственно, через резистор.
ISR(INT0_vect)
{
  h_pressed=(BitIsClear(PIND, 2)); //нажатие кнопки часов
}

ISR(INT1_vect)
{
  m_pressed=(BitIsClear(PIND, 3)); //нажатие кнопки минут
}

Ну и какой в этом смысл? Можно было просто вместо if(m_pressed) написать if(BitIsClear(PIND, 3)) (алсо, пины кнопок лучше задать макросами, да и можно сделать макрос вида #define M_PRESSED BitIsClear(PIND, 3)). Добро б хоть тут антидребезг был… Но если ты опрашиваешь в таймере с периодом 10мс и более, то он автоматом реализуется.
+1
  • avatar
  • Vga
  • 10 июня 2013, 00:01
А ты случаем не забыл
Не груби, индикация динамическая, откуда там в 8 раз больше возьмется? 35мА ток анода, ток сегмента 5 мА.
Что мешало непосредственно на пин завести?
Я уже после сообразил, что лучше всего было сделать на компараторе, сравнивать +5V с Vcc, как только +5 упало ниже Vcc, переходим в режим спячки. Ну и наоборот.
Можно было
Да, можно, я только учусь, а на что это повлияет? Место освободится? скорость прибавится? Ну ты понял. И никакого дребезга там не может быть, потому что выжидается период в таймере0 и только затем начинается смена показаний. Если кнопка будет бесконечно дребезжать, часы вообще не переведешь.
0
Не груби, индикация динамическая, откуда там в 8 раз больше возьмется? 35мА ток анода, ток сегмента 5 мА.
Во первых, я не считаю это грубым.
Во вторых, у тебя поразрядная индикация, а резисторы стоят в сегментах. Впрочем, это ты уже и сам понял.
Я уже после сообразил, что лучше всего было сделать на компараторе, сравнивать +5V с Vcc, как только +5 упало ниже Vcc, переходим в режим спячки. Ну и наоборот.
Зачем? +5V на любой пин (лучше INT) через резистор (чисто для защиты, 1-10к). У AVR пины — ТШ с порогом около 1.5В. В остальном — изменится только полярность сигнала питания. Кроме того, ОА индикатор довольно удобен тем, что его аноды через ключи можно подцепить к внешнему питанию, тогда он погаснет сам вместе с внешним питанием (питание все равно надо мониторить — чтобы не тратить батарейку на качание ключами и прочим).
Да, можно, я только учусь, а на что это повлияет? Место освободится? скорость прибавится?
Просто бессмысленный кусок кода. Если его убрать — код будет чище и понятнее, что само по себе хорошо. Опять же, можно будет кнопки повесить куда угодно, а не на пины с прерываниями (если делать на ATMEGA8, например, то прерываний всего два, а детектору питания оно нужнее). Дребезг при периодическом опросе с периодом более времени дребезга фильтруется автоматически (хотя я однажды ступил и воткнул фильтрацию дребезга в подобном месте, в итоге она только мешается), button_delay нужна скорее для того, чтобы скорость автоинкремента была разумной (сложно ставить часы, когда циферки при нажатой кнопке крутятся с частотой герц 50).
Как же у меня все не пыхнуло до сих пор, уфф.
AVR довольно дубовые… Ну и средний ток пина в пять раз меньше.
0
аноды через ключи можно подцепить к внешнему питанию
Хотел чтоб деталей поменьше и платка по размеру индикатора.
если делать на ATMEGA8
У нее асинхронного таймера нет. Или я опять напутал?
button_delay нужна скорее для того, чтобы скорость автоинкремента была разумной
Ну да, а заодно и от дребезга избавляет
-1
Хотел чтоб деталей поменьше и платка по размеру индикатора.
Без ключей — придется ставить ток сегмента в районе 5мА. А для малогабаритности — есть SOT23 и даже мельче.
У нее асинхронного таймера нет. Или я опять напутал?
А слона-то я и не приметил… С другой стороны, ее можно всю от часового кварца затактировать, будет не так уж много жрать в режиме постоянного тиканья, оно же не все время от батарейки питается, так что совсем уж ультранизкое потребление необязательно.
Ну да, а заодно и от дребезга избавляет
От дребезга избавляет сам принцип опроса по таймеру (правда, тут зависит от его частоты, с какой частотой он переполняется?)

Еще я не совсем понимаю две вещи:
1) Зачем засыпать даже если есть внешнее питание?
2) Timer0 вроде как не должен работать в слипе, но без него не работала бы динамическая индикация. Как-то странно.
0
Я сильно не разбирался, но, похоже, sleep_cpu это Idle mode по datasheetу, то есть таймеры работают и прерывания тоже.
0
Вообще, насколько я знаю, перед sleep'ом надо выбрать нужный режим сна. Ну и если уж используется асинхронный таймер 2 — то входить в самый глубокий, из которого по этому таймеру можно проснуться. Ну и не входить в сон при сетевом питании — там это только мешает.
Померяй, сколько оно жрет от батарейки при отсутствии внешнего питания?
0
У нее асинхронного таймера нет.
Странно, а я на нём когда-то часы делал. На несуществующем таймере)))
Да и даташит говорит, что есть.
0
Опа! Точно. Почему я его не заметил? Наверное, искал, куда второй кварц подключить, а у него выводы совмещенные…
0
Еще, кажется, мне двух внешних прерываний показалось мало, и у меня свободной Меги8 не было, она в вольтметре используется.
0
А ты еще спрашиваешь, зачем убирать бессмысленные ISR'ки на INT0 и INT1)
0
Есть там асинхронный таймер. Только он совмещен с выводами основного тактирования. Т.е. ты можешь заставить микросхему тикать от RC, а таймер2 у тебя будет тикать от часового кварца. В спячку бросаешь весь проц, а таймер2 его будет раз в секунду когда надо данные обновить.
+1
— Ты жену по утрам будишь?
— Буду!
:-)
0
+5V на любой пин (лучше INT) через резистор (чисто для защиты, 1-10к).
Не надежное решение.
У AVR пины — ТШ с порогом около 1.5В.
Чуешь, чем это грозит? Разрядом батарейки.
При пропадании питания напряжение в точке 5V упадет до ~3V, а дальше питание будет идти от батарейки. При этом конденсатор на входе будет очень медленно разряжаться через пин МК настроенный на ввод (и лучше бы на нем не было настроено подтяжки). А вместе с ним и резервная батарейка.
Хотя бы резисторный делитель или dummy нагрузку для разряда ёмкостей ниже уровня отключения (В данной схеме ими служит делитель в базовой цепи).
+1
Даже через этот делитель отключается индикатор только через секунду-две после отключения внешнего питания. Потому и подумал про компаратор.
0
Достаточно немного уменьшить номиналы. Сделать скажем 4.7к + 1к. Тогда при достижении 3-х вольт на базе будет 0.5В и меньше, чего уже будет достаточно для выключения транзистора. В рабочем же режиме ток через базу не привысит 1мА, опасаться ничего не стоит. А лишний миллиампер от БП не столь критичен, учитывая что подсветка потребляет значительно больше.
Вообщем компаратор — это лишнее. Просто подберите номиналы резисторов для надежного отключения при 3В (а желательного при 4-3.5В, т.е. простор есть).
Единственная проблема, что вижу, при отключении подсветки напряжение несколько поднялось -> снова включаем подсветку -> снова упало… (в БП большой кондер, а провода они не идеальные).
0
Во первых, сейчас там такой же порог. Во вторых, можно (точнее, даже нужно) предусмотреть быстрый разряд конденсаторов при пропадании питания (например, если запитать индикаторы через ключи не от питания МК, а от внешнего питания, то они быстро выжрут кондеры и потухнут). Ну и в третьих, можно включить не через резистор, а через делитель и поднять порог до любого желаемого значения.
0
Во первых, сейчас там такой же порог.
Нет, сейчас там отрубание при 1В, и один вольт достигается быстрее, потому что уже ест ь некая цепь разряда ввиде делителя в базе (точнее даже резистор и базовый переход).
Ну и в третьих, можно включить не через резистор, а через делитель и поднять порог до любого желаемого значения.
Вы забыли про гистерезис у пинов МК. Стремясь достичь более высокого уровня напряжения для отключения подсветки, мы получим отказ от её включения при появлении питания.
В текущей версии конечно присутвтует «дребизг», и он может стать проблемой, но и от него есть некоторая защита в виде того самого гистирезиса пина. Малые колебания должен нейтрализовать, от больших предусмотреть задержку включения.
Транзистор оказывается не лишним :)
0
Нет, сейчас там отрубание при 1В
Там делитель 1:1, пороговое напряжение транзистора — примерно 0.7В — получается около 1.4В. Нагрузка (или иная схема быстрого разряда основного питания) — это да, я ее подразумевал, но забыл про нее сказать.
Вы забыли про гистерезис у пинов МК. Стремясь достичь более высокого уровня напряжения для отключения подсветки, мы получим отказ от её включения при появлении питания.
Гистерезис, насколько я помню, не настолько велик, чтобы помешать надежному переключению пина при изменении напряжения между 3В и 5В.
0
Ну давайте глянем. У меня вот завалялся даташит на ATtiny2313 (какие же неудобные даташиты у авр, фиг найдешь то, что надо).
В соответсвии с ним, для того, что бы иметь нулевой уровень, при достижении 3В в питании нам надо получить 0.9В на пине для низкого уровня, который может быть максимум 0.3Vcc — дальше уже можно не писать :)
Т.е. какой бы ни был делитель для получения низкого уровня в 0.3Vcc (максимальный уровень нуля), мы никогда с помощью этого же делителя не получим 0.6Vcc (минимальный уровень единицы).
-1
какие же неудобные даташиты у авр, фиг найдешь то, что надо
И то правда. Причем в шите (правда, preliminary) на мегу16 нужных данных даже нет (хотя в шите на тини13 я их точно находил).
Но ты не те денные смотришь. Это требования к логическим уровням цифрового сигнала, нас же здесь интересуют конкретные параметры ТШ на входе пина.
В даташите на ATMEGA8A эти данные уже есть. Рисунки 26-37..26-39. Верхний порог ~2.7В, нижний ~2.2В, гистерезис 0.45В. Правда, они привязаны к напряжению питания (странно, а по даташиту на тини13 мне казалось что не привязаны), вот это уже усложняет задачу. Для различения 3В и 5В делитель придется делать из стабилитрона на 2В и резистора. Ну или озадачиться быстрой разрядкой внешнего питания и не заморачиваться на различение 3В и 5В вообще (собсна, сейчас так и есть, несмотря на транзистор).
0
Я вот смотрю и все больше склоняюсь к компаратору, кажется, его использование избавляет от всех этих проблем разом. Правда, нужно все переделать, и плату и программу… А я уже другим интересным проектом занялся. Так что пока так.
0
Для такой задачи это оверкилл, ИМХО.
0
Упс. Неправильно посчитал.
0
Посчитал еще раз, получается, чтобы ток пина не превысить, нужно 875 Ом минимум в сегменты. Ну или транзисторы ставить в аноды… Как же у меня все не пыхнуло до сих пор, уфф.
0
АВР очень пофигистичные контроллеры. У нас тини2313 в соике сами выпаивалитсь и падали с плат от переполюсовки, и после этого оставались рабочими))))
А перегрузить кристалл по току так, чтоб он сгорел, у меня так и не вышло. При превышении в несколько раз он тупо отказывался стартовать или запускался через раз.
0
Я такое делал, если нужно было вырубить вложенный цикл при нажатии кнопки. Т.е. по сути это установка флага (семафора?). Чтобы не получилось так что один цикл брякнется, кнопка отпустится, а второй цикл продолжит крутиться, и нажатие кнопки проигнорируется.
0
Гм, отвечал на пост Vga который от 10 июня 2013, 00:54
0
Все нормально. Кликни на мелкую стрелочку "↑" под постом и убедишься, что ответ именно на него.
+1
Я предлагаю в качестве этого семафора использовать непосредственно бит в порту — который сразу поменяется и без прерываний, аппаратно. И на AVR это достаточно эффективно — там есть инструкции проверки битов в регистрах.
0
Ааа!!! Мну обманули!!! В шапке стрелочные часы нарисованы!!! Думал, будет про рулеж электромеханическими (вторичными или первичными индикаторными)… Обманули! Ы-ы-ы-ы!!!.. (((
+2
Оформил в корпус
0
Фотку бы в корпусе добавить в статью.
0
Так в самом начале UPD:
0
Гы. до начала я не домотал. Остановился на макете перед протравленной платой.
Поскольку это апдейт, как отображение результата, то логичнее разместить его в конце.
0
Зато так видно не заходя под кат
0
Сделал, как вы сказали, действительно, так логичнее получается.
0
Не сильно-то оно от того изменилось.
Кстати, от его оно питается?
0
Фотка плохая получилась, солнце светило в окно)))
Питается от импульсника на 5В, то ли 500мА, то ли 1А, вытащил откуда-то давно, обмотан синей изолентой ))
0
Не в том дело, а в самом корпусе и исполнии.
Кстати, на индикаторе есть двоеточие, насколько я вижу. Почему не задействовал?
0
Не в том дело, а в самом корпусе и исполнии.
Мне еще много корпусов сделать надо… А с выбором у нас тут плохо…
Кстати, на индикаторе есть двоеточие, насколько я вижу. Почему не задействовал?
А вот?
0
А вот?
Оно моргает каждую секунду.
0
Гы, действительно. Остальные фотки попали на момент, когда оно погашено?
0
еще одна, где горит, остальные — погашено. Снимал на телефон, а там не угадаешь…
0
BIN2BCD — для часов, вообще пережиток, лишний он.
0
А вы как предлагаете? Сразу в BCD складывать?
0
Да, представляете это возможно. И именно для Вашего исполнения часов.
0
Можно поподробней? :)
0
видел такое решение.
там вывод этой схемы:
делитель
подключен к аналоговому компаратору.
дальше при падении внешнего питания появляется прерывание от компаратора по которому очень быстро гасим питание всей периферии вокруг контроллера и в спящий режим…
0
Здравствуйте, можно ли применить в схеме микроконтроллер AtMega16L-8AU?
0
Да.
0
Без корпуса было красивее чем в корпусе
+1
Если применить микроконтроллер atmega16l-8au, то надо ли вносить изменения в прошивке и в схеме? Или все также останется, то есть без никаких либо изменении?
0
Не надо.
Не судьба почитать даташит и выяснить, что ATMEGA16L отличается от ATMEGA16 только максимальной частотой? А также глянуть в схему и описание, и убедиться, что она работает от внутреннего генератора и, следовательно, частота гарантированно укладывается в допустимые для L-ки 8МГц.
0
И зачем я это писал для Вас?
0
Упс. Виноват. Сообщение должно быть выше. Для farkhat
0
Так ты туда и ответил. Дерево ж.
P.S. А в этом топике-то часики другие.
0
Какие диоды можно применить и можно ли вставить li-ion аккумулятор?
0
Диоды любые. 4148 в безвыводных корпусах есть.
Насчет лития — Можно, но он должен быть с защитой от переразряда и контроллером зарядки. Тогда можно и индикатор не отключать, или отключать, скажем, при 15% заряда. Хватит надолго.
0
Диоды любые. 4148 в безвыводных корпусах есть.
Насчет лития — Можно, но он должен быть с защитой от переразряда и контроллером зарядки. Тогда можно и индикатор не отключать, или отключать, скажем, при 15% заряда. Хватит надолго.
0
а на схеме у вас 5 индикаторов?
0
Да. В железе тоже 5, только пятый — не цифра, а пять стрелок и две точечки. При этом подключен, как обычная семисегментная цифра.
0
привет, хотел сделать часы на большом семисегментном индикаторе, но у нас в городе не оказалось, теперь хочу сам собрать на светодиодах. на один сегмент поставил 2 светодиода, 1 светодиод потребляет 15 мА, напряжение 3,5 В, получается с одного индикатора 210 мА, какой можно здесь применить транзистор? выдержат ли порты микроконтроллера на порте А?
0
Ставь подходящие «мосфеты»
0
Какой транзистор? Q1 по схеме из топика? Он не имеет отношения к индикатору. Разрядные ключи (на схеме их нет)? Любой транзистор подходящей структуры на достаточный ток. Есть биполяры на 0.5А в SOT23.
выдержат ли порты микроконтроллера на порте А?
Это те, что управляют разрядами? Нет. Надо ставить внешние разрядные ключи.
0
Случайно подумалось, что в этом случае можно программу переделать под сегментную индикацию.
Смысл такой:
Гасятся все сегменты;
Включается нужный разряд;
Поочередно включаются на короткое время и гасятся нужные сегменты;
Следующий сегмент.

Так можно не выходить за пределы допустимого тока.
0
Не совсем понял, что именно ты предлагаешь.
Первый вариант — динамическая посегментная индикация. Включаем сегмент А и все разряды, где он засвечен. Затем сегмент В и все разряды, где он засвечен. И так далее.
Второй вариант — зажигаем разряд, поочередно перебираем в нем сегменты, в каждый момент горит только один сегмент в одном разряде.
Но, в общем, оба варианта сводятся к снижению среднего тока сегмента и его яркости — с тем же успехом можно просто увеличить резисторы.
0
на один сегмент поставил 2 светодиода, 1 светодиод потребляет 15 мА, напряжение 3,5 В, получается с одного индикатора 210 мА
Речь об этом.
Второй вариант — зажигаем разряд, поочередно перебираем в нем сегменты, в каждый момент горит только один сегмент в одном разряде.
Именно это и предлагаю, в этом случае можно аппаратную часть не менять, ток каждой ноги не превысит допустимый. Только время включения — паузы и частоту подобрать, чтобы яркость комфортная была.
0
Следующий сегмент.

Следующий разряд, конечно.
0
кварц с китайских будильников пойдет сюда? или там частота другая?
0
Подойдет.
Можете в форуме тему открыть.
0
Можете в форуме тему открыть.
В кои-то веки поддержу. А то тут скоро будет по три глупых вопроса про каждую детальку на схеме часов)
0
это значит можно применить или нельзя? зачем тему открывать в форуме
0
Можно применить. Тему в форуме для обсуждения вашей конструкции.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.