
#define SDIDebugUnit
//------------------------  ПОДПРОГРАММА  READ и  WRITE (Отправляет Cnt младших бит из Cmd) ---------------------------------
/*
    Cmd: 0 - продолжить
	     1 - команда записи данных в RAM
		 2 - чтение данных
		 4 - сброс

    Время на запись:
	     Ноль  - 100 т.и.
		 Один  - 69 т.и.
		 Сигнал- 143 т.и.

		 на чтение:

		 Ноль  - 100 т.и.
		 Один  - 69 т.и.
		 Сигнал- 123 т.и.


*/ 

/*
    Команды:
	    0 - далее 
		1 - сброс
		2 - чтение
		3 - запись
*/

// частота отлаживаемого микроконтроллера
#define FClk 14300//Частоты, на которых тестировалась отладка: 16934,14300,10000,7373,12000,18000,17734,20000,3686,
                  //На частотах 3579, 3600 4000 отладка не заработала

// следующие 3 строки надо привести в соответсвтие с используемым для отладки портом
#define PORT PORTB
#define DDR  DDRB
#define PIN  PINB

// номер бита выбранного порат, используемого для отладки
#define BitNum 0

   
// синонимы для регистров
#define  WaitCount r26 // счетчик в циклах ожидания
#define  BitCount  r27 // счетчик битов
#define  Res0      r28 // временно зранит результаты прошлых чтений
#define  Cmd       r29 // код обрабатываемой команды
#define  ByteCnt   r16 // счетчик отправленых байтов
#define  KS        r17 // контрольная сумма






//-------------------  Основная ф-ия отладки. Именно она и вызывается  ------------------------------------

Dbg:   
    cbi PORT, BitNum

	push WaitCount
    sbi DDR, BitNum // пошел запрос прерывания (7 т.и.)
	
	ldi WaitCount, (65 * FClk - 140000) / 60000 + 1
	in   WaitCount, SREG
    push WaitCount

	clr  WaitCount

__WaitSendItr: 
    dec WaitCount
	brne __WaitSendItr
    push BitCount

    cbi DDR, BitNum // снятие запроса прерывания (надо что б единица устоялась)

    
	push Res0
	push Cmd     
	push ByteCnt
    push KS
	push r30
	push r31

__Cikl: // перед начала цикла ждем завершения прошлого - единицы на линии.    
	clt // чтение
    cli 
	rcall __ReadWrite
    mov   Cmd, Res0

	rcall __ReadWrite
    mov r30, Res0

	rcall __ReadWrite
    mov r31, Res0

	rcall __ReadWrite
	
	cpi   Cmd, 1
	brcs  __CmdContinue // был код 0

	breq  __CmdWrite // был код 1	

__M1: ldi   ByteCnt, 8
    set // передача
    ldi  KS, 0xAA
__ReadCikl:
    ld   Res0, Z+ 
	add   KS, Res0
    rcall __ReadWrite
	dec   ByteCnt
	brne  __ReadCikl

	mov   Res0, KS
	rcall __ReadWrite

    rjmp __Cikl

__CmdWrite:
    st Z, Res0
    rjmp __Cikl

__CmdContinue:
    set // передача
	ldi Res0, 0x55
	rcall __ReadWrite

__Exit: wdr // сброс WatchDog
    pop r31
	pop r30 
    pop  KS
	pop  ByteCnt
	pop  Cmd
	pop  Res0
	pop  BitCount
	pop  WaitCount
	out  SREG, WaitCount
	pop  WaitCount
	ret
	

//-------------------------    ОСНОВНАЯ ПРОЦЕДУРА ЧТЕНИЯ - ЗАПИСИ  --------------------

__ReadWrite:
/*
    Чтение: флаг T = 0
	          
*/    
    ldi  BitCount, 8
    

//-------------------------    ЖДЕМ УСТАНОВКИ НУЛЯ  --------------------------------------------
__Wait0:
    sbic PIN, BitNum
	rjmp __Wait0

    

//-------------------------    ТЕПЕРЬ ЖДЕМ СНЯТИЕ НУЛЯ  -----------------------------------------------

    
__Wait1: 
    
    sbis PIN, BitNum
	rjmp __Wait1
	
    
	
//----------------------------------  ЕСЛИ ЭТО ЗАПИСЬ - СТАВИМ СИГНАЛ----------------
    lsr Res0  
	brtc __Reading

    brcs __BitCikl   // если единица, то и делать ни чего не надо

    sbi  DDR, BitNum   // иначе устанавливаем 0


//-------------------------------------  ЗАДЕРЖКА ОТ 65 ДО 96 т.и. ПРИ 20 мГц  ----------------------


     ldi WaitCount, (65 * FClk - 140000) / 60000 + 1
__SignalWait:
     dec WaitCount
     brne __SignalWait
	
	cbi  DDR, BitNum   // возвращаем 1 
    
	rjmp __BitCikl

//-------------------------    СНИМАЕМ РЕЗУЛЬТАТ    ------------------------------------------
__Reading:
    
	ldi WaitCount, (79 * FClk - 120000) / 60000 + 1//от 73 до 105

__EndReadingWait:
	dec WaitCount
    brne __EndReadingWait 

	sbic PIN, BitNum
    ori  Res0, 0x80

//-------------------------    НУ И ИДЕМ ЖДАТЬ СЛЕДУЮЩЕГО ЦИКЛА     ----------------------------
__BitCikl:
    dec BitCount
    brne __Wait0

//-------------------------   ВЫХОД - ПРЕДВАРИТЕЛЬНО ЖДЕМ ПОЯВЛЕНИЯ 1  -------------------------

    
__m0:
	sbis PIN, BitNum
	rjmp __m0
    
	ret 

#undef SDIDebugUnit
