
.include "D:\my\radio\prog\m8def.inc"

.def     Temp=R16
.def     Temp1=R17
.def     Temp2=R18
.def     Temp3=R19
.def     Time1=R20
.def     TimeOn=R21
.def     TimeOff=R22
.def     sec1=R23
.def     Time2=R24


.cseg
.org 0


          ldi Temp,low(RamEnd)       ;инициализация стека
          out SPL,Temp
          ldi Temp,high(RamEnd)       ;инициализация стека
          out SPH,Temp

          ldi Temp,0b11111111   ;настройка портов
          out DDRB,Temp

          ldi Temp,0b11111111   ;настройка портов
          out DDRD,Temp

          ldi Temp,0b00001111   ;настройка портов
          out DDRC,Temp

;rcall settime
;rcall timeinit

;==================================================================================================================
;==================================================================================================================
;Основной цикл
;==================================================================================================================
;==================================================================================================================
Begin:
          ldi TimeOn,  0b01000000; !!!!!!!
          ldi TimeOff, 0b01000101; !!!!!!!

          rcall data_read ;читаем время с RTC DS1307
          rcall display

          cpse time1,TimeOff ;сравнение и пропуск следующей команды при равенстве
          rjmp label1
          ldi temp1, 0b00000000
          out PortB,temp1 
label1:
          cpse time1,TimeOn ;сравнение и пропуск следующей команды при равенстве
          rjmp Begin
          ldi temp1, 0b00000001
          out PortB,temp1 
             

rjmp Begin            
;==================================================================================================================
;==================================================================================================================

;Подпрограмма чтения теущего значения времени

data_read:

 ;Выставляем указатель регистра RTC на регистр 0
         rcall twi_start ; инициализируем условие СТАРТ
         rcall twi_rtc_w ; указываем на RTC и режим записи 
         ; Передача байта данных (Адрес регистра)
         ldi r16, 0x00
         out TWDR, r16
         ldi r16, (1<<TWINT) | (1<<TWEN)
         out TWCR, r16
         ; Подтв. передачи данных
         rcall data_send_good
         ;СТОП
         ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
         out TWCR, r16

 ;Считываем данные
         rcall twi_start ; инициализируем условие СТАРТ
         ;Загрузка АДРЕСА + бит чтения
         ldi r16, 0b11010001
         out TWDR, r16
         ldi r16, (1<<TWINT) | (1<<TWEN)
         out TWCR, r16
         rcall twi_int ;Подтв. передачи адреса (Проверка на установку флага TWINT)
         ;Подтв. передачи адреса
         cpi r16, 0x40
         brne ERROR

         ;Устанавливаем значения контрольного регистра
         ;для получения данных с подтверждением ответа TWEA==1
         ldi r16,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
         out TWCR,r16
         rcall twi_int ;Проверка на установку флага TWINT
         cpi r16, 0x50
         brne ERROR

         in Time1,TWDR


         ;Устанавливаем значения контрольного регистра
         ;для получения данных с подтверждением ответа TWEA==1
         ldi r16,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
         out TWCR,r16
         rcall twi_int ;Проверка на установку флага TWINT
         cpi r16, 0x50
         brne ERROR

         in Time1,TWDR

         ;Устанавливаем значения контрольного регистра
         ;для получения данных с подтверждением ответа TWEA==1
         ldi r16,(1<<TWINT)|(1<<TWEA)|(1<<TWEN)
         out TWCR,r16
         rcall twi_int ;Проверка на установку флага TWINT
         cpi r16, 0x50
         brne ERROR

         in Time2,TWDR

         ;Устанавливаем значения контрольного регистра
         ;для получения данных с НЕподтверждением ответа TWEA==0
         ldi r16,(1<<TWINT)|(0<<TWEA)|(1<<TWEN)
         out TWCR,r16

         rcall twi_int ;Проверка на установку флага TWINT

         cpi r16, 0x50
         brne ERROR

         ;СТОП
         ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
         out TWCR, r16
ret 

;=========================================================

;Подпрограмма START TWI
twi_start:
          ldi r16, (1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
          out TWCR, r16 
          rcall twi_int ;Проверка на установку флага TWINT
          cpi r16, 0x08;START
          brne ERROR
ret

;=========================================================
;Подпрограмма выбора RTC и режима записи
twi_rtc_w:
          ; Загрузка АДРЕСА_УСТРОЙСТВА + бит записи
          ldi r16, 0b11010000
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
          rcall twi_int ;Проверка на установку флага TWINT
          cpi r16, 0x18
          brne ERROR
ret

;=========================================================
;Подпрограмма проверки пересылки данных по TWI на RTC
data_send_good:
         in r16,TWCR
         sbrs r16,TWINT
         rjmp data_send_good
         in r16,TWSR
         andi r16, 0xF8
         cpi r16, 0x28; MT_DATA_ACK
         brne ERROR
ret

;=========================================================
;Подпрограмма проверки установки TWINT
twi_int:
         in r16,TWCR
         sbrs r16,TWINT
         rjmp twi_int
         ;Подтв. передачи адреса
         in r16,TWSR
         andi r16, 0xF8
ret


;========================================================

error:
 		nop
 		nop
 		nop
 		nop
 		nop
 		nop
 		nop
 		rjmp	twi_end

ret

; выход и режима работы с TWI
twi_end:

ret


;=========================================================
;Подпрограмма вывода на индикацию
display:
          ldi Temp,0b00000111 ;Активируем 4-ый разряд
          out PortC, temp

          mov sec1, time1
          andi sec1, 0b00001111
          rcall Decoder

          out PortD, sec1
          rcall Delay1
          ;===============================================
          swap time1
          mov sec1, time1

          ldi Temp,0b00001011 ;Активируем 3-ый разряд
          out PortC, temp

          andi sec1, 0b00001111
          rcall Decoder

          out PortD, sec1
          rcall Delay1
          ;===============================================
          swap time1

          ldi Temp,0b00001101 ;Активируем 2-ой разряд
          out PortC, temp

          mov sec1, time2
          andi sec1, 0b00001111
          rcall Decoder

          out PortD, sec1
          rcall Delay1
          ;===============================================
          swap time2
          mov sec1, time2

          ldi Temp,0b00001110 ;Активируем 1-ый разряд
          out PortC, temp

          andi sec1, 0b00001111
          rcall Decoder

          out PortD, sec1
          rcall Delay1

          swap time2

ret

;=========================================================
;Подпрограмма преобразования двоичного числа
;в код 7-сегментного индикатора

Decoder:

          ldi ZL,Low(DcMatrix*2)  ;инициализация массива
          ldi ZH,High(DcMatrix*2)

          ldi temp2,0
          add ZL, sec1            ;прибавление переменной
          adc ZH, temp2           ;к 0-му адресу массива

          lpm                     ;загрузка значения
          mov sec1, r0
          ret

DcMatrix:
;массив - таблица истинности декодера
          ;     hgfedcba   hgfedcba
          .db 0b00111111,0b00000110	;0,1
          .db 0b01011011,0b01001111	;2,3
          .db 0b01100110,0b01101101	;4,5
          .db 0b01111101,0b00000111	;6,7
          .db 0b01111111,0b01101111	;8,9

;=========================================================
;Задержка

Delay1:
;цикл задержки

              push Temp1
              push Temp2


              ldi Temp1,0
              ldi Temp2,5

d11:          dec Temp1
              brne d11
              dec Temp2
              brne d11

              pop Temp2
              pop Temp1

ret


settime:
;=============================
;=    Установка времени      =
;=============================
          rcall twi_start ; инициализируем условие СТАРТ
          rcall twi_rtc_w ; указываем на RTC и режим записи 

; Передача байта данных (Адрес регистра)
          ldi r16, 0x00
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good

; Передача байта данных (Пишем в регистр) СЕКУНДЫ
          ldi r16, 0b00000000
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good

; Передача байта данных (Пишем в регистр) МИНУТЫ
          ldi r16, 0b01010000
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good

; Передача байта данных (Пишем в регистр) ЧАСЫ
          ldi r16, 0b00010010
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good
;СТОП
          ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
          out TWCR, r16


ret

timeinit:
;=============================
;= Обнуление нулевого байта  =
;=============================
          rcall twi_start ; инициализируем условие СТАРТ
          rcall twi_rtc_w ; указываем на RTC и режим записи 

; Передача байта данных (Адрес регистра)
          ldi r16, 0x00
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good

; Передача байта данных (Пишем в регистр)
          ldi r16, 0b00000000
          out TWDR, r16
          ldi r16, (1<<TWINT) | (1<<TWEN)
          out TWCR, r16
; Подтв. передачи данных
          rcall data_send_good

;СТОП
          ldi r16, (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
          out TWCR, r16


ret
