Привет, коллеги!
Изобретаю одно устройство, с несколькими функциями. Одна из этих функций - таймер(отсчет времени до нуля). Написал код только для таймера(остальные функции удалены чтоб не мешались), информация выводится на семисегментный индикатор с 7 разрядами, но для вывода отсчета времени используются только 4. Таймер привязан к асинхронному режиму. повешен кварц 32768 на ноги (XTAL1/TOSC1) PB6 и (XTAL2/TOSC2) PB7,микроконтроллера Атмега8А. Индикация выводит при включении заданные цифры (12.59) и все, отсчет не идет((( Хотя теоритически все правильно. Вот код:
$regfile = "m8def.dat"
$crystal = 8000000
'----------------------------Псевдонимы---------------------------------------
'---------------Объявление подпрограмм и функций--------------------------------
'-------------------Конфигурирование портов-------------------------------------
'Config 1wire = Portd.0 'Однопроводная Шина
Config Portc = Output 'Индикаторы
'----------------------Разрешаем прерывания-------------------------------------
Enable Interrupts
Enable Timer0
Enable Timer2
'---------------------Конфигурирование таймеров---------------------------------
Config Timer0 = Timer , Prescale = 256
On Timer0 Din_indik
Config Timer2 = Timer , Async = On , Prescale = 128
On Timer2 Pulse0
Start Timer0
Start Timer2 '
'------------------Переменные для термометра и термостата-----------------------
Dim Tdes As Byte 'для десятичной части
Dim Tcel As Byte 'для целой части
'------------------Переменные для таймера---------------------------------------
Dim M As Integer 'Переменная для минут
Dim S As Integer 'Переменная для секунд
'-------------переменные для преобразования исходного числа---------------------
Dim N1 As Byte
Dim N2 As Byte
Dim N3 As Byte
Dim N4 As Byte
Dim N5 As Byte
Dim N6 As Byte
Dim N7 As Byte
Dim M1 As Long
Dim M2 As Long
Dim M3 As Long
Dim M4 As Long
Dim M5 As Long
Dim M6 As Long
Dim M7 As Long
'-------------------------------------------------------------------------------
Dim R As Byte 'для значений отправляемых в регистр
'----------Переменные разные----------------------------------------------------
'-----------------Начало основного цикла----------------------------------------
S = 59
M = 12
Tcel = 24
Tdes = 7
Do
If S = 0 Then
Decr M
S = 59
End If
'раскладываем число на составляющие
M1 = Tcel
M2 = M1
M4 = M
M5 = M4
M6 = S
M7 = M6
M1 = M1 Mod 100
M1 = M1 / 10
N1 = Abs(m1)
M2 = M2 Mod 10
N2 = Abs(m2)
N3 = Tdes
M4 = M4 Mod 100
M4 = M4 / 10
N4 = Abs(m4)
M5 = M5 Mod 10
N5 = Abs(m5)
M6 = M6 Mod 100
M6 = M6 / 10
N6 = Abs(m6)
M7 = M7 Mod 10
N7 = Abs(m7)
Loop
End 'конец программы
'массив с кодами для семисегментника
'--------------Определения 7-ми сегментника (общ. аннод)----------------------
'
Numbers:
' FBGCdpDEA (в цифры после сегмента это разряд порта)
Data &B00101000 '0 ***A0***
Data &B10101111 '1 * *
Data &B10011000 '2 F7 B6
Data &B10001010 '3 * *
Data &B00001111 '4 ***G5***
Data &B01001010 '5 * *
Data &B01001000 '6 E1 C4
Data &B10101110 '7 * *
Data &B00001000 '8 ***D2***
Data &B00001010 '9 dp3
Data &B11110111 'точка
Data &B01011000 'E
Data &B11011101 'r
Data &B00011100 'P
Data &B00001101 'H
Data &B01111101 'I
'подпрограмма отправки данных в регистр
Registr:
Shiftout Portc.0 , Portc.2 , R , 1 'задвигаем данные
Pulseout Portc , 1 , 5 'защелкиваем регистр
Waitus 800 'задержка переключений разрядов
Return
'подпрограмма работы с регистром переключающим аноды
Anod:
Shiftout Portc.3 , Portc.5 , R , 1
Pulseout Portc , 4 , 5
'Waitms 5
Return
Din_indik:
R = &B00000001 ' первая цифра термометра
Gosub Anod
R = Lookup(n1 , Numbers)
Gosub Registr
R = &B00000010 ' вторая цифра термометра
Gosub Anod
R = Lookup(n2 , Numbers)
Gosub Registr
R = Lookup(10 , Numbers)
Gosub Registr
R = &B00000100 ' третья цифра термометра
Gosub Anod
R = Lookup(n3 , Numbers)
Gosub Registr
R = &B00001000 ' первая цифра таймера
Gosub Anod
R = Lookup(n4 , Numbers)
Gosub Registr
R = &B00010000 ' вторая цифра таймера
Gosub Anod
R = Lookup(n5 , Numbers)
Gosub Registr
R = &B00100000 ' третья цифра таймера
Gosub Anod
R = Lookup(n6 , Numbers)
Gosub Registr
R = &B01000000 ' четвертая цифра таймера
Gosub Anod
R = Lookup(n7 , Numbers)
Gosub Registr
Return
Pulse0: 'прерывание по таймеру
Decr S
Return