Программирование BASCOM
Меню сайта
Категории каталога
Мои статьи [115]
Наш опрос
Оцените мой сайт
Всего ответов: 1292
Главная » Статьи » Мои статьи

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

 

 

 

Часы считаются софтово.
Config Clock = Soft                                         
от кварца, подцепленного на xtal1 (2)
Кстати уже двое суток идут секунда в секунду с компом.
Кварц со звездочкой, поскольку не знаю его номинала а только догадываюсь, он без обозначений.

 

Я заказывал вот такие индикаторы на Алиэкспресс: 

красные - https://goo.gl/yj59qt
синие - https://goo.gl/plr0pu 
можно применить такие:
зелёные - https://goo.gl/cIlQdM
белые - https://goo.gl/PbLqgG
 
Окончательный код:
 
' Пример часов которые отображают часы и минуты на семисегментном
' четырехсимвольном светодиодном индикаторе
' прога для ознакомления, работает 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

Категория: Мои статьи | Добавил: bascom (01.09.2009)
Просмотров: 30930 | Комментарии: 19
Всего комментариев: 191 2 »
19 Ev3658  
0

Код
Угощайтесь на Atmega16 и 32  :)  программа для тактовых производственных часов.
$regfile = "m16def.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'Config Clock = Soft
Disable Timer2
Timer2 = 0
Config Timer2 = Count , Async = On , Prescale = 128

Wait 1                                                      'Ждём для установки резонанса в резонаторе кварца
'Кнопка управления
Config Portd.7 = Input

'Для сегментов или светодиода
Config Portb = Output
Portb = 255                                                 'Отключаю сегмент

'Прерывание раз в секунду во Таймеру 2
On Timer2 Sec

'Порты микроконтроллера
Config Porta.0 = Output
Config Porta.1 = Output

'Нужные переменные
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

18 Ev3658  
0
Вы прикинте, два дня парился с Atmega16 и в итоги наткнулся на это - http://atmega32-avr.com/real-time-clock-atmega16/
Кварц подцепляют не на Xtail на на осциллятор surprised
http://atmega32-avr.com/wp-content/uploads/2012/06/Real-Time-Clock-M16_sch.gif

17 Diagnost  
0
Прошу прощения, это был общий минус. А с общим плюсом вот он:
 
Код
'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

16 Diagnost  
0
В железе не проверял, код для общего плюса. Отпишитесь о результатах.
Код
' Пример часов которые отображают часы и минуты на семисегментном
' четырехсимвольном светодиодном индикаторе
' прога для ознакомления, работает 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

15 сете  
0
Термостат бы, для силы

13 Alex-M  
0
Доброго времени суток а возможно ли переделать прошивку под индикаторы с общим плюсом ?
Зарание благадарен !

14 bascom  
0

12 Василий  
0
Подскажите, а для CodeVision фьюзы такие же?

11 Pasha  
0
bascomavr.3bb.ru/ где то на этом форуме компилятор выложен. bascomavr называется. В нем и скомпилировать можно

10 Василий  
0
Помогите пожалуйста, как этот код перевести в HEX

9 Wel11  
0
Извиняюсь, увидел, думал это код всё.

1-10 11-16
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright Radan Studio © 2024