Подходящий жмут проводов - исключительно для програмирования и питания, после заливки - можно смело отпаивать! Еще на фотке видно резюк (200 Ом) - он стоит последовательно питанию, поскольку у меня 5ти вольтовый БП, а индикатору нужно меньше.
Часы считаются софтово.
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 ' конфигурируем совтовые часы
_sec = 0 : _min = 0 : _hour = 0 ' задаем конкретные значения времени, с которого часы будут начинать считать при включении питания
Config Timer0 = Timer , Prescale = 8 ' конфигурируем таймер 0 чтоб потом на него повесить алгоритм отображения цифр
Config Timer1 = Counter , Edge = Falling , Prescale = 1 ' конфигурируем таймер 1 на подсчет импульсов на кварце, припаянного к Xtal1 Xtal2 на 32768 гц БЕЗ КОНДЕРОВ!
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 '
Cifri(i) = 10 '
Goto T '
End If '
Temp = Temp - Cifri(i) ' вычитаем из часов/минут последнюю цифру 859-9=850
T: '
Temp = Temp / 10 ' отбрасываем последний ноль 859/10=85
Next 'возвращаемся к началу цикла и заносим следующюю цифру в масив
' Dotx = _sec Mod 2
Loop 'конец основного цикла
End '
'
Pulse: ' подпрограмма прерываний таймера0
'If Pinc.3 = 0 Then
'Else
Incr X ' увеличиваем х на единицу, для выбора нужных цифр из таблици
Portb = &HFF ' гасим индикатор
Portd = Bn(cifri(x))
Set Portd.2
'If Dotx = 0 Then Reset Portd.2 Else Set Portd.2 ' подаем на индикатор цифру из масива Bn с номером cifri(x)
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
_min = 00
Incr _hour
End If
If _hour > 23 Then _hour = 00
_sec = 00
Return
'
Chasi:
Incr _hour
If _hour > 23 Then _hour = 00
Return
А вот новая прошивка (V2.0), где код значительно уменьшен.
<Изменения:
Теперь при нажатии кнопки цифорки бегут сами, пока ее держишь.
Не нужно клацать 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
'Нужные переменные Dim Tm As Byte 'Такт минуты Dim Tm_kn_ms As Word 'Частота импульсов при нажатой кнопки в Waitms Dim Tm_kn As Byte 'Определитель задержки нажатия кнопки Dim Flag As Bit
Enable Timer2 Enable Interrupts
Tm_kn_ms = 600 'Задержка первого нажатия кнопки 'Пауза шага по умолчанию
'Бесконечный цикл Do If Flag = 1 Then 'Исполнение хода стрелки Flag = 0 'Смена полярности часового механизма (тригер) Porta.0 = Pina.1 Porta.1 = Not Pina.1
If Pind.7 = 0 Then Waitms Tm_kn_ms 'Задержка после исполнения если кнопка была нажата End If
'Алгоритм кнопки If Pind.7 = 0 Then 'Алгоритм реакции на долгое удержание кнопки If Tm_kn = 3 Then 'Если нажата 5 циклов, то меняем условие задержки шага стрелки If Tm_kn_ms > 150 Then 'Ускоряем до нужного предела Tm_kn_ms = Tm_kn_ms - 50 End If Tm_kn = 0 'Сброс счётчика тактов удержания кнопки End If Incr Tm_kn 'прибавляем кол-во циклов при удержании кнопки Flag = 1 'Обозначаем необходимость шага стрелки Tm = 0 'Сбрасываем таймер секунд Timer2 = 0 Else 'Если кнопка ненажата Tm_kn_ms = 600 'Пауза шага по умолчанию Tm_kn = 0 'Сброс счётчика тактов удержания кнопки End If
Loop End
'Подпрограмма секунды и минуты, срабатываемая по таймеру часового кварца Sec: Incr Tm 'Счёт секунд Portb.7 = Not Pinb.7 'Строб тригер секунды в точке сегмента If Tm = 60 Then Tm = 0 Flag = 1 'Обозначаем необходимость шага стрелки End If Return
Вы прикинте, два дня парился с Atmega16 и в итоги наткнулся на это - http://atmega32-avr.com/real-time-clock-atmega16/ Кварц подцепляют не на Xtail на на осциллятор http://atmega32-avr.com/wp-content/uploads/2012/06/Real-Time-Clock-M16_sch.gif
Прошу прощения, это был общий минус. А с общим плюсом вот он:
Код
'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 = &H0 Incr X : If X > 3 Then X = 0 Portd = Lookup(cifri(x + 1) , Dta) Set Portb.x Return ' возвращаемся на место откуда прервали программу Dta: ' таблица с данными о цифрах зажигает по порядку : 0123456789 Data &H10 , &H73 , &H48 , &H41 , &H23 , &H81 , &H80 , &H53 , &H0 , &H1
В железе не проверял, код для общего плюса. Отпишитесь о результатах.
Код
' Пример часов которые отображают часы и минуты на семисегментном ' четырехсимвольном светодиодном индикаторе ' прога для ознакомления, работает 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 : 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