Цитата(r_dot @ Dec 8 2007, 09:35)

Ошибка в программе.
Если выложишь, можно найти.
Это уже почти доделаннная программа, таймер(Минутный, без секунд и часов) с управлением от пульта RC5. Проблема такая: При нажатии цифру 4 (изменение минут прибавлением на единицу), может сам по себе сбросится, или не отреагировать никак.
$large
Baud = 9600 ' Скорость обмена
$crystal = 11059200 ' Частота кварца
'---------------------------------------------------------------------------
Config Scl = P3.6 ' I2C Clock
Config Sda = P3.7 ' I2C Data
'---------------------------------------------------------------------------
Sqw Alias P3.0 ' Square Pulse Out
Hour10 Alias P1.7 ' 10 Hour
'------------------------------------------------------------------------
Dim Command As Byte , Subaddress As Byte
Dim Reg_sec As Byte ' Секунды
Dim Reg_min As Byte ' Минуты
Dim Reg_hour As Byte ' Часы
Dim Tempb As Byte
Dim Temp1b As Byte
Dim Temp2b As Byte
Dim Temp3b As Byte
Dim Setup As Byte
Setup = 3
'---------------------------------------------------------------------------
Const Segpat0 = &B00111111 ' 0 ****A***
Const Segpat1 = &B00000110 ' 1 * *
Const Segpat2 = &B01011011 ' 2 F B
Const Segpat3 = &B01001111 ' 3 * *
Const Segpat4 = &B01100110 ' 4 ****G***
Const Segpat5 = &B01101101 ' 5 * *
Const Segpat6 = &B01111101 ' 6 E C
Const Segpat7 = &B00100111 ' 7 * *
Const Segpat8 = &B01111111 ' 8 ****D***
Const Segpat9 = &B01101111 ' 9
Const Segpblk = &B00000000 ' A BLANK
'---------------------------------------------------------------------------
Const Ds1307w = &HD0 ' Байт записи
Const Ds1307r = &HD1 ' Байт чтения
'---------------------------------------------------------------------------
Gosub Clock_init
'---------------------------------------------------------------------------
Reset Tcon.0
On Int0 Receiverc5
Enable Int0
Enable Interrupts
'***************Основная часть программы**********************
Do '
Disable Int0 ' Запретить прерывание
Select Case Setup
Case 1 :
Gosub Read_ds1307 'Чтение данных с часов
Enable Int0
Gosub Displaysub 'Вывод на табло
Tempb = Reg_sec And &B01110000 ' Точки
If Sqw = 1 Then
Set Colon_d1
Set Colon_d2
Else
Reset Colon_d1
Reset Colon_d2
End If
Disable Int0
'
'//////////////////////////////////////////////////////////////////////////////
Case 2:
Tempb = Reg_min And &B01110000 ' Получаем десятки минут!!!
Reg_min = Reg_min And &B00001111 ' Получаем единицы минут
Reg_min = Reg_min + 1
If Reg_min > 9 Then
Reg_min = 0
Tempb = Tempb + &B00010000
If Tempb > &B01010000 Then
Tempb = 0
End If
End If
'
Reg_min = Reg_min Or Tempb
'
I2cstart ' Generate start
I2cwbyte Ds1307w ' Slave adsress
I2cwbyte &H00 ' Address of Control REG
I2cwbyte &H00 ' Address of Control REG
I2cwbyte Reg_min ' Clear Second
I2cstop
Setup = 1
'-*/-*/-*/-*/-*/-*/-*/-*/-/-*/-*/-*/-*/-*/-*/-*/-*/-*/-*/-*/-*/-*/
Case 3:
Reg_min = &B00000000 'Сбросить минуты на 0
'
I2cstart ' Generate start
I2cwbyte Ds1307w ' Slave adsress
I2cwbyte &H00 ' Address of Control REG
I2cwbyte &H00 ' Address of Control REG
I2cwbyte Reg_min ' Clear Second
I2cstop
Setup = 0
Gosub Displaysub
End Select
'=--=-=-=-=---=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=
Enable Int0 '
For Tempb = 0 To 25
nop
Next Tempb
'
Loop '
'*************************************************************'
'---------------------------------------------------------------------------
Read_ds1307: ' Чтение времени
'
I2cstart ' Старт передачи
I2cwbyte Ds1307w ' Передаем байт записи
I2cwbyte &H00 ' Адресс = 0
I2cstop ' Стоп передачи
'
I2cstart ' Старт передачи
I2cwbyte Ds1307r ' Передаем байт чтения
I2crbyte Reg_sec , Ack ' Принимаем 8 байт
I2crbyte Reg_min , Ack ' Принимаем 8 байт
I2crbyte Reg_hour , Nack ' Принимаем 9 байт
I2cstop ' Стоп передачи
'
Return
'---------------------------------------------------------------------------
Displaysub:
Tempb = Reg_min ' Minutes
Gosub Patcon
Temp1b.7 = P2.7
P2 = Temp1b
Tempb = Reg_min
Shift Tempb , Right , 4
Gosub Patcon
Temp1b.7 = P0.7
P0 = Temp1b
'
Return
'---------------------------------------------------------------------------
Patcon:
Tempb = Tempb And &H0F
Select Case Tempb
Case 0 : Temp1b = Segpat0
Case 1 : Temp1b = Segpat1
Case 2 : Temp1b = Segpat2
Case 3 : Temp1b = Segpat3
Case 4 : Temp1b = Segpat4
Case 5 : Temp1b = Segpat5
Case 6 : Temp1b = Segpat6
Case 7 : Temp1b = Segpat7
Case 8 : Temp1b = Segpat8
Case 9 : Temp1b = Segpat9
Case Else
End Select
'
Return
'---------------------------------------------------------------------------
Clock_init: ' DS1307 Initialize
'
Tempb = Reg_sec And &B01111111 ' Oscillator Enable
I2cstart ' Generate start
I2cwbyte Ds1307w ' Slave adsress
I2cwbyte &H00 ' Address of Seconds REG
I2cwbyte Tempb '
I2cstop ' Generate Stop
'
Tempb = Reg_hour And &B10111111 ' 24-Hour Mode
I2cstart ' Generate start
I2cwbyte Ds1307w ' Slave adsress
I2cwbyte &H02 ' Address of Seconds REG
I2cwbyte Tempb '
I2cstop ' Generate Stop
'
Tempb = &B10010000 ' 1 Hz SQW Output
I2cstart ' Generate start
I2cwbyte Ds1307w ' Slave adsress
I2cwbyte &H07 ' Address of Control REG
I2cwbyte Tempb '
I2cstop ' Generate Stop
'
Return
'---------------------------------------------------------------------------
Receiverc5:
Getrc5(subaddress , Command)
Subaddress = Subaddress And &B00011111 '
If Subaddress = 0 Then
If Command > 10 Then Command = 0 '
'
Select Case Command
Case 1 :
Command = 0
Setup = 1
Case 2 :
Command = 0
Setup =2
Case 3 :
Command = 0
Setup =3
End Select
End If
Return
'---------------------------------------------------------------------------