Программирование BASCOM
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Софтовые часы на МЕГЕ-8 (очень простые)
KoSS_89Дата: Воскресенье, 20.12.2009, 01:08 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 6
Статус: Offline
Сделал часы, очень порадовала точность хода cool , но есть изян. Очень сильное послесвичение, а именно когда горит "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", при этом мерцал ноль biggrin
Такое чувство, что после засветки, почемуто именно ноля, именно те сигменты (G) которые должны быть погашены, вспыхивают и сразу-же гаснут.
Пробовал в конце подпрограммы "Pulse" ставить "Portd = &HFF" простыми словами тушил все сигменты,вобшем - г... Все еле горело.... Запарился совсем.
Да, зачем столько много комбинаций с переменными _hour и _min, может проше сдвигать цифры и сравнивая хи с "Data" выводить их на LED дисплей. wacko
 
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 прикольная анимация получаеться biggrin чем больше задержка - 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 стучать, о результатах отпишу здесь и. В коментариях, если найдём решение тоже напишу, чтоб у желаюших повторить вопросов меньше было.... dry

 
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, ничего не вышло sad
Индикаторы стали гореть в пол яркости, что касаеться сигмента "G" он стал заметно, по очереди вспыхивать начиная с DIG4 и заканчивая DIG1.
Может ошибка в бесконечном цикле DO.....LOOP в расчётах с переменными? Я там немогу понять ничего. если незатруднит проверте пожалуйсто.
Прошу прошения за запоздалый ответ., времени небыло.

Добавлено (29.12.2009, 02:28)
---------------------------------------------
Сегодня переделал программу полностью. Если незатруднит модераторов добавте её в статью, Всё работает без всякого послесвечения, и прочих недостатков.
Единственное, немного спешат, но думаю это от кварца, надо кандёры шунтирующие подобрать biggrin

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.
Пока всё нормально, но чуствую как-то не по праваилам.
Может кто додумает чего smile

Добавлено (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
Юзайте вторую прошивку. там послесвечения не должно быть!

 
  • Страница 1 из 1
  • 1
Поиск:

Copyright Radan Studio © 2024