;
;*************************************
; 
;*************************************
.include "tn2313def.inc"
;*******************
; GENERAL Constant

;***************************************************************
.equ num_device =0b00000111;номер свет.(0..3,величина переменная 
;                           для каждого свет.  индивидуальная)*
;***************************************************************
; Variales IIC
;*******************
.def num_IIC  =  R2;кол-во посылок 
.def adr_IIC  =  R3;адрес
.def subadr_IIC =R4;субадрес
.def data1_IIC  =R5;данные
.def date2_IIC  =R6;данные
.def BITS_IIC   =R11;биты IIC
.def A_IIC      =R12;акк.IIC
;*******************
; Constants IIC
;*******************
.equ SCL      =2;PORTB.SCL
.equ SDA      =3;PORTB.SDA
;**************************
.equ BRIIC    =1;BIT READ IIC
.equ BIICW    =2;BIT WORK(READ)
.equ ASK      =4;
.equ BACK     =5;бит возобновл.связи при отсутствии ASK
.equ RIIC2W   =6;бит чтения 2-х байт  
;*******************
; Register Variables
;*******************
.def temp     =R19 
.def ENV4     =R8
.def CON4     =R7;байт директивы привода
.def con_light=R16;регистр управл.светильником
.def r_comp_h =R24
.def r_comp_l =R25
.def temp_T1  =R22
.def temp_com =R23
.def tempr    =R10;!!!
.def cou_lc   =R14
;****************
.def BYTE_FL =R13;Байт флагов
;****************
.equ fl_REC    =7;BYTE_FL.7 флаг приема
.equ fl_TRAN   =6;BYTE_FL.6 флаг передачи
.equ fl_end_TRAN =5;BYTE_FL.5 флаг конца передачи
.equ fl_tcode  =4;флаг проверки призн.телекода
.equ fl_ch_adr =3;флаг проверки адреса
.equ fl_s_wat  =0; 
;---------------- 
.def cou_trans =r21;счетч.передан.байт  
.def R_con_sum =R9;байт прин.контр.суммы
.def temp_UART =R17
.def con_sum   =R18;байт подсчит.контр.суммы прин.байт
.def cou_rec   =R20;счетч.прин.байт 
.def cou_uart = R15;
;.def cou_delay =r13

;---------------- 
;***************** 
; Constants
;*****************
;.equ num_device =0b00000100
.equ sens_wat =3;(сост.датч.обводн. 1-обв.,0-норм.сост)
.equ DE      =6;(6-й бит порта D перекл.RS485)
.equ Tmax_h  =0x42;(дл.имп.зап.АГ3-реж.мах)
.equ Tmax_l  =0x20;
.equ Tmin_h  =0x27;(дл.имп.зап.АГ3-реж.номинал.)
.equ Tmin_l  =0x10;
.equ Tempr_max =0x46;
.equ Tempr_min =0x3C
.equ val_lc  =0x4;
;***************************************************************
.equ num_rec_byte =2;кол-во байт информ. в приним.пакете
.equ num_trans_byte =6;кол-во байт информ. в передав.пакете
.equ attr_code = 0b10101010;признак телекода
;***********************************
.cseg
.org $0000
rjmp RESET
;****************
.org INT0addr ;                  Поменял все старые названия прерываний на адреса
reti
.org INT1addr
;reti
.org ICP1addr 
reti
.org OC1Aaddr
rjmp int_comp_T1  
.org  OVF1addr
reti
.org  OVF0addr
;rjmp int_OVF0
reti; 
.org URXC0addr
rjmp UART_RXC
;
.org UDRE0addr
rjmp UART_DRE
;
.org  UTXC0addr
rjmp UART_TXC
;
.org ACIaddr
;rjmp ANA_COMP
;                                           Дописываю прерывания для ATiny2313
reti
.org  PCINTaddr
reti
.org  OC1Baddr
reti
.org  OC0Aaddr
reti
.org  OC0Baddr
reti
.org  USI_STARTaddr
reti
.org  USI_OVFaddr
reti
.org  ERDYaddr
reti
.org  WDTaddr
reti
;
;***********************************
; Start Of Main Program
;***********************************
Reset:
       ldi   TEMP, 0xDF
	   out   SPL, TEMP;Указатель стека (0xDF)
	   ldi   temp,0b11111100;0-AIN0(I),1-AIN1(I)
       out   DDRB,temp
	   ldi   con_light,0b00111100;(На Э3 DD4((7b)А1=0,
 	   out   PORTB,con_light;(6b)А2=0)DD3((5b)A=1,(4b)=1)
       ldi   temp,0b1110010
	   out   DDRD,temp;0-RXD(I),1-TXD(O),2-INT0(I),
		      ;3-INT1(I),6-DE(O)
       cbi   DDRD,2     
       cbi   DDRD,3
       sbi   PORTD,2
       sbi   PORTD,3
       sbi   PORTD,1;TXD 
	   ldi   TEMP, 29;(Частота кв. 9,216 мГц,
	   out   UBRRL, TEMP;скорость обмена 19200)                    Замена имени регистра UBRR
	   ldi   temp,0b00001000;(CTC1=1,CS10,CS11,CS12=0,stop T1)
       out   TCCR1B,temp
 	   ldi   temp, 0b01000000
	   out   TIMSK,temp;(6b-OCIE1A-out compare match in.en T1)
	   ldi   temp,Tmin_h;(timer/coun.1 output compare reg.A)
	   out   OCR1AH,temp
	   ldi   temp,Tmin_l
	   out   OCR1AL,temp
	   ldi   temp,0b00000000;b;(ACD=0,RES=0,ACO=0,ACI=0,ACIE=0,ACIC=0
	   out   ACSR,temp;ACIS1=0,ACIS0=0)разр.прер.копарат.
	   ldi   temp,0b00000000
	   mov   BYTE_FL,temp
	   mov   R_con_sum,temp
	   mov   BITS_IIC,temp
	   ldi   temp,0x18
	   mov   tempr,temp
	   rcall conf_ds1621
	   clr   r27;Указатель принят.байт(X)
	   ldi   r26,$60
       clr   r29;Указатель передав.байт(Y)
	   ldi   r28,$68 
	   clr   cou_rec;сбр. сч. пр.байт
	   clr   cou_trans;сбр. сч. пeр.байт
	   clt
	   bld   ENV4,sens_wat
	   ldi   temp,0b00000000
	   mov   cou_lc,temp
       SEI
;*************************************
BEGIN:;начало цикла обмена и управления		
;*************************************			 
;RECEIVE  	    
        cbi   PORTD,DE;перекл. линии DE на прием        
        ldi   temp,0b10010000;разрешение приема
 	    out   UCSRB, temp; ((b7)RXCIE=1,(b4)RXEN=1,(b2)\=0)   Замена имени регистра UCR
;		ldi   temp,0x04;!!!!!!!!!!!!!!!!!
;		mov   CON4,temp;!!!!!!!!!!!!!!!!!
;		rcall  TURN_light;!!!!!!!!!!!!!!!Отладка схемы
;		ldi   val_u,0b00000000 
Wait_R: nop   ;Подпр. реж.ожидания приема
		sbic  UCSRB,RXEN ;                                       Замена имени регистра UCR
		rjmp  Wait_R
		sbrs BYTE_FL,fl_s_wat
        rjmp count_lc
		rcall an_swat;ANA_COMP 	    
no_swat: rcall TURN_light;Подпр.перекл.реж.по принят.команде  
        rcall PREP_data;Подпр.подгот.данных о сост.светильн.
		rcall delay
;TRANSMISSION:
;
		sbi   UCSRB,TXEN;TXEN=1                                   Замена имени регистра UCR
        set
		bld   BYTE_FL,fl_TRAN
		sbi   UCSRB,UDRIE;UDRIE=1                               Замена имени регистра UCR
Wait_TR:nop
        sbrc  BYTE_FL,fl_TRAN
		rjmp  Wait_TR
		rjmp  BEGIN
;************************************* 
;END   конец цикла обмена и управления	     	
;*************************************
count_lc: inc   cou_lc
          ldi   temp,val_lc
          cp    cou_lc,temp
		  brne  ex_coulc
		  set
		  bld   BYTE_FL,fl_s_wat
ex_coulc: rjmp  no_swat         
;***********************************
AN_SWAT:   sbis  PINB,0
           rjmp  ex_an_sw;no_swat
           set
           bld   ENV4,sens_wat
		   rcall stop_light
ex_an_sw:  ret
;***********************************
;Subroutine interrupt UART RX Complete
;***********************************
UART_RXC:
          in     temp_UART,SREG
          push   temp_UART
          in     temp_UART,UDR 
		  sbrc   BYTE_FL,FL_rec
		  rjmp   rt_rec
		  sbrc   BYTE_FL,fl_ch_adr
		  rjmp   rt_ch_adr
		  sbrc   BYTE_FL,fl_tcode
		  rjmp   rt_ch_tcode
		  rcall  ch_atr_tcode
Exit_RXC: pop    temp_UART
          out    SREG,temp_UART
          reti		  
;***********************************
;*************************
rt_rec:   st     X+,temp_UART    
          inc    cou_rec 
          cpi    cou_rec,num_rec_byte
		  breq   end_rec
		  add    con_sum,temp_UART 
		  rjmp   exit_RXC
end_rec:  com    con_sum
          cp     con_sum,temp_UART
          brne   end_no_wr
		  dec    r26
 		  ld     CON4,-X
;		  ld     PWM_n,-X		     
end_no_wr: clt
          bld   BYTE_FL,fl_rec
	      clr   cou_rec;сбр. сч. пр.байт
		  clr   con_sum
		  ldi   temp_UART,0b00000000;конец приема RXEN,RXCIE=0b
 	      out   UCSRB,temp_UART; ((b7)RXCIE=0,(b4)RXEN=0,(b2)CHR9=1)  Замена имени регистра UCR
          rjmp   exit_RXC
;*************************
rt_ch_adr: cpi    temp_UART,num_device
          brne   Clr_flREC
		  set
		  bld    BYTE_FL,fl_REC
		  clt
		  bld    BYTE_FL,fl_ch_adr 
		  rjmp   Exit_RXC
Clr_flREC:clt
          bld    BYTE_FL,fl_REC
		  bld    BYTE_FL,fl_ch_adr 
		  rjmp   Exit_RXC 
;*************************
rt_ch_tcode:
          rcall   ch_atr_tcode
		  sbrs    BYTE_FL,fl_tcode
		  rjmp    cl_ch_code
		  set
		  bld     BYTE_FL,fl_ch_adr
		  clt
		  bld     BYTE_FL,fl_tcode
          rjmp    exit_RXC
cl_ch_code:clt
          bld     BYTE_FL,fl_ch_adr
          bld     BYTE_FL,fl_tcode
          rjmp    exit_RXC 
;*************************
ch_atr_tcode:
          cpi    temp_UART,attr_code
		  breq   set_fl_tcode
		  clt
		  bld    BYTE_FL,fl_tcode
ex_catcode: ret
set_fl_tcode:
          set
          bld   BYTE_FL,fl_tcode
		  rjmp   ex_catcode  		   
;***********************************
;Subroutine interrupt UART TX Complete
;***********************************
UART_TXC: in     temp_UART,SREG
          push   temp_UART
		  inc    cou_trans
		  cpi    cou_trans,num_trans_byte
		  brne   TRAN_DATE 
;         sbrs   BYTE_FL,fl_end_TRAN
;		  rjmp   TRAN_DATE
		  cbi    UCSRB,TXCIE ;                                       Замена имени регистра UCR
		  cbi    UCSRB,TXEN  ;                                       Замена имени регистра UCR
 		  clt
 		  bld    BYTE_FL,fl_TRAN
;		  bld    BYTE_FL,fl_end_TRAN
          cbi    PORTD,DE;перекл. линии DE на прием
	      clr    r29;Указатель передав.байт(Y)
	      ldi    r28,$68
		  clr    cou_trans
Exit_TXC: pop    temp_UART
          out    SREG,temp_UART
          reti
TRAN_DATE:
;          rcall  beg_del
          ld     temp_UART,Y+ 
          out    UDR,temp_UART
		  rjmp   Exit_TXC
;***********************************
;Subroutine interrupt UART UDR empty
;***********************************
UART_DRE: in     temp_UART,SREG
          push   temp_UART
		  cbi    UCSRB,UDRIE  ;                                      Замена имени регистра UCR
;		  cbi    UCR,TXB8
		  sbi    PORTD,DE;перекл. линии DE на передачу
          ldi    temp_UART,attr_code  
          out    UDR,temp_UART
		  sbi    UCSRB,TXCIE  ;                                      Замена имени регистра UCR
 		  pop    temp_UART
          out    SREG,temp_UART
          reti       
;***********************************
;***********************************
;Subroutine interrupt match Compare T1
;***********************************
int_comp_T1: cbi PORTB,5
             ldi temp_T1,0x2f
compr_t: 	 dec temp_T1
             cpi temp_T1,0x00
			 brne compr_t
             sbi PORTB,5
ex_intcT:    reti
;***********************************
int_OVF0:
reti
;***********************************
;***********************************
;Subroutine TURN_light
;(Подпр.перекл.реж.по принят.команде)                      
;***********************************
TURN_light: sbrc ENV4,sens_wat
           rjmp ch_ms_sw
beg_turn:  mov  temp,con4
           andi  temp,0b11000000 
           cpi   temp,0b00000000
		   breq  On_light
stop_light: ldi   con_light,0b00111100;(На Э3 DD4((7b)А1=0,
 	       out   PORTB,con_light;(6b)А2=0)DD3((5b)A=1),(4b)=0
		   ldi   temp,0b00001000;(CTC1=1,CS10,CS11,CS12=0,stop T1)
           out   TCCR1B,temp
ex_turligh: ret
;*************************
ch_ms_sw:  sbrs  CON4,3  
           rjmp  stop_light
		   rjmp  beg_turn 
;*************************
On_light:  mov   temp,con4
           andi  temp,0b00110000
		   cpi   temp,0b00110000
		   breq  reg_max
           ldi	 r_comp_h,Tmin_h
	   	   ldi   r_comp_l,Tmin_l
wr_rcomp:  out   OCR1AH,r_comp_h
		   out   OCR1AL,r_comp_l
           bst   con4,5
           bld   con_light,6
		   bst   con4,4
		   bld   con_light,7
		   clt   ;бит включения света !!!!!!!!!!!!!!!!!!!!!!!!!!!
		   bld   con_light,4;доработка платы твердотельн.реле!!!!
		   out   PORTB,con_light
		   ldi   temp,0b00001001;(CTC1=1;CS10,CS11,CS12=0,stop T1)
           out   TCCR1B,temp
		   rjmp  ex_turligh
reg_max:   ldi	 r_comp_h,Tmax_h
	   	   ldi   r_comp_l,Tmax_l
		   rjmp  wr_rcomp
;***********************************
;***********************************
;Subroutine PREP_data
;(Подпр.подгот.данных о сост.)                      
;***********************************
PREP_data:
           rcall rd_tempr
           mov   tempr,R5
           bst   con_light,6
           bld   ENV4,5
		   bst   con_light,7
		   bld   ENV4,4
		   bst   con4,7
		   bld   ENV4,7
		   bst   con4,6
		   bld   ENV4,6
		   clt
		   bld   ENV4,0
           bld   ENV4,1
		   bld   ENV4,2
wr_date:     ldi   temp,attr_code
	         st    Y+,temp
	       	 ldi   temp,num_device
             st    Y+,temp
		     st    Y+,ENV4
			 st    Y+,tempr 
	         mov   temp,tempr
		     add   temp,ENV4;перед.контр.сумма
			 com   temp
		     st    Y+,temp
	         clr   r29;Указатель передав.байт(Y)
	         ldi   r28,$68               
             ret	  
;**************************************
;***********************************
;Subroutine PREP_data
;(Подпр.подгот.данных о сост.светильн.)                      
;***********************************
; PREP_data:
;           ret
;**************************************
;Subroutine interrupt analog comparator
;(подпрог.сраб.аналог.компаратора)
;**************************************
;ANA_COMP:  set
;           bld   ENV4,sens_wat
;		   sbrs CON4,3
;		   rcall stop_light
;           in    temp_com,ACSR 
;		   clt    
;           bld   temp_com,3; ACIE=0
;		   out   ACSR,temp_com 
;           reti
;**************************************
;**************************************
delay:    ldi    temp,0x35
          mov    cou_uart,temp 
cyc_del:  rcall  beg_del
		  dec    cou_uart
		  mov    temp,cou_uart
          cpi    temp,0x00
		  brne   cyc_del
          ret
;**************************************
beg_del:  ldi    temp,0x0FF
comp_del: dec    temp
		  cpi    temp,0x00
          brne   comp_del
          ret
;**************************************
; Подпрограмма связи по IIC
;************************************** 		   
IIC:      push   temp
          in     temp,SREG
          push   temp
		  push   R0
		  push   R1     
;---------------------
          ldi   temp,0x0F;кол-во посылок при неответе 
          mov   R0,temp 
;---------------------
no_ack:   clt
		  bld    BITS_IIC,BACK 
		  push   R0
		  clr    R31
		  ldi    R30,$03;адрес косв.адр.Z - (R3)
		  ld     A_IIC,Z+ 
;---------------------
          push   R2;кол-во посылок
;---------------------
          rcall  SIIC
;---------------------
          pop    R2
		  pop    R0 
;---------------------
          brcc   ex
		  dec    R0
		  brne	 no_ack
		  set
		  bld    BITS_IIC,BACK
ex:		  rcall  STIIC
;---------------------
          pop    R1
		  pop    R0
		  pop    temp
		  out    SREG,temp
		  POP    temp		  	   
;**********************
          ret
;**************************************		   
;**************************************
SIIC:                 ;start IIc
;**************************************
          cbi     PORTB,SDA
		  rcall   DIIC
;*********************
WIIC:;              write IIC
;*********************
    	  sec
          ldi     temp,0x08
		  mov     R0,temp
;--------------------
beg_sh:   cbi     PORTB,SCL
		  rcall   DIIC
		  rol     A_IIC
		  rcall   ch_c 
		  sbi     PORTB,SCL
		  rcall   DIIC
;--------------------
          dec     R0
		  brne    beg_sh
		  cbi     PORTB,SCL
		  rcall   DIIC
;
          sbi     PORTB,SDA
		  sbi     PORTB,SCL
		  rcall   DIIC
;
          cbi     DDRB,SDA
          rcall   rd_SDA
          sbi     DDRB,SDA
;
		  cbi     PORTB,SCL
		  rcall   DIIC
;
          cbi     PORTB,SDA
;
          brcc    sub_adr
		  sec
		  rjmp    STIIC
;--------------------
sub_adr:  sbrc    BITS_IIC,BIICW
          rjmp    rd_RIIC;
;--------------------
		  ld      A_IIC,Z+
		  dec     R2
		  brne    WIIC
;--------------------
          dec     r30
          sbrs    BITS_IIC,BRIIC
		  rjmp    STIIC
;********************
RIIC:;          read IIC
;********************
          rcall   STIIC
		  set
		  bld     BITS_IIC,BIICW
		  rjmp    SIIC
;---------------------
rd_RIIC:  clt
          bld     BITS_IIC,BIICW
;---------------------
          ldi     temp,0x00
          mov     A_IIC,temp
		  inc     A_IIC
		  sbi     PORTB,SDA
          cbi     DDRB,SDA;направл.input
;---------------------
beg_c_rd: sbi     PORTB,SCL
          rcall   DIIC
		  rcall   rd_SDA
		  rol     A_IIC
		  cbi     PORTB,SCL
		  rcall   DIIC
		  brcc    beg_c_rd
;
          sbi     DDRB,SDA;направл. output 
		  sbrc    BITS_IIC,RIIC2W
		  rjmp    rd_2w 
;
          sbi     PORTB,SCL
		  rcall   DIIC
;
          cbi     PORTB,SCL
		  rcall   DIIC
;
          cbi     PORTB,SDA
;		  bld     BITS_IIC,SDA;
          clt
          bld     BITS_IIC,BRIIC
;
		  clc 
;
          st      Z,A_IIC; ld      A_IIC,Z	  		  		  
		  		   
;*********************
STIIC:;   stop IIC
;---------------------
          sbi   PORTB,SCL
		  rcall DIIC
		  sbi   PORTB,SDA
;********************
DIIC:     nop
          ret
;********************
rd_2w:; 1-е слово при чтении 2-х байт
;********************
          cbi   PORTB,SDA; (ASK master)
		  sbi   PORTB,SCL
		  rcall DIIC
		  cbi   PORTB,SCL;
;		  dec   R30
          st    Z+,A_IIC; ld    A_IIC,Z+1;
		  clt
		  bld   BITS_IIC,RIIC2W
          rjmp  rd_RIIC 
;********************	   
ch_c:     brcs scarri
 		  cbi  PORTB,SDA
		  ret
scarri:	  sbi  PORTB,SDA
          ret
;--------------------
rd_SDA: 
;          cbi     DDRB,SDA 
;          in      temp,PORTB
          sbic    PINB,SDA
		  rjmp    rd_c_set
		  clc
          ret
		  
rd_c_set: sec
          ret
;--------------------
;*********************
rd_DS1621:;чтение цифрового термометра
;*********************
          ldi  temp,0x02;Quantuty Passes
		  mov  R2,temp
		  ldi  temp,0b10010000;slave adress W
		  mov  R3,temp
;         R4                   Word adress
          ldi  temp,0b10010001;slave adress R
		  mov  r5,temp
		  set
		  bld  BITS_IIC,BRIIC
		  bld  BITS_IIC,RIIC2W
;----------------------
          rjmp IIC
;----------------------
; R5-DATA_0,R6-DATA_1
;************************
wr_DS1621:;запись цифрового термометра
;************************
;         r4               Word adress
		  ldi  temp,0b10010000;slave adress W
		  mov  R3,temp
;         R5               Data
;-------------------------
          rjmp IIC
;************************
conf_ds1621:;подпрог.конфиг.цифр.термометра
;************************
          ldi   temp,0x03; Quantuty Passes
		  mov   R2,temp 
          ldi   temp,0xAC
		  mov   R4,temp
		  ldi   temp,0x00
		  mov   R5,temp
		  rcall wr_DS1621
;		  mov   tempr,BITS_IIC;!!!!!!!!отладка
;------------------------
          ldi   temp,0x02; Quantuty Passes
		  mov   R2,temp 
          ldi   temp,0xEE
		  mov   R4,temp
		  rcall wr_DS1621 
		  ret
;************************
rd_tempr:; подпр.чтения температуры
;************************
          ldi   temp,0xAA
		  mov   R4,temp
		  rcall rd_DS1621
		  ret
;************************
          		    		                		    		   		  			  		   		  	      		     
