;
;   НАСТРОЙКА СТОРОЖЕВОГО ТАЙМЕРА
;
;грубо говоря мы включаем сторожевой таймер с периодом 0,25 сек, и командой WDR периодически его обнуляем, и по теории он
;перезапустит МК если произойдет зависание программы и программа вовремя не сможет обнулить сторожевой таймер
;
;
.cseg
.include "tn13Adef.inc"

;***************************************************************************************
;***************************************************************************************

.org   $000   rjmp   RESET                 ; Reset Handler                  
;.org   $001   reti   EXT_INT0              ; IRQ0 Handler                   Внешнее прерывание 0
;.org   $002   reti   PCINT0                ; PCINT0 Handler                 Прерывание по изменению состояния выводов 
;.org   $003   reti   TIM0_OVF              ; Timer0 Overflow Handler        Переполнение таймера/счетчика ТО 
;.org   $004   reti   EE_RDY                ; EEPROM Ready Handler           EEPROM готово 
;.org   $005   reti   ANA_COMP              ; Analog Comparator Handler      Аналоговый компаратор 
;.org   $006   reti   TIM0_COMPA            ; Timer0 CompareA Handler        Совпадение А таймера/счетчика ТО 
;.org   $007   reti   TIM0_COMPB            ; Timer0 CompareB Handler        Совпадение В таймера/счетчика ТО 
.org   $008   rjmp   WATCHDOG              ; Watchdog Interrupt Handler     Тайм-аут сторожевого таймера 
;.org   $009   reti   ADC                   ; ADC Conversion Handler         Преобразование АЦП завершено 


;****************************************************************************************

;*****************************************************************************************
 RESET: 

  CLI                      ; запретить все прерывания

         
     ldi r16, low(RAMEND)
     out SPL,r16           ; инициализация стека в тиньке 13

     Ldi r16, 0b11111111
     out DDRB, r16         ;все  биты на выход


                                                 
;***************************************************************************************
 
  WDR                      ;команда сброса сторожевого таймера 
 



  
     Ldi r16,  0b00011000         ;одной командой устанавливаем в 1 биты В3(WDE) и В4(WDCE)
     out WDTCR, r16               ;такой порядок записи для ватчага

     Ldi r16, 0b00000000          ;сбрасываем бит  В4(WDCE) и бит В3(WDE) , выставляем период тайм-аута ватчага
     out WDTCR, r16               ;бит В2(WDP2) сбрасываем в 0, биты В5(WDP3), В1(WDP1), В0(WDP0)  сбрасываем в 0 
                                  ;
                                  ;период тайм-аута выставлен в 16мс 


     Ldi r16, 0b01000000    ;
     out WDTCR, r16         ;бит В6(WDTIE) установим в 1 ( разрешим прерывание WATCHDOG






   SEI                    ; разрешить прерывания

;***************************************************************************************

 main:



 rjmp main     ; зацикливаем по кругалю МК





;*************************************************************************************

WATCHDOG:

       push r16                  ; сохраняем используемые регистры (этих пушей может быть много)
       push r17                  ; сохраняем используемые регистры (этих пушей может быть много)
       in r18, SREG              ; сохраням флаги регистра SREG в РОНе (r18)
       push r18                  ; и запихиваем их в стек


   in r16, PINB            ; читаем порт
   ldi r17,0b00000100      ; присваеваем 0b00000100
   eor r16, r17            ; исключаещее или, если бит 2 порта B =1, то результат =0, если бит =0, то результат =1 (инверсируем бит В2)
   out PORTB, r16          ; пишем результат в порт B . зажигаем или гасим лед на пине В2


       pop r18                   ; извлекаем из стека флаги регистра SREG в r18 (обратный порядок при извлечении из стека)
       out SREG, r18             ; отправляем их обратно в регистр флагов SREG
       pop r17                   ; восстанавливаем регистр r17
       pop r16                   ; восстанавливаем регистр r16

  reti                           ; возвращаемся из прерывания






