Спасибо! Дошло дело до железа. Нашол я у себя индикаторы HDSP-5621 и, естественно, они не с общим катодом, а с общим анодом. Для инвертирования сигналов надо в программе инвертировать эти биты: unsigned char znak [20] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110, 0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111}; и вместо PORTD = razrad^0xFF ; прописать PORTD = razrad; , ибо сделал ТАК и, типа, работает.
И ещё, в оригинале программы написано unsigned char znak [20], адолжно быть [10] ?
Последний раз редактировалось AVL Чт июл 29, 2010 12:17:04, всего редактировалось 1 раз.
да, нужно инвертнуть знакогенератор. еще нужно инвертировать сигнал на разрядах. вместо PORTD = razrad^0xFF ; прописать PORTD = razrad; 20 элементов знакогенератора было в другом проекте, я просто скопировал и вставил не глядя кусок когда в секундомер. нужно изменить на 10. хотя это не повлияет на работу.
В железе, на макетке, на одном разряде - работает. Но есть нюанс, пока-что не влияющий на работу, но всё-равно интересно. У нас есть три входных линии на порту Д. К двум я подцепил кнопки. Кнопки в жизни работают. Но в Протеусе и в жизни на этих входах вместо подтяжки к плюсу есть чёткие импульсы. Не помогли даже такие мои строки кода:
if (razrad == 0b00011111) razrad = 0b11100000; и if (x==4) {x=0; razrad=0b11101000;}
Откуда лезут эти имульсы и как их убрать? Спасибо.
Кажись, разобрался почему импульсы появляются на входах PORTD.6-PORTD.4. Из-за команды razrad>>=1; Ода сдвигает 1 по всему порту и соответственно с выходов на входа тоже перескакивает. Переписал я обратно пару строк и входа в третьем состоянии сидят, а я их резисторами с улицы подтягиваю. Пока-что это устраивает, а потом дорозберусь. Запустил всё в железе. Работает, но с частотой в раза 4-6 больше, чем реальный секундомер и мерцания индикаторов ОЧЕНЬ видны. Запустил с внутреннего генератора (8мГц). Если я поставлю внешний кварц, то ситуация врят-ли изменится.... я так думаю. Что делать с мерцанием и неадекватностью отсчёта? Ибо, на сколько я понимаю, увеличив частоту обновления экрана, что б уменьшить мерцание, мы ещё больше увеличим итак в разы больше, чем нужную, частоту отсчёта времени
razrad>>= 1; if (razrad == 0b00011111) razrad = 0b11100000; x++; if (x==4) {x=0; razrad=0b11101000;}
нафига ты решил три старших бита единицами забить? нафига эта строчка if (razrad == 0b00011111) razrad = 0b11100000; ??? и еще, когда произходит сдвиг числа, то те битики которые приходят вместо вытесненых - всегда нули. вот так вроде должно работать, и импульсы которые ты сам посылал на выводы кнопок - пропадут.
Код:
razrad>>= 1; x++; if (x==4) {x=0; razrad=0b00001000;}
по поводу мерцания. динамическая индикация и отсчет времени производится с помощью разных таймеров, поэтому они совершенно не зависят друг от друга. смотри настройки этих таймеров. вполне возможно я туда всякую фигню написал, т.к. написал код минут за 30, и писал больше для примера как это можно сделать. в железе делать не собирался. Тебе нужно чтоб таймер 0 (тот что считает время) срабатывал с частотой ровно 100гц, а таймер 1(тот что осуществляет динамическую индикацию) с частотой 200-400гц. тогда и считать будет точно, и мерцания не будет. Еще посмотри на фьюзы, может там чего уже ты напутал.
Спасибо. Понял. Вникаю. И даже есть результаты. Изменил // Clock value: 125,000 kHz на // Clock value: 1000,000 kHz и с индикацией нет проблем, светит чётко, ровно. Осалось с отсчётом времени разобраться. С ним будет сложнеее, ибо индикацию я на шару откоректировал, а тут боле-мение реально счить должно.
ты увеличил частоту сигнала подаваемого на таймер-счетчик в 8 раз, и у тебя стало все отлично. это наталкивает на мысль что контроллер у тебя работает не на 8 мгц, а в 8 раз меньше, т.е. 1мгц. проверяй фьюзы, там наверное ошибка. Кстати, это в железе работает? какой кварц стоит? может ты кварц подцепил, а фьюзы установлены на работу от внутреннего генератора, и на 1 мгц. тогда похоже на те симптомы которые ты описал. а кварц просто болтается на пинах короче здесь смотри. по поводу таймера на отсчет времени. он работает в режиме СТС, т.е. считает до определенного значения, генерирует прерывание, сам сбрасывается в ноль, и начинает новый цикл отсчета. на Т/С1 подается 125.000гц делитель выставлен на 1250 (OCR1AH=0x04; OCR1AL=0xE2;) . значит таймер генерирует прерывания с частотой 125000/1250=100гц. то что нужно! так что проверяй от чего и на какой частоте тактируется микроконтроллер.
зы. я уже жду ну когда же из этого будет секундомер.
Подцепил я кварц на 8мГц, и соответственно, перешил фузы и, соответственно, "немнго" с фузами ошибся. Именно с фузами тактирования. Теперь тинька проггером не видиться, хотя девайс работает, но ОЧЧЧЧЧЕНЬ медленно, разряды переключаются за четверть секунды. Прицепил кварц и в проггер, надеясь, что тинка увидится - не увидилась. Вот сижу, чешу репу. Проггер: AVR910. И есть у него режим программирования на пониженной частоте, но чёт вот не программируется обратно. Тинька - не видится. Так-что. видимо, сегодня секундомера не будет
Взял ПОСЛЕДНЮЮ Тиньку. Кварц на 8. Что-бы убедиться, что тактируется от кварца, я отпаивал ногу кварца. Работа девайса останавливается и горит тока один разряд. Значит, тактируется таки от кварца. Скорость индикации и скорость счёта осталась ПРЕЖНЕЙ.
Непонятно мне по таймерам. Ты говорил, что тамер0 - отсчёт времени. Таймер1 - индикация. (OCR1AH=0x04; OCR1AL=0xE2;) - это установки таймера1 или таймера0? Вроде, таймера1, значит на скорость счёта он не влияет. Да? Более того, если я изменяю эти параметры: (OCR1AH=0x04; OCR1AL=0xE2;), то изменяется корость индикации, а не пересчёта. Что делать?
Ёшкин кот...., яж говорил что писал без особого внимания. перепутал таймеры значит так. таймер0 - это динамическая индикация. Таймер настроен на прерывания по переполнению. внутри его обработчика должно быть то что сейчас в обработчике таймера Т1. Таймер1, соответственно отсчитывает время. он работает в режиме СТС. и внутри нужно поместить то что внутри Т0.
Вот заново сгенерировал настройки таймеров в кодевижн. получилось так -
neon-f, ты на "моря" не собираешся, мы до осени запустим секундомер ? Значит так, собрался я с силами и восстановил свои Аттиньки с помощю этого девайса. Паял пол воскресенья. http://diy.elektroda.eu/atmega-fusebit-doctor-hvpp/ Восстановил, слава Богу с пол тыка Рекомендую, ВОССТАНОВИТЕЛЬ реально рулит. Идём дальше.
Ничего не поменялось. Мерцает индикаця и отсчёт времени в раз шесть больше. Тактируется 100% от кварца, ибо если ногу отпаиваю, то всё останавливается. Что делать?
Поменял TCCR1B=0x0В; на TCCR1B=0x0A;. Индикация стала нормальной, но время считает дико быстро. Вышел на то, с чего с утра начинал, правда, став богаче на "реаниматор фузов". Что делать?
Ничего не поменялось. Мерцает индикаця и отсчёт времени в раз шесть больше. Тактируется 100% от кварца, ибо если ногу отпаиваю, то всё останавливается. Что делать?
Замечательно!!! ты просто не поменял как я говорил содержимое обработчиков прерываний. меняй и будет все работать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 284
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения