Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » совтовые часы сбрасываются на ноль. Почему?


совтовые часы сбрасываются на ноль. Почему?

Сообщений 1 страница 30 из 72

1

Новая прошивка v4 часов и дополнения к схеме. http://yadi.sk/d/NdL20F2HnxpnH
Плюшки:
1. Поддержка общего анода и катода
2. Понижено потребление и тактовая частота меги до 1 мГц
3. Добавлен режим работы от батареи с выключенным дисплеем. При нажатии на кнопку время показывается 2 секунды. Потребление в дежурном режиме составляет 10 микроампер.
4. Добавлены новые элементы схемы. Возможность подключить разряды индикации секунд.
5. Устранены все проблемы с точками. Они теперь мигают или горят там где нужно а не везде.

Схема под новую прошивку:
Все что пунктиром на схеме можно не ставить.
http://s2.uploads.ru/t/pRToM.jpg

Вот первоначальная схема:
http://s7.uploads.ru/t/ZURM2.jpg
Прошивка v.4 совместима с данной схемой. Главное чтоб 18 и 19 нога контроллера висели в воздухе.

Отредактировано Pasha (2016-01-30 14:37:20)

0

2

Вот тебе работающая прога для 7 сегментного индикатора на ds1307

Код:
$regfile = "m8def.dat"
$crystal = 4000000

Config Clock = User

Config Portb = Output
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output

Config Portd.5 = Input
Config Portd.6 = Input
Config Portd.7 = Input

Config Sda = Portc.4
Config Scl = Portc.5

Config Timer0 = Timer , Prescale = 256
Stop Timer0

Dim W As Word , Ww As Single
Dim S As Integer                                            '1 секунда
Dim A As Integer                                            'переменная единиц
Dim B As Integer                                            'переменная десятков
Dim C As Integer                                            'переменная сотен
Dim D As Integer                                            'переменная тысяч
Dim I As Integer
Dim Weekday As Byte
Dim J1 As Byte
Dim M1 As Byte
Dim D1 As Byte
Dim H1 As Byte
Dim Min1 As Byte
Dim Aa As Bit
Dim X1 As Byte
Dim Chr_code As Byte
Dim L As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim N As Byte
Dim R As Byte
Dim Q As Bit
Dim E As Integer
Dim P As Integer
Dim M As Bit
Dim R1 As Byte
Dim Mm As Bit


Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1


'########################## считывание данных десятичных цифр #####################
Dim X(10) As Byte
Restore Sigment
For I = 1 To 10
Read X(i)
Next
'#################################################################################

Waitms 200

Main:

M = 0
Mm = 0

Start Timer0

Gosub Getdatetime

Do

If N = 0 Then R = 128
If N = 30 Then R = 0
If N > 60 Then N = 0

If Pind.7 = 0 And Pind.5 = 0 Then Goto Nastr

If Q = 1 Then N = 0


Gosub Indikator

If L > 300 Then
L = 0
Gosub Getdatetime
End If

Debounce Pind.7 , 0 , Z1 , Sub

Loop


Getdatetime:

:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307

  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' SEK'
  I2cstop


If Q = 0 Then
T1 = Makedec(_hour)
S = T1
S = S * 100
T2 = Makedec(_min)
S = S + T2
End If

If Q = 1 Then
T1 = Makedec(_day)
S = T1
S = S * 100
T2 = Makedec(_month)
S = S + T2
End If


Return

Indikator:

If Timer0 > 1 And Timer0 < 4 Then Gosub Label1
If Timer0 > 63 And Timer0 < 68 Then Gosub Label2
If Timer0 > 126 And Timer0 < 130 Then Gosub Label3
If Timer0 > 189 And Timer0 < 193 Then Gosub Label4
If Timer0 > 252 Then
Stop Timer0

L = L + 1
N = N + 1
Timer0 = 0
Start Timer0
End If

Return




Main1:

R = 0

For E = 1 To 250
Portd = 7
Portb = Lookup(13 , Sigment1)
Waitms 1
Portd = 11
Portb = Lookup(2 , Sigment1)
Waitms 1
Portd = 13
Portb = Lookup(4 , Sigment1)
Waitms 1
Portd = 14
Portb = Lookup(12 , Sigment1)
Waitms 1
Next

Goto Main


'######################### подсчет единиц ###################################
Label1:

If M = 1 Then Return

A = S Mod 10
Portd = 7
Portb = X(a + 1) + R1
Return
'#################################################################################

'######################### подсчет десятков ###################################
Label2:

If M = 1 Then Return

B = S Mod 100
B = B - A
B = B / 10
Portd = 11
Portb = X(b + 1)
Return
'#################################################################################

'######################### подсчет сотен ###################################
Label3:
If Mm = 1 Then Return
C = S Mod 1000
B = S Mod 100
C = C - B
C = C / 100


Portd = 13
Portb = X(c + 1) + R
Return
'#################################################################################

'######################### подсчет тысяч ###################################
Label4:
If Mm = 1 Then Return
D = S Mod 1000
D = S - D
D = D / 1000

Portd = 14
Portb = X(d + 1)
Return
'#################################################################################



Sigment:

      Data 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7
'           0   1    2    3     4     5     6     7
      Data 127 , 111
'            8     9


Sigment1:

      Data 62 , 63 , 57 , 120 , 119 , 118 , 112 , 64 , 70 , 121 , 99 , 56 , 102 , 6
'           U    D    C     t     A     H     |    -    |     E     O     L





Z1:




If Q = 0 Then
Q = 1
Gosub Getdatetime
Return
End If

If Q = 1 Then Q = 0

Gosub Getdatetime


Return


Nastr:

Stop Timer0


Timer0 = 0



For E = 1 To 250
Portd = 7
Portb = Lookup(3 , Sigment1)
Waitms 1
Portd = 11
Portb = Lookup(2 , Sigment1)
Waitms 1
Portd = 13
Portb = Lookup(4 , Sigment1)
Waitms 1
Portd = 14
Portb = Lookup(5 , Sigment1)
Waitms 1
Next

Start Timer0
Aa = 0
R1 = 128
Mm = 1
P = _min
'P = 0

Do
L = 0
S = P

Gosub Indikator

Debounce Pind.7 , 0 , Plus , Sub
Debounce Pind.5 , 0 , Minus , Sub

If P > 59 Then P = 1
If P < 1 Then P = 59

Debounce Pind.6 , 0 , Aaa , Sub


Loop Until Aa = 1

R1 = 0
R = 128

Mm = 0
M = 1
Min1 = P
Aa = 0
P = _hour
'P = 0

Do
L = 0
S = P * 100

Gosub Indikator

Debounce Pind.7 , 0 , Plus , Sub
Debounce Pind.5 , 0 , Minus , Sub

If P > 23 Then P = 1
If P < 1 Then P = 23

Debounce Pind.6 , 0 , Aaa , Sub


Loop Until Aa = 1

M = 0
H1 = P
Aa = 0

_hour = H1
_min = Min1
_sec = 0
Gosub Settime



R1 = 0
R = 0

P = 8


Do
L = 0
S = 2000 + P

Gosub Indikator

Debounce Pind.7 , 0 , Plus , Sub
Debounce Pind.5 , 0 , Minus , Sub

If P > 50 Then P = 8
If P < 8 Then P = 50


Debounce Pind.6 , 0 , Aaa , Sub


Loop Until Aa = 1

J1 = P
Aa = 0
Mm = 1
P = _month
'P = 0

Do
L = 0
S = P

Gosub Indikator

Debounce Pind.7 , 0 , Plus , Sub
Debounce Pind.5 , 0 , Minus , Sub

If P > 12 Then P = 1
If P < 1 Then P = 12


Debounce Pind.6 , 0 , Aaa , Sub


Loop Until Aa = 1


M1 = P
Aa = 0
Mm = 0
M = 1
P = _day
'P = 0

Do

L = 0
S = P * 100

Gosub Indikator

Debounce Pind.7 , 0 , Plus , Sub
Debounce Pind.5 , 0 , Minus , Sub

If P > 31 Then P = 1
If P < 1 Then P = 31


Debounce Pind.6 , 0 , Aaa , Sub


Loop Until Aa = 1

D1 = P
Aa = 0
Mm = 0
M = 0

_year = J1
_month = M1
_day = D1

Gosub Setdate

Goto Main1





Plus:

P = P + 1




Return

Minus:


P = P - 1


Return

Aaa:

Aa = 1

Return


Setdate:

  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return

Settime:

  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return

Отредактировано SyncMVGP (2009-03-27 22:32:15)

0

3

ds1307 тем хороша что время не сбивается при пропадании напряжения и еще тем что контроллер можно занять другой программой

0

4

Вот собранный девайс. подходящий жмут проводов - исключительно для програмирования и питания, после заливки - можно смело отпаивать! Еще на фотке видно резюк (200 Ом) - он стоит последовательно питанию, поскольку у меня 5ти вольтовый БП, а индикатору нужно меньше.

увеличить

увеличить

увеличить

увеличить

0

5

to SyncMVGP. Насчет пропадания питания это верно. Возник следующий вопрос - а во время общения с ds1307 (чтение/запись) светодиодный индикатор не мерцает? Просто из опыта при общении по 1ware происходит задержка, и индикатор на долю секунды погасает, даже и не знаю что с ним делать(

0

6

Помимо этого есть еще куча нюансов, из за которых данный девайс мало того что бесполезен, так еще в добавок и не работоспособный.
во первых, схема собрана абсолютно неправильно: по даташиту общий ток микросхемы не должен превышать 20мА*количество ног портов.
При несоблюдении микра выгорает.
Во вторых, сам индикатор как бы тоже по току не должен кушать больше 10ти мА на сегмент, этого тоже не соблюдено.
В третьих - программный изврат тактования часов одним и тем же таймером , причем таким же как и общение с микрой внешней...по и2ц....
непонятно вобщем, как это все работает.......

0

7

Ну дык на роль програмиста я не претендую. Дело в том что мега у меня питается от 5ти вольтового источника через резистор в 200Ом,  только что померял амперметром - показывает общий ток потребления 13 милиампер, соответственно порты и не горят, и2ц не использую. Дык люблю все упрощать. Не ругайте строго.

0

8

так я не пойму, часы щитаются софтово или хардово, по и2ц?

0

9

Ведущийспециалист написал(а):

часы щитаются софтово или хардово, по и2ц?

Софтово
Config Clock = Soft                                         
от кварца, подцепленного на xtal1 (2)
Кстати уже двое суток идут секунда в секунду с компом.
Наконецто руки дошли схему нарисовать. Еще планирую подцепить транзистор и динамик все с тогоже тетриса, откуда и кварц, и играть мелодию для двух будильников.

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

ну и окончательный код

Код:
' Пример часов которые отображают часы и минуты на семи сегментном
' четырех символьном светодиодном индикаторе
' прога для ознакомления, работает 100%
' выставленные фюзы (в понипроге стоят галки на):CKOPT,BOOTSZ1,BOOTSZ0,SUT1,SUT0,CKSEL3,CKSEL1,CKSEL0
' Кварц выдрал из маленького тетриса с часами, думаю также подойдет из любых кварцевых наручных/настенных часов
'насчет точности - терпения больше 2х дней не хватило, идут точно, секунда в секунду.
'e-mail P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      'говорим компилятору что у нас мега8
$crystal = 8000000
Config Portb = Output , Portd = Output ,
Config Pinc.3 = Input                                      'конфигурируем порты на входы и выход
Portc.5 = 1
Portc.4 = 1
Dim I As Byte , X As Byte , Y As Byte , Temp As Integer , Bn(10) As Byte , Cifri(5) As Integer       'задаем всякие переменные и массивы      '
'Dotx As Integer
 Restore Dta                                                ' говорим из какой таблици нужно заносить данные в массив
   For I = 1 To 10                                          ' начало цикла
     Read Bn(i)                                             ' по очереди заносим ячейки из таблици в массив
   Next                                                     ' конец цикла
Config Clock = Soft                                         ' конфигурируем совтовые часы (Мы используем  Timer2 ATmega8 в асинхронном режиме)
_sec = 0 : _min = 0 : _hour = 0                             ' задаем конкретные значения времени, с которого часы будут начинать считать при включении питания
     Config Timer0 = Timer , Prescale = 8                   ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр
     Config Timer1 = Counter , Edge = Falling , Prescale = 1       ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ! (Установкой бита  CKOPT в ноль , мы подключили к кварцу 32768 Hz.  два внутренних конденсатора по 36 пф)
     On Timer0 Pulse                                        ' назначаем подпрограмму, которая будет запускаться по переполнению 1го таймера
     Enable Interrupts                                      'разрешаем прерывания
     Enable Timer0
 Config Debounce = 30                                       'разрешаем таймер0
                                                             ' начало основного цикла
 Do
 Debounce Pinc.4 , 0 , Minuti , Sub
 Debounce Pinc.5 , 0 , Chasi , Sub
        Temp = _hour * 100                                  ' "складываем" часы с минутами так чтобы получилось 4х значное число то есть 8часов+59мин = 859
        Temp = Temp + _min
  For I = 1 To 4                                            ' цикл разбиения склеенных часов с минутами на цифры и занесения каждой в таблицу массива
     Cifri(i) = Temp Mod 10                                 ' берем последнюю цифру (9)
     If Cifri(i) = 0 Then                                   ' проверка последней цифры на 0
     Cifri(i) = 10                                          '
     Goto T                                                 '
     End If                                                 '
     Temp = Temp - Cifri(i)                                 ' вычитаем из часов/минут последнюю цифру 859-9=850
     T:                                                     '
     Temp = Temp / 10                                       ' отбрасываем последний ноль 850/10=85
  Next                                                      'возвращаемся к началу цикла и заносим следующую цифру в массив
   Loop                                                     'конец основного цикла
End                                                         

Pulse:                                                      ' подпрограмма прерываний таймера 0

Incr X                                                      ' увеличиваем х на единицу, для выбора нужных цифр из таблици
Portb = &HFF                                                '  гасим индикатор
Portd = Bn(cifri(x))                                                                              '  подаем на индикатор цифру из массива  Bn с номером cifri(x)
Set Portd.2                                                                                                   '  включаем точки на индикаторе разделяющие часы с минутами (они горят все время
Y = X - 1                                                   '  считаем какую конкретно цифру, из 4х нужно сейчас зажечь
Reset Portb.y                                               '  зажигаем нужную цифру под номером игрик
If X = 4 Then X = 0                                         '  обнуляем х при достижении его величины 4
'End If
Return                                                     '  возвращаемся на место откуда прервали программу
Dta:                                                        '  таблица с данными о цифрах зажигает по порядку : 1234567890
Data &H88 , &HB3 , &HBA , &HD8 , &H7A , &H7B , &HA8 , &HFB , &HFA , &HEB       '

Minuti:               '  подпрограмма обработки кнопки которая прибавляет минуты
Incr _min             '  увеличиваем значение минут на единицу
If _min = 60 Then     ' если минуты при нажатии кнопки стали равны 60 то 
_min = 00             ' минуты равны 00
Incr _hour                        ' и увеличиваем часы на один 
End If                                ' конец если
If _hour > 23 Then _hour = 00  'если часы достигли больше 23 то они приравниваются к 00
_sec = 00            ' обнуляем секунды (после нажатия кнопки прибавления минут секунды обновляются для точной настройки времени)
Return               ' вернутся к месту перехода на подпрограмму
                                                                                        '
Chasi:                              ' метка подпрограммы обработки кнопки прибавления часов
Incr _hour                      ' увеличиваем часы на единицу
If _hour > 23 Then _hour = 00   ' обнуляем часы если они больше 23
Return                              ' вернутся к месту перехода на подпрограмму

увеличить

Отредактировано Pasha (2009-09-20 03:00:30)

0

10

посмотри здесь мелодии для звонка, может пригодится  ___http://ledeffects.net/data/bascom/SOUND_BASCOM.zip___

Доделаешь работу, давай статейку оформим.

0

11

Сделал шаг к будильнику и застрял на моменте его отключении.

Проблема вот в чем - как выйти из цикла сразу и без вопросов?
к примеру есть цик

for i=1 to 100
wait 1
wait 2
wait 3
next

и есть флажок booton_flag, если он = 1 значит нужно выходить из цикла
set booton_flag
for i=1 to 100
wait 1
wait 2
wait 3
if booton_flag = 1 then exit for
next

но в таком случае нам прийдется подождать 6 секунд, а как быть чтобы сразу?

Вот примерный набросок кода с мелодией будильника, которая остановится только по завершении ее проигрывания

Код:
Config PINC.1 = input
Config PORTC.2 = output
Alarm alias PORTC.2

config timer0...
on timer0 Pulse

do
'..... считаем время и задаем будильник
if time_alarm = time then gosub  Muzika
loop
end

Muzika:
For i = 1 to 5
'мелодия
sound alarm ...
waitms  100
...........
sound alarm ...
waitms 125
sound alarm ...
wait 2

if booton_flag = 1 then 
reset booton_flag
exit for    'тут  мы принудительно обрываем мелодию при нажатой кнопке
end if

next
return

Pulse:
lcd time ' както выводим время на индикатор и гдето его щитаем.....
Debonce PINC.1, booton, sub
return

booton:
set booton_flag
return

0

12

Код:
 Config Timer1 = Counter , Edge = Falling , Prescale = 1     
  ' конфигурируем таймер 1 на подсчет импульсов на кварце,
 припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!

Установкой бита  CKOPT в ноль , мы подключаем к кварцу 32768 Hz.  два внутренних конденсатора по 36 пф

Код:
 Config Clock = Soft

Мы используем  Timer2 ATmega8 в асинхронном режиме.
Читаем справку и даташит.

Отредактировано VladI+ (2009-04-06 23:51:42)

0

13

Пределал прошивку от Pasha, в его версии было сильное послесвичение сегмента "G" именно при цифре 0 (ноль), Неочень поняв его разбивание четырёхзначного числа на отдельные четыре, решил пределать. Получилось то, что надо, все недостатки решены, Код рабочий 100%

Код:
$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 (2009-12-29 02:44:33)

0

14

А есть ли у кого-то HEXдля этих часиков?

0

15

Pasha, огромное спасибо))

0

16

Появилась новая прощивка для часов. Код стал гооораздо меньше. Схема прежняя
Изменения:
Теперь при нажатии кнопки цифорки бегут сами, пока ее держишь. Не нужно клацать 50 раз чтоб установить 50 минут.

Код:
'e-mail P-a-h-a@yandex.ru
$regfile = "m8def.dat"                                      ' мега8
$crystal = 8000000
Config Portb = Output , Portd = Output : Portc = &H30
Dim I As Byte , X As Byte , Cifri(4) As Byte                'задаем всякие переменные и масивы      '
Config Clock = Soft                                         ' конфигурируем совтовые часы
     Config Timer0 = Timer , Prescale = 8 : On Timer0 Pulse : Enable Timer0       ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр ' назначаем подпрограмму, которая будет запускатся по переполнению 1го таймера
     Config Timer1 = Counter , Edge = Falling , Prescale = 1 : Enable Interrupts       ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!
 Do                                                         ' начало основного цикла
If Pinc.4 = 0 Then
Do
 Incr _min : _sec = 00
 If _min > 59 Then : _min = 00 : Incr _hour : End If
 If _hour > 23 Then _hour = 00 : Waitms 100
Loop Until Pinc.4 = 1
End If
If Pinc.5 = 0 Then
    Do
   Incr _hour : If _hour > 23 Then _hour = 00 : Waitms 100
    Loop Until Pinc.5 = 1
End If
  Loop                                                      'конец основного цикла
Pulse:                                                      ' подпрограмма прерываний таймера0
Cifri(1) = _min Mod 10 : Cifri(2) = _min / 10 : Cifri(3) = _hour Mod 10 : Cifri(4) = _hour / 10
Portb = &HFF
Incr X : If X > 3 Then X = 0
Portd = Lookup(cifri(x + 1) , Dta)
Reset Portb.x
Return                                                      '  возвращаемся на место откуда прервали программу
       Dta:                                                 '  таблица с данными о цифрах зажигает по порядку : 0123456789
       Data &HEF , &H8C , &HB7 , &HBE , &HDC , &H7E , &H7F , &HAC , &HFF , &HFE

0

17

вычисление Cifri(х) в прерывании таймера, - лишаешь себя возможности вывести на индикатор что-либо кроме часов.

Код:
Pulse:                                                      ' подпрограмма прерываний таймера0
Cifri(1) = _min Mod 10 : Cifri(2) = _min / 10 : Cifri(3) = _hour Mod 10 : Cifri(4) = _hour / 1

Ведь памяти ещё огого, а руки так и чешуться добавить чего нибудь.
предлагаю вывести в основной цикл.
Добавить кнопку Set , а старые кнопки обозвать + и -.
И через debounce  прыгать по подпрограммам-менюшкам. А там уже -установка времени, будильника, таймера, секундомера и т.д.
А ещё лучше привязать это дело к энкодеру.Нажал-покрутил колёсико! О -как!

0

18

Зайди в раздел готовые конструкции... это я уже сделал. а данные часики это самое простое и минимальное, чего и хотелось добиться - без всяких менюшек, будильников и т.д. простота схемы и кода. дэбонсэ было в предыдущей версии кода, я от него ушел чтоб при нажатии циферки сами бежали а не одно нажатие = +1

Отредактировано Pasha (2010-05-06 15:22:53)

0

19

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

0

20

подскажите новичку... какие фьюзы выствить в SinaProg?

0

21

Здравствуйте, не могли бы Вы переделать прошивку под общий анод, пожелуйста

0

22

Нужно проинвентировать (т.е. изменить 0 на 1 или 1 на 0, где было set включить reset или наоборот) PB0-PB3. Также изменить кодировку цифр в таблице данных. Для этого из FF нужно вычесть значение каждой цифры. Можно в уме, а можно с помощью обычного виндоусовского калькулятора, переключенного в инженерный режим.
Примерно так:
было - Portb = &HFF                                                '  гасим индикатор
стало - Portb = &H00                                                '  гасим индикатор
было - Reset Portb.y                                               '  зажигаем нужную цифру под номером игрик
стало - Set Portb.y                                               '  зажигаем нужную цифру под номером игрик
было - Data &H88 , &HB3 , &HBA , &HD8 , &H7A , &H7B , &HA8 , &HFB , &HFA , &HEB
стало - Data &H77 , &H4C , &H45 , &H27 , &H85 , &H84 , &H57 , &H04 , &H05 , &H14

0

23

Спасибо огромное! Очень выручил. Все заработало

0

24

Извините, но снова вопрос, все ОК, но когда горит 0 - появилось послесвечение средней горизонтальной линии. Возможно кто нибуть знает, как с этим бороться?

0

25

Poputchik написал(а):

Извините, но снова вопрос, все ОК, но когда горит 0 - появилось послесвечение средней горизонтальной линии. Возможно кто нибуть знает, как с этим бороться?

http://bascom.at.ua/publ/softovye_chasy … e/1-1-0-12
Читай комментарии в конце статьи.
После окончания работ - код в студию, поделимся с народом.

0

26

radan написал(а):

изменить кодировку цифр в таблице данных. Для этого из FF нужно вычесть значение каждой цифры. Можно в уме, а можно с помощью обычного виндоусовского калькулятора, переключенного в инженерный режим.

Здравствуйте!
Что -то я не могу понять как это сделать. Подскажете?

0

27

Скажите, а почему секундная точка не моргает? Это не предусмотрено программой?

0

28

Подскажите а как изменится схема с общим плюсом (я только начинаю изучать МК и все что с ними связанно) ?

0

29

это и схемой нельзя назвать :(
всё криво и косо

тут ничего, а вот программа изменится в части управления разрядами. Да и сегментами - тоже

0

30

Здравствуйте всем! Я тут новенький, у меня такой вопрос: как во встроенный обработчик прерывания софтовых часиков в Баскоме добавить свой код? Допустим мне нужно каждую секунду инвертировать бит(для мигания двоеточий), как проще это сделать? в основном цикле проверять четность секунд или проверять флаг переполнения асинхронного таймера TIFR.6? И как это реализовать в коде?

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » совтовые часы сбрасываются на ноль. Почему?