Часы-термометр на микроконтроллере ATmega8.
-
etimsk
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Пн ноя 17, 2008 16:53:29
- Откуда: Московская область, г.Лыткарино
Re: Часы-термометр на микроконтроллере ATmega8.
Ах да забыл схема на 9ти индикаторах и М74HC595
Re: Часы-термометр на микроконтроллере ATmega8.
У меня тоже на этой неделе баг был с этими часами на 9 индикаторах. Прихожу домой, а на часах высвечивается 33 часа -скока минут не важно 
В общем заменить литиевую батарейку в резервном источнике. Она и так БУ была с какой-то старой материнке, так еще и в часах проработала много. Знаю точно по состоянию других бытовых приборов, что электроэнергию отключали. А резервный элемент в часах видимо их не потянул уже. Вот и возник глюк. Но что странно, через меню программный сброс не сработал. Пришлось отключать от сети, менять естественно элемент и после настраивать заново все режимы.
В общем к автору вопрос, можно ли что-то поправить в прошивке, чтоб хотя бы настройки сохранялись?
В общем заменить литиевую батарейку в резервном источнике. Она и так БУ была с какой-то старой материнке, так еще и в часах проработала много. Знаю точно по состоянию других бытовых приборов, что электроэнергию отключали. А резервный элемент в часах видимо их не потянул уже. Вот и возник глюк. Но что странно, через меню программный сброс не сработал. Пришлось отключать от сети, менять естественно элемент и после настраивать заново все режимы.
В общем к автору вопрос, можно ли что-то поправить в прошивке, чтоб хотя бы настройки сохранялись?
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Re: Часы-термометр на микроконтроллере ATmega8.
nbo писал(а):Для всех интересующихся: здесь http://startcd.narod.ru/cl_termo3/index.html выложена доработанная прошивка часов термостата на шести индикаторах.
nbo если Вы автор схемы и платы для часов на шести индикаторах то не могли бы выложить на этом форуме плату в .lay или хотя бы в jpg, gif а то протеуса нет. Заранее спасибо!
-
etimsk
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Пн ноя 17, 2008 16:53:29
- Откуда: Московская область, г.Лыткарино
Re: Часы-термометр на микроконтроллере ATmega8.
Так у меня вообще без батарейки -может схему вы не ту имели ввиду -у меня power detect просто на минусе сидит
Re: Часы-термометр на микроконтроллере ATmega8.
etimsk писал(а):Так у меня вообще без батарейки -может схему вы не ту имели ввиду -у меня power detect просто на минусе сидит
А смысл? батарейку жалко поставить?
У нас свет редко сейчас выключают. Зато вот метко
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
-
etimsk
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Пн ноя 17, 2008 16:53:29
- Откуда: Московская область, г.Лыткарино
Re: Часы-термометр на микроконтроллере ATmega8.
serg_svd писал(а):etimsk писал(а):Так у меня вообще без батарейки -может схему вы не ту имели ввиду -у меня power detect просто на минусе сидит
А смысл? батарейку жалко поставить?
У нас свет редко сейчас выключают. Зато вот метко. Стормозил, надо было это запечатлеть на фотоаппарат
33 часа эт вам не шутки
Так а смысл? -если дома генератор стоит автоматический -свет отрубили он с опережением завелся -у нас типа умный дом -образцово показательный:)
Re: Часы-термометр на микроконтроллере ATmega8.
etimsk писал(а):дома генератор стоит автоматический
ЗачОтная батарейка у вас для часов
"Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа." Ро́берт Ше́кли
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
Я правильных ответов знаю мало, поэтому не стесняюсь и много спрашиваю.
-
DimAlt
- Вымогатель припоя
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
- Контактная информация:
Re: Часы-термометр на микроконтроллере ATmega8.
В последних версиях такой код
то есть
при наступлении нового часа, это сбросило бы 33 часа на ноль.
А так, я специально не стал при сбросе сбрасывать время, его все равно потом выставлять в ручную.
То есть, надо было проверить настройки выставить время, и часы опять бы работали. Но это мое мнение, а так, конечно, разные фокусы бывают
etimsk я думаю проблема у Вас в 74НС595.
Код: Выделить всё
if (++hour[h_sek]>=60)
{
hour[h_sek] =0;
if (++hour[h_min]>=60)
{
if ( corr_flag & _BV(fl_corr_znak_pl) )//корекция часов
correct=correction;//для убыстрения
else
correct= 0x00-correction;
hour[h_min] =0;
hour[h_hour]++;
if (hour[h_hour]>=24)
{
hour[h_hour]=0;
if (++hour[h_day]>=7) hour[h_day]=0;
if (++hour[h_num]>num_in_month[ hour[h_month] ] )
{
hour[h_num]=0;
hour[h_month]++;
if (hour[h_month]>=12) {hour[h_month]=0; hour[h_year]++;}
}
}
то есть
Код: Выделить всё
if (hour[h_hour]>=24)
{
hour[h_hour]=0;при наступлении нового часа, это сбросило бы 33 часа на ноль.
А так, я специально не стал при сбросе сбрасывать время, его все равно потом выставлять в ручную.
То есть, надо было проверить настройки выставить время, и часы опять бы работали. Но это мое мнение, а так, конечно, разные фокусы бывают
etimsk я думаю проблема у Вас в 74НС595.
- nbo
- Нашел транзистор. Понюхал.
- Сообщения: 162
- Зарегистрирован: Вт май 06, 2008 20:14:37
- Откуда: Ukraine
Re: Часы-термометр на микроконтроллере ATmega8.
Для snc:
Выкладываю комплект плат в формате PDF.
Некоторые пояснения: файл clock6_new-1.pdf рисунок печатных проводников, файл clock6_new-1-top.pdf вид со стороны монтажа индикаторов, здесь-же показаны 20 перемычек, файл clock6_shema.pdf схема, файл clock6_new-1-botton.pdf вид со стороны печати с деталями которые паяются с этой стороны, файл clock6_new-1-botton-1.pdf то-же но без рисунка печатных проводников. Кроме того на плате необходимо установить 5 перемычек из провода. На вопрос почему всё так могу лишь ответить что при разводке ставилась задача сделать односторонюю плату, двусторонние я пока по технологии ЛУТ не освоил. В .lay формате плат нет.
Выкладываю комплект плат в формате PDF.
Некоторые пояснения: файл clock6_new-1.pdf рисунок печатных проводников, файл clock6_new-1-top.pdf вид со стороны монтажа индикаторов, здесь-же показаны 20 перемычек, файл clock6_shema.pdf схема, файл clock6_new-1-botton.pdf вид со стороны печати с деталями которые паяются с этой стороны, файл clock6_new-1-botton-1.pdf то-же но без рисунка печатных проводников. Кроме того на плате необходимо установить 5 перемычек из провода. На вопрос почему всё так могу лишь ответить что при разводке ставилась задача сделать односторонюю плату, двусторонние я пока по технологии ЛУТ не освоил. В .lay формате плат нет.
- Вложения
-
- zxc.zip
- (212.58 КБ) 500 скачиваний
-
etimsk
- Встал на лапы
- Сообщения: 139
- Зарегистрирован: Пн ноя 17, 2008 16:53:29
- Откуда: Московская область, г.Лыткарино
Re: Часы-термометр на микроконтроллере ATmega8.
serg_svd писал(а):etimsk писал(а):дома генератор стоит автоматический
ЗачОтная батарейка у вас для часов
Спасибо!
Но на самом деле это сильно ограничивает развитите радиолюбительства -тут только можно поплакать
постоянно стабильное напряжение 220 вольт без отклонений от нормы и его наличие -вобщем одни слезы
Извините пожалуйста за флуд!
Кстати попробовал поменять HC595 -посмотрим - пока работают уже 20 часов -неужели микрухи такие плохие пошли?- пол года работала и на тебе
Re: Часы-термометр на микроконтроллере ATmega8.
предположение.
ток вывода HC595 - 8ма. скорее всего у вас большой перегруз, вот микруха в таком режиме долго и не живет.......
ток вывода HC595 - 8ма. скорее всего у вас большой перегруз, вот микруха в таком режиме долго и не живет.......
Re: Часы-термометр на микроконтроллере ATmega8.
//первый байт 0x81 8-[длина строки(7)+смещение(1)] 1-[смещение(1)]
const unsigned char str_default[]= {0x90, 0x39, 0xBD, 0x37, 0xBB, 0x39, 0x0, 0x97, 0xB7, 0x79};//d, E, F, A, U, L, t, 0, S, //0,9 regim127
const unsigned char str_ds18b20[]= {0x81, 0x9E, 0xAD, 0x82, 0xBF, 0x9D, 0x3E, 0xBB};//d, S, 1, 8, b, 2, 0, 0, F // 0,9 regim126
const unsigned char str_budil[]= {0x61 ,0x9D, 0x98, 0x9E, 0x11, 0x58};//, 0x0, 0x0, 0xAD};//0, b, u, d, I, I., 0, 0, S //1,8 regim52
Это фрагмент из программы 9-индикаторных часов Мосина. Объясните, плиз, как эта кодировка связана с индикаторами? Дякую
const unsigned char str_default[]= {0x90, 0x39, 0xBD, 0x37, 0xBB, 0x39, 0x0, 0x97, 0xB7, 0x79};//d, E, F, A, U, L, t, 0, S, //0,9 regim127
const unsigned char str_ds18b20[]= {0x81, 0x9E, 0xAD, 0x82, 0xBF, 0x9D, 0x3E, 0xBB};//d, S, 1, 8, b, 2, 0, 0, F // 0,9 regim126
const unsigned char str_budil[]= {0x61 ,0x9D, 0x98, 0x9E, 0x11, 0x58};//, 0x0, 0x0, 0xAD};//0, b, u, d, I, I., 0, 0, S //1,8 regim52
Это фрагмент из программы 9-индикаторных часов Мосина. Объясните, плиз, как эта кодировка связана с индикаторами? Дякую
wkarl
Re: Часы-термометр на микроконтроллере ATmega8.
Есть предложение: просить DimAlt всем обществом составить подробнейшие коментарии в программе к его часам, например, версии 17t1_1 (наиболее перспективным, на мой взгляд). Это было бы полезно для всех и сняло бы многие вопросы, а также стало бы хорошим пособием для начинающих знакомиться с СИ. А Дмитрий мог бы написать на основании этого учебное пособие, в котором он описал бы, как он дошел до жизни такой.
wkarl
Re: Часы-термометр на микроконтроллере ATmega8.
По поводу 5-разрядных часов DimAlt в исполнении Юрия. В этой реализации при закрытом состоянии портов МК на их выводах амплитуда импульса может достигать 8…9 В, что представляет определенную опасность для МК. Кроме того, при таком напряжении при открытом состоянии портов втекающий ток составит около 9/2,4 = 3,75 мА на порт, что не совсем хорошо как для МК, так и для энергосбережения. Для исключения этого недостатка была испытана схема (http://wkarl.narod.ru/3t_dop14.htm) с использованием прошивки v. 17t1_1 и ИМС преобразователя уровня 564ПУ7 (с инверсией), замечательным свойством которого является то, что он срабатывает при входном напряжении начиная с 3 В и питании 12 В (см. ДСП-каталог ИМС от 1984 г.). В указанных часах использована также более простая схема power_detect.
wkarl
-
DimAlt
- Вымогатель припоя
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
- Контактная информация:
Re: Часы-термометр на микроконтроллере ATmega8.
neon-f писал(а):ток вывода HC595 - 8ма.
neon-f где 8ма?
Или это с учетом того, что часы всегда показывают восьмерки?
- Вложения
-
- 595.PNG
- (3.91 КБ) 2218 скачиваний
-
DimAlt
- Вымогатель припоя
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
- Контактная информация:
Re: Часы-термометр на микроконтроллере ATmega8.
wkarl писал(а)://первый байт 0x81 8-[длина строки(7)+смещение(1)] 1-[смещение(1)]
const unsigned char str_ds18b20[]= {0x81, 0x9E, 0xAD, 0x82, 0xBF, 0x9D, 0x3E, 0xBB};//d, S, 1, 8, b, 2, 0, 0, F // 0,9 regim126
Сначала о том, что это исходник 2004 года, это время, когда я только начинал разбираться с мк. Затем, конечно, он не однократно изменялся, но основа осталась, именно, моей первой программы на си. Поэтому его нельзя рекомендовать как пример и тем более по нем разбираться с кодом.
Здесь изначально массив располагался в памяти программ то есть был объявлен progmem. Но так как в меге8 оперативки много его можно размещать в озу, по размеру кода меньше и по выполнению быстрей.
Считывать массив str_ds18b20 в массив буфера экрана по коду также занимает меньше места, чем писать так:
Код: Выделить всё
LedBuffer[1]=0x9E;
LedBuffer[1]=0x9E;
LedBuffer[2]=0xAD;
и т. д.
Функция копирования массива в буфер
Код: Выделить всё
void load_str_in_lcdbuffer(const unsigned char *str_lcd){
unsigned char b,e,length;//str_lcd[0] = 0000 1111-смещение, 1111 0000 - длина строки
length=str_lcd[0];
for( b=0x0F&(length), e=1 ; b<(0x0F&(length>>4)) ; b++, e++){
lcd_buffer[b]=str_lcd[e];
}
}Вообщем это результат попыток сократить размер кода.
Re: Часы-термометр на микроконтроллере ATmega8.
стандартный ток нагрузки на вывод у HC серии около 7ма(или около того, точно не помню)
ток короткого замыкания вывода - 20ма. больше не получить даже если закоротить на землю или питание. это в таблице и указано, и допускать крайне не желательно.
суммарный ток микросхемы по выводам питания - 70ма. получаем 70/9=7,7. вполне стандартно для НС серии. конечно я понимаю что по всем 9 выводам одновременно такого тока быть не может, но "восьмерка", "девятка", "ноль" плюс "точка" это 7-8 выводов. следовательно в вашей схеме, без транзисторных ключей, больше 9 ма с вывода лучьше не брать....
Есть вопрос по коду. у тебя весь контроллер работает от часового кварца, или только таймер Т2, а остальное от внутреннего генератора???
если второе, то глянь правильно ли так настроить таймер Т2, чтоб он тактировался от часового кварца, и генерировал прерывание по переполнению.
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{ МОЙ КОД..... }
ASSR=0x08;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x00;
кварц цепляю на TOSC 1 и 2.
хочу получить прерывания с частотой 512гц (32768/64)
ток короткого замыкания вывода - 20ма. больше не получить даже если закоротить на землю или питание. это в таблице и указано, и допускать крайне не желательно.
суммарный ток микросхемы по выводам питания - 70ма. получаем 70/9=7,7. вполне стандартно для НС серии. конечно я понимаю что по всем 9 выводам одновременно такого тока быть не может, но "восьмерка", "девятка", "ноль" плюс "точка" это 7-8 выводов. следовательно в вашей схеме, без транзисторных ключей, больше 9 ма с вывода лучьше не брать....
Есть вопрос по коду. у тебя весь контроллер работает от часового кварца, или только таймер Т2, а остальное от внутреннего генератора???
если второе, то глянь правильно ли так настроить таймер Т2, чтоб он тактировался от часового кварца, и генерировал прерывание по переполнению.
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{ МОЙ КОД..... }
ASSR=0x08;
TCCR2=0x01;
TCNT2=0x00;
OCR2=0x00;
кварц цепляю на TOSC 1 и 2.
хочу получить прерывания с частотой 512гц (32768/64)
-
DimAlt
- Вымогатель припоя
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
- Контактная информация:
Re: Часы-термометр на микроконтроллере ATmega8.
Да, часы от асинхронного таймера, все остального от внутреннего RC.
Потом
1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
2. Select clock source by setting AS2 as appropriate.
3. Write new values to TCNT2, OCR2, and TCCR2.
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB.
5. Clear the Timer/Counter2 Interrupt Flags.
6. Enable interrupts, if needed.
Первый пункт не выполнен
Частота будет 32768/256=128 герц
Для того что бы получить 512 надо использовать режим СТС загрузив OCR2=64.
что то вроде этого
По 74НС595, конечно все так. Но в даташите
Continuous output current, IO (VO = 0 to VCC) . . . . . . ±35 mA
В переводе звучит как продолжительный ток вывода. Я бы сказал, что нагружать вывод до 20мА можно и не страшно, главное постоянно не превышать мощность кристала 500мВт. Вот задумайтесь, почему, есть, например, телефон с АОН русь 27, где индикатор управляется двумя 74НС595. Разработчики не побоялись превысить токи.
Потом
1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
2. Select clock source by setting AS2 as appropriate.
3. Write new values to TCNT2, OCR2, and TCCR2.
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB.
5. Clear the Timer/Counter2 Interrupt Flags.
6. Enable interrupts, if needed.
Первый пункт не выполнен
Частота будет 32768/256=128 герц
Для того что бы получить 512 надо использовать режим СТС загрузив OCR2=64.
что то вроде этого
Код: Выделить всё
TIMSK&=~(1<<OCF2); или cli(); а потом sei
TCCR2 = 0x00; //stop
ASSR = (1<<AS2); //set async mode
TCCR2 = (1<<WGM21)|(1<<CS20); //start
OCR2 = 64;
TIMSK|=(1<<OCF2);
ISR(OCF2){};По 74НС595, конечно все так. Но в даташите
Continuous output current, IO (VO = 0 to VCC) . . . . . . ±35 mA
В переводе звучит как продолжительный ток вывода. Я бы сказал, что нагружать вывод до 20мА можно и не страшно, главное постоянно не превышать мощность кристала 500мВт. Вот задумайтесь, почему, есть, например, телефон с АОН русь 27, где индикатор управляется двумя 74НС595. Разработчики не побоялись превысить токи.
Re: Часы-термометр на микроконтроллере ATmega8.
Уважаемый DimAlt. Я уже давно собрал Вашу схему. Спасибо за проект
Схема эта Часы-термометр на микроконтроллере ATmega8. V 2.0 http://radiokot.ru/circuit/digital/home/30/ У меня возможно очень старая версия прошивки, но я когда-то выбрал именно ее (кажется откуда-то из этого форума) потому что там была возможность выводить температуру без первого нуля, т.к. показания типа -00,5 выглядят очень некрасиво. Термостата там нету и не надо. Пару раз были глюки - символы писались неправильно как будто повредился массив знакогенератора сброс из меню не помог, почему? В другой раз дисплей погас совсем. (помогало только разобрать корпус и замкнуть вывод reset с землей). Собственно главный недостаток - я собирал эти часы в надежде что они будут "эталоном" точности во всей квартире, чтобы за месяц не боле но к сожалению это не так. Шаг корректировки слишком велик. 0,08. Если шаг 0,08 сек в час то в самом худшем случае погрешность будет 0,04. 0,04*24*30*12/60=5 минут в год, хочу точнее! Может быть уже есть версия где этот шаг уменьшен раза в 2-4? Если таковой версии нету, можно мне какую-нибудь свежую версию исходников (9ти разрядный индикатор) где, у термометров можно было установить режим отбрасывания первого нуля?
-
DimAlt
- Вымогатель припоя
- Сообщения: 576
- Зарегистрирован: Пт май 19, 2006 05:39:11
- Контактная информация:
Re: Часы-термометр на микроконтроллере ATmega8.
можно мне какую-нибудь свежую версию исходников
Вот здесь http://startcd.narod.ru/clock/clock.html исходник и прошивки.
Для улучшения коррекции, ее можно производить не раз в час, а например раз в сутки (если уход в сутки у Вас не превышает макс. значение коррекции) в исходнике поменять это
Код: Выделить всё
if ( isr_1sek_ )//прошла секунда
{
correct=0;
if (++hour[h_sek]>=60)
{
hour[h_sek] =0;
if (++hour[h_min]>=60)
{
//if ( corr_flag & _BV(fl_corr_znak_pl) )//корекция часов ЭТО ПЕРЕНЕСТИ
// correct=correction;//для убыстрения
// else
// correct= 0x00-correction;
hour[h_min] =0;
hour[h_hour]++;
if (hour[h_hour]>=24)
{
hour[h_hour]=0;
if ( corr_flag & _BV(fl_corr_znak_pl) )//корекция часов СЮДА
correct=correction;//для убыстрения
else
correct= 0x00-correction;
Можно коррекцию производить через несколько часов(если 24 много).. исходник есть. Если не получится то скомпилю сам.