|
Софтовые часы на МЕГЕ-8 (очень простые)
| |
KoSS_89 | Дата: Воскресенье, 20.12.2009, 01:08 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Сделал часы, очень порадовала точность хода , но есть изян. Очень сильное послесвичение, а именно когда горит "0" сегмент "G" давольно ярко мерцает, причём с изменяюшейся частотой. Индикатор с О.А. "DATA" пересчитана для него! Всё проинвертировано! Можно както устранить послесвечение? Спасибо
|
|
| |
bascom | Дата: Воскресенье, 20.12.2009, 14:12 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 33
Статус: Offline
| Приведите весь перделанный код, посмотрим, чем можно помочь.
|
|
| |
KoSS_89 | Дата: Воскресенье, 20.12.2009, 19:17 | Сообщение # 3 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Quote $regfile = "m8def.dat" $crystal = 8000000 Config Portb = Output Config Portd = Output Config Portc = Input Set Portc.5 Set Portc.4 Dim I As Byte , X As Byte , Y As Byte , Temp As Integer , Bn(10) As Byte , Cifri(4) As Integer Dim Dotx As Integer Restore Dta For I = 1 To 10 Read Bn(i) Next Config Clock = Soft _sec = 0 : _min = 0 : _hour = 0 Config Timer0 = Timer , Prescale = 8 Config Timer1 = Counter , Edge = Falling , Prescale = 1 On Timer0 Pulse Enable Interrupts Enable Timer0 Config Debounce = 30 Do Debounce Pinc.4 , 0 , Minuti , Sub Debounce Pinc.5 , 0 , Chasi , Sub Temp = _hour * 100 Temp = Temp + _min For I = 1 To 4 Cifri(i) = Temp Mod 10 If Cifri(i) = 0 Then Cifri(i) = 10 Goto T End If Temp = Temp - Cifri(i) T: Temp = Temp / 10 Next Dotx = _sec Mod 2 Loop End Pulse: Incr X Portb = &H00 Portd = Bn(cifri(x)) Y = X - 1 Set Portb.y If X = 4 Then X = 0 If Dotx = 0 Then Reset Portd.2 Else Set Portd.2 Return Dta: Data &H73 , &H48 , &H41 , &H23 , &H81 , &H80 , &H53 , &H00 , &H1 , &H10 '1234567890 Minuti: Incr _min _sec = 00 If _min = 60 Then _min = 00 End If Return Chasi: Incr _hour _sec = 00 If _hour > 23 Then _hour = 00
|
|
| |
bascom | Дата: Воскресенье, 20.12.2009, 21:07 | Сообщение # 4 |
Admin
Группа: Администраторы
Сообщений: 33
Статус: Offline
| Вроде всё верно. А это проявляется только если индицируется 0, или и при других цифрах?
|
|
| |
KoSS_89 | Дата: Понедельник, 21.12.2009, 00:10 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Да, только когда горит ноль, неважно в каком "секторе"(1,,,4) мерцает, гдето в треть яркости причём с изменяюшейся частотой именно сегмент G. Менял таблицу "Data", чтоб вместо нюля горел этот сегмент, "G", при этом мерцал ноль Такое чувство, что после засветки, почемуто именно ноля, именно те сигменты (G) которые должны быть погашены, вспыхивают и сразу-же гаснут. Пробовал в конце подпрограммы "Pulse" ставить "Portd = &HFF" простыми словами тушил все сигменты,вобшем - г... Все еле горело.... Запарился совсем. Да, зачем столько много комбинаций с переменными _hour и _min, может проше сдвигать цифры и сравнивая хи с "Data" выводить их на LED дисплей.
|
|
| |
radan | Дата: Понедельник, 21.12.2009, 09:43 | Сообщение # 6 |
Рядовой
Группа: Заблокированные
Сообщений: 3
Статус: Offline
| Вообщето код не мой. Это прислал участник Pasha с форума http://bascomavr.3bb.ru. У меня подозрение на железную часть, т.к. она выполнена совсем неправильно. Попробуйте убрать резистор из цепи питания устройства и добавьте на каждый из восьми сегментов по 270 Ом. А ещё попробуйте увеличить время срабатывания таймера 0 (64, 256 или даже 1024), может это поможет визуально определить, где собака порылась. Добавлено (21.12.2009, 09:43) --------------------------------------------- Посмотри ещё здесь - http://bascomavr.3bb.ru/viewtopic.php?id=238
|
|
| |
KoSS_89 | Дата: Понедельник, 21.12.2009, 10:37 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Quote (radan9453) Посмотри ещё здесь - http://bascomavr.3bb.ru/viewtopic.php?id=238 Здесь посмотрю, Вобше я делал этого сайта, сам ешё недошол до таких кодов, подправить могу а сам написать.... Пробовал, без резистора (сказать честно с самого начала всё было без резисторов вобше, собрал навесным монтажом, никаких резисторов. МК LED и кнопки) после подкидывал сопротивление, правдо 27Ом. на один из обших анодов, результата ноль. Quote (radan9453) А ещё попробуйте увеличить время срабатывания таймера 0 (64, 256 или даже 1024), может это поможет визуально определить, где собака порылась. Пробовал, на 1024 прикольная анимация получаеться чем больше задержка - 64 ... 256 тем ярче мигает сегмент. ХЗ А можно както с Pasha связаться? Попробывал подкинуть сопротивление 470Ом на О.А. - всеравно мигает, а цифра горит намного тусклее - некатит
Сообщение отредактировал KoSS_89 - Понедельник, 21.12.2009, 10:41 |
|
| |
radan | Дата: Понедельник, 21.12.2009, 10:40 | Сообщение # 8 |
Рядовой
Группа: Заблокированные
Сообщений: 3
Статус: Offline
| Резисторы нужны на все 8 катодов. Обязательно!!! Примерно по 240-270 ом, чтобы ограничить ток в сегменте до 20 мА. Возможно, паразитная засветка именно из-за этого! А Pasha - в личку на http://bascomavr.3bb.ru
|
|
| |
KoSS_89 | Дата: Понедельник, 21.12.2009, 22:39 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Ша времени нет, позже обезательно попробую. Спасибо за помощ!Добавлено (21.12.2009, 22:39) --------------------------------------------- Пробовал резисторы к катодам цеплять (у меня индикатор с О.А.), 470Ом - много, (я от трёх вольт запитую) а 27Ом - разници практически никакой. буду в личку Pashe стучать, о результатах отпишу здесь и. В коментариях, если найдём решение тоже напишу, чтоб у желаюших повторить вопросов меньше было....
|
|
| |
Diagnost | Дата: Пятница, 25.12.2009, 16:36 | Сообщение # 10 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Почитал... видел подобные проблемы.... Кто-то подключал 2 индикатора. 1 нормально работал, 2й засвечивался... вот что попробуй Pulse: Incr X Portb = &H00 ' гасим все цифры delay' waitms 100 ' сюда вставляем задержку Portd = Bn(cifri(x)) ' выдаем цифру в порт Y = X - 1 delay' waitms 100 ' сюда вставляем задержку, какая-то из них должно помочь Set Portb.y If X = 4 Then X = 0 If Dotx = 0 Then Reset Portd.2 Else Set Portd.2 Return отпишись решилась ли проблема. Мои часы собраны точно по схеме без всяких резисторов ( я конечно понимаю что в теории они нужны, но на практике все работает на одном сопротивлении 200 Ом 5В, по закону ома устройство просто не может брать больше 25 мА при таком сопротивлении) Если проблема решилась - обязательно отпишись на форуме где поднимал вопрос. Если не поможет - тупо поставь задержки между всеми ВСЕМИ командами, милисекунд по 100-300. И потихонечку смотри где грабли. Меня заинтересовала твоя идея сдвига цифр и сравнения их с Data. Если доведешь такой алгоритм до ума, то с удовольствием хотелось бы посмотреть код... ну и если не жалко то поделится им с другими форумчанами. для удобства работы можешь дописать после (Чтоб минуты не скакали) Temp = _hour * 100 Temp = Temp + _min Temp = 1200 Когда горят все 00:00 проблема остается? и еще, просматривая код меня заинтересовало - будут ли работать кнопки без строки "Config Portc = Input". Т.к. поидее правильно Config Pinc = Input. Подозреваю что эта строка не нужна вообще.. Наверное все заложено в команду Debounce. Pasha с http://bascomavr.3bb.ru/ ВСЕХ С НАСТУПАЮЩИМ НОВЫМ ГОДОМ!!!!!!
Сообщение отредактировал Diagnost - Пятница, 25.12.2009, 17:55 |
|
| |
KoSS_89 | Дата: Вторник, 29.12.2009, 02:28 | Сообщение # 11 |
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
| Проверил, всё как подсказал Diagnost, ничего не вышло Индикаторы стали гореть в пол яркости, что касаеться сигмента "G" он стал заметно, по очереди вспыхивать начиная с DIG4 и заканчивая DIG1. Может ошибка в бесконечном цикле DO.....LOOP в расчётах с переменными? Я там немогу понять ничего. если незатруднит проверте пожалуйсто. Прошу прошения за запоздалый ответ., времени небыло. Добавлено (29.12.2009, 02:28) --------------------------------------------- Сегодня переделал программу полностью. Если незатруднит модераторов добавте её в статью, Всё работает без всякого послесвечения, и прочих недостатков. Единственное, немного спешат, но думаю это от кварца, надо кандёры шунтирующие подобрать Code $regfile = "m8def.dat" ‘ Работаем с ATmega8 $crystal = 8000000 ‘Работаем на частоте 8 мГц Config Portb = Output ‘ Config Portd = Output ‘Назначаем порты на вход и выход Config Portc = Input ‘ Set Portc.5 ‘Поддтягиваем вход Portc.5 и Portc.4 резисторами к Vcc Set Portc.4 Dim X As Byte , Y As Byte , Cifri(4) As Byte , Cifra As Byte , Tochka As Byte ‘рабочие переменные
Config Clock = Soft ‘Включаем софтовые часы _sec = 0 : _min = 0 : _hour = 0 ‘Вводим время с которого будет производиться отчёт времени Config Timer0 = Timer , Prescale = 8 ‘Включаем таймер0, применяем делитель на 8 Config Timer1 = Counter , Edge = Falling , Prescale = 1 ‘Включаем таймер1, назначаем его работу по спаду от кварца 32768 Гц, делитель на 1 On Timer0 Pulse ‘При срабатывании таймера0, переходим на вклатку Pulse Enable Interrupts ‘Разрешаем все прерывания Enable Timer0 ‘Разрешаем прерывания таймера0 Config Debounce = 20 ‘Ставим задержку при нажатии на кнопки в 20 м.Сек.
Do ‘Основной цикл Debounce Pinc.4 , 0 , Minuti , Sub ‘ Debounce Pinc.5 , 0 , Chasi , Sub ‘Проверяем на нажатие кнопок, если кнопка нажата переходим на соответствуюшую вкладку
If _hour = 24 Then _hour = 00 ‘ If _min = 60 Then _min = 00 ‘Проверяем переменные с временем, при переполнении обнуляем их
Tochka = _sec Mod 2 ‘ Loop ‘Конец основного цикла
Pulse: Incr X ‘Увеличиваем переменную Х на еденицу (была 0, стала 1)
Cifri(1) = _hour / 10 ‘Разбиваем двузначное число часов на два однозначных (21 / 10 = 2) Cifri(2) = Cifri(1) * 10 ‘2 * 10 = 20 сохраняем результат в переменную Cifri(2) Cifri(2) = _hour - Cifri(2) ’21 – 20 = 1 сохраняем вновь полученный результат, в итоге переменная Cifri(2) равняется 1
Cifri(3) = _min / 10 ‘Проделываем тоже самое с минутами (56 / 10 = 5) Cifri(4) = Cifri(3) * 10 ‘5 * 10 = 50 Cifri(4) = _min - Cifri(4) ’56 – 50 = 6
‘Для индикатора с обшим катодом ‘Portd = &H00 Portd = &HFF ‘Гасим индикатор If X = 1 Then ‘Проверяем значение Х, если оно рано 1, выполняем дествие ниже ‘Portb = &H77 Portb = &H8 Cifra = Cifri(1) End If ‘Конец проверки If X = 2 Then ‘Опять проверяем Х ‘Portb = &H7B Portb = &H4 ‘ Cifra = Cifri(2) ‘ End If ‘ If X = 3 Then ‘Portb = &H7D Portb = &H2 Cifra = Cifri(3) End If If X = 4 Then ‘Portb = &H7E Portb = &H1 Cifra = Cifri(4) End If If X > 4 Then X = 0 ‘Последняя проверка, если Х больше 4, обнуляем его
‘Select Case Cifra ‘Case 0 : Y = &HEF ‘Case 1 : Y = &H8C ‘Case 2 : Y = &HB7 ‘Case 3 : Y = &HBE ‘Case 4 : Y = &HDC ‘Case 5 : Y = &H7E ‘Case 6 : Y = &H7F ‘Case 7 : Y = &HAC ‘Case 8 : Y = &HFF ‘Case 9 : Y = &HFE ‘End Select
Select Case Cifra ‘Начинаем выбор переменной Cifra Case 0 : Y = &H10 ‘Если Cifra = 0, Y равен &H10 (Dec 16 ; Bin 00010000) Case 1 : Y = &H73 ‘ Case 2 : Y = &H48 ‘ Case 3 : Y = &H41 ‘ Case 4 : Y = &H23 ‘ Case 5 : Y = &H81 ‘ Case 6 : Y = &H80 ‘ Case 7 : Y = &H53 ‘ Case 8 : Y = &H00 ‘ Case 9 : Y = &H1 ‘ End Select ‘Конец выбора Portd = Y ‘Приравниваем значение переменной Y к Portb 'If Portb.2 = 0 And Tochka = 0 Then Set Portd.2 Else Reset Portd.2 If Portb.2 = 1 And Tochka = 0 Then Reset Portd.2 Else Set Portd.2 ‘Прверяем условие, если совпало - зажигаем точку, если нет - гасим Return ‘ Возврашаемся
Minuti: ‘При нажатии кнопки «минуты» обнуляем секунды и увеличиваем переменную _min на 1 Incr _min _sec = 00 If _min = 60 Then _min = 00 Return ‘Возврашаемся
Chasi: ‘Тоже, что с минутами Incr _hour _sec = 00 If _hour > 23 Then _hour = 00 Return
Сообщение отредактировал KoSS_89 - Вторник, 29.12.2009, 02:42 |
|
| |
Diagnost | Дата: Среда, 30.12.2009, 01:40 | Сообщение # 12 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Попробуй это. Должно заработать. Немного сжал твой код [/code] $regfile = "m8def.dat" ' Работаем с ATmega8 $crystal = 8000000 'Работаем на частоте 8 мГц Config Portb = Output Config Portd = Output 'Назначаем порты на вход и выход Config Portc = Input '‘ Set Portc.5 '‘Поддтягиваем вход Portc.5 и Portc.4 резисторами к Vcc Set Portc.4 Dim X As Byte , Y As Byte , Cifri(4) As Byte , Cifra As Byte , Tochka As Byte , I As Byte , Dig(5) As Byte , Chislo(10) As Byte '‘рабочие переменные Config Clock = Soft '‘Включаем софтовые часы _sec = 0 : _min = 0 : _hour = 0 '‘Вводим время с которого будет производиться отчёт времени Config Timer0 = Timer , Prescale = 8 '‘Включаем таймер0, применяем делитель на 8 Config Timer1 = Counter , Edge = Falling , Prescale = 1 '‘Включаем таймер1, назначаем его работу по спаду от кварца 32768 Гц, делитель на 1 On Timer0 Pulse '‘При срабатывании таймера0, переходим на вклатку Pulse Enable Interrupts '‘Разрешаем все прерывания Enable Timer0 '‘Разрешаем прерывания таймера0 Config Debounce = 20 '‘Ставим задержку при нажатии на кнопки в 20 м.Сек. Restore Dta For I = 1 To 4 Read Dig(i) Next Restore Dta2 For I = 0 To 9 Read Chislo(i) Next Do '‘Основной цикл Debounce Pinc.4 , 0 , Minuti , Sub '‘ Debounce Pinc.5 , 0 , Chasi , Sub '‘Проверяем на нажатие кнопок, если кнопка нажата переходим на соответствуюшую вкладку Tochka = _sec Mod 2 Cifri(1) = _hour / 10 '‘Разбиваем двузначное число часов на два однозначных (21 / 10 = 2) Cifri(2) = Cifri(1) * 10 '‘2 * 10 = 20 сохраняем результат в переменную Cifri(2) Cifri(2) = _hour - Cifri(2) '’21 – 20 = 1 'сохраняем вновь полученный результат, в итоге переменная Cifri(2) равняется 1 Cifri(3) = _min / 10 '‘Проделываем тоже самое с минутами (56 / 10 = 5) Cifri(4) = Cifri(3) * 10 '‘5 * 10 = 50 Cifri(4) = _min - Cifri(4) '’56 – 50 = 6 Loop '‘Конец основного цикла Pulse: Portd = &HFF '‘Гасим индикатор Incr X '‘Увеличиваем переменную Х на еденицу (была 0, стала 1) Portb = Dig(x) Cifra = Cifri(x) If X > 4 Then X = 0 '‘Последняя проверка, если Х больше 4, обнуляем его Portd = Chislo(cifra) If Portb.2 = 1 And Tochka = 0 Then Set Portd.2 Else Reset Portd.2 Return '‘ Возврашаемся Minuti: '‘При нажатии кнопки «минуты» обнуляем секунды и увеличиваем переменную _min на 1 Incr _min _sec = 00 If _min = 60 Then _min = 00 Return '‘Возврашаемся Chasi: '‘Тоже, что с минутами Incr _hour _sec = 00 If _hour > 23 Then _hour = 00 Return Dta: Data &H8 , &H4 , &H2 , &H1 Dta2: Data &H10 , &H73 , &H48 , &H41 , &H23 , &H81 , &H80 , &H53 , &H00 , &H1 [code] Добавлено (30.12.2009, 01:40) --------------------------------------------- Тут в прерывании по минимуму операций. Может из за этого часы спешат? хотя в теории должны отставать)))
|
|
| |
kip96 | Дата: Среда, 24.02.2010, 13:55 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Разобрался , в чём причина послесвечения сегментов. Процес вычесления Cifri(i) находится в основном цикле. И вот допустим в момент Code "Cifri(2) = Cifri(1) * 10 '‘2 * 10 = 20 сохраняем результат в переменную Cifri(2)" происходит прерывание по таймеру0 и индикатор показывает не 21 а 20. вообщем если вычисление вставить в "Pulse:", то всё ок. НО! этим самым мы лишаем себя удовольчтвия вывести на экран что-либо , кроме часов, скажем "BYD" (будильник, если надумаем его туда вставить) На данный момент я просто в программу Diagnost после вычисления Cifri(i) вставил задержку waitms 100. Пока всё нормально, но чуствую как-то не по праваилам. Может кто додумает чего Добавлено (24.02.2010, 13:55) --------------------------------------------- Короче сам дапетрил. Нельзя переменную два раза использовать. Code Cifri(1) = _hour / 10 '‘Разбиваем двузначное число часов на два однозначных (21 / 10 = 2) I = Cifri(1) * 10 '‘2 * 10 = 20 сохраняем результат в переменную Cifri(2) Cifri(2) = _hour - I '’21 – 20 = 1 'сохраняем вновь полученный результат, в итоге переменная Cifri(2) равняется 1 Cifri(3) = _min / 10 '‘Проделываем тоже самое с минутами (56 / 10 = 5) I = Cifri(3) * 10 '‘5 * 10 = 50 Cifri(4) = _min - I '’56 – 50 = 6 вставляем в программу и всё ОК
|
|
| |
Diagnost | Дата: Четверг, 30.09.2010, 15:41 | Сообщение # 14 |
Рядовой
Группа: Пользователи
Сообщений: 3
Статус: Offline
| Quote (kip96) Может кто додумает чего поидее нужно перед вічислением поставить Stop timer0 А после вычисления Start timer0 а еще лучше заменить алгоритм вычисления на Cifri(1) = _min Mod 10 : Cifri(2) = _min / 10 : Cifri(3) = _hour Mod 10 : Cifri(4) = _hour / 10 Юзайте вторую прошивку. там послесвечения не должно быть!
|
|
| |
| | |
| Copyright Radan Studio © 2024 | | |
| | |
| |