.include <tn2313def.inc>
;  ************************************************* 
;  **Definice konstant a prirazeni nazvu registrum** 
;  ************************************************* 

;.equ stack_base = $D0  ;pocatecni adresa zasobniku 


.def temp = r25    ;pomocny registr 
.def dataTX = r21   ;obsahuje znak pripraveny k vyslani na  UART 
.def reg = r22
.def akum = r23
.def pocet = r24;lze pouzit taky pro pocetDat
.def tepinf = r25
.def data1 = r26
.def data2 = r27
.def hamming = r28
.def hamming1 = r28
.def hamming2 = r29
.def hamming3 = r30
.def hamming4 = r31
.def pomocnak = r21
.def dataobec = r17
.def jedna = r16
.def tepinf1 = r20



.cseg


.org 0000
rjmp init

.org 0020
init:
ldi temp,low(ramend)
out SPL,temp
;sbi ucr,txen   ;pripojeni vystupu UART na pin PD1 
ldi temp,12 
out ubrr,temp     ;nastavena prenosova rychlost na 4800 Bd pri krystalu 4Mhz 
ldi temp,0xff
out DDRD,temp
;ldi temp,0xf0
;out DDRB,temp
ldi temp,(1<<TXEN)
out UCSRB,temp
ldi hamming1,0x03
ldi hamming2,0x0E
cbi PORTB,3
cbi PORTB,0
;---------------------------------------------------------------------------------------------- 
rjmp main

vyslani_UART:
 	in reg,SREG 
 	sbis UCSRA,udre
 	rjmp vyslani_UART
 	out udr,dataTX
 	out SREG,reg
	ret 

;----------------------------------------------------------------------------------------------  

; 
main:
	rcall teplomer
	rcall Kontrola
	rcall nastaveniVysilani
	rjmp main

teplomer: 

	rcall resetCidla
	ldi akum,0xCC
	rcall vysilani
	ldi akum,0xBE
	rcall vysilani
	
	rcall Cteni
	mov tepinf,akum
	rcall Cteni
	mov tepinf1,akum

	rcall resetCidla
	ldi akum,0xCC
	rcall vysilani
	ldi akum,0x4E
	rcall vysilani
	ldi akum,0x0
	rcall vysilani
	ldi akum,0x0
	rcall vysilani
	ldi akum,0x3F
	rcall vysilani
	rcall zpo100ms 

	rcall resetCidla
	ldi akum,0xCC
	rcall vysilani
	ldi akum,0x44
	rcall vysilani
	rcall zpo100ms
	rcall zpo100ms
	
	rcall zpo100ms
	rcall zpo100ms
	rcall zpo100ms
	rcall zpo100ms
	rcall zpo100ms
	rcall zpo100ms


	rcall resetCidla
	ldi akum,0xCC
	rcall vysilani
	ldi akum,0xBE
	rcall vysilani
	rcall Cteni
	mov data1,akum
	rcall Cteni
	mov data2,akum
	rcall zpo100ms

	ret

;---------------------------------------------------------------------------------

nastaveniVysilani:
	ldi dataTX,0xff
	rcall vyslani_UART
	ldi dataTX,0xff
	rcall vyslani_UART
	ldi dataTX,0xff
	rcall vyslani_UART
	ldi dataTX,0xff
	rcall vyslani_UART
	ldi dataTX,0xff
	rcall vyslani_UART
	ldi dataTX,0xff
	rcall vyslani_UART

	ldi dataTX,3
	rcall vyslani_UART
	ldi dataTX,0xC2
	rcall vyslani_UART
	ldi dataTX,0x0E 
	rcall vyslani_UART 
	ldi dataTX,0xDC 
	rcall vyslani_UART 
	mov dataTX,hamming3 
	rcall vyslani_UART   
	mov dataTX,data1;data1
	rcall vyslani_UART 
	mov dataTX,hamming4 
	rcall vyslani_UART 
	mov dataTX,data2;data2
	rcall vyslani_UART 
	ret

;---------------------------------------------------------------------------------------------- 
zpo480us:
zp1:ldi r17,15
zp2:ldi r18,10
zp3:dec r18
	brne zp3
	dec r17
	brne zp2
	ret

zpo410us:
	ldi r17,13
zp5:ldi r18,10
zp4:dec r18
	brne zp4
	dec r17
	brne zp5
	ret


zpo100ms:
	ldi r17,167
zpp1:
	ldi r18,200
zpp2:
	dec r18
	brne zpp2
	dec r17
	brne zpp1
	ret

zpo180ms:
	ldi r17,20
zk2:dec r17
	brne zk2
	ldi r17,255
zpp3:
	ldi r18,255
zpp4:
	dec r18
	brne zpp4
	dec r17
	
	brne zpp3
	ret

;-------------------------------------------------------------------------
resetCidla:
;cidlo ds18b20 na portu B,bit 3
	in temp,SREG
	sbi DDRB,3
	rcall zpo480us
	cbi DDRB,3
	ldi r17,23;cekani 100us;bylo cekani 70u
zp6:dec r17
	brne zp6
	sec
skok1:
	sbic PINB,3;pri cteni je pinb
	rjmp skok1
	clc
	rcall zpo410us
sk1:out SREG,temp
	ret
;------------------------------------------------------------------
vysilani:
;	ldi temp,0xff
;	out DDRB,temp
	ldi pocet,8
vys1:
	clc;nebylo
	ror akum
	brcc vyst0
	sbi DDRB,3;sbi nuluji
	nop
	nop
	nop
	nop
	nop
	cbi DDRB,3

	ldi r17,20;bylo 20
zp7:dec r17
	brne zp7
	rjmp vyst2

vyst0:
	sbi DDRB,3
	ldi r17,20;bylo 20
zp8:dec r17		;ceka se 60us
	brne zp8
	cbi DDRB,3
	
vyst2:
	dec pocet
	brne vys1
	ret
;---------------------------------------------------------------
Cteni:
	ldi pocet,8
ct1:;ldi temp,0xff
	;out DDRB,temp
	sbi DDRB,3
	nop
	nop
	nop
	nop
	nop
	cbi DDRB,3
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop

	nop
	nop
	nop
	nop
	nop
	nop
	
	clc
	sbic PINB,3
	sec;kdyztak prohodit
	ror akum
	

	ldi r17,15;bylo 33
zp9:dec r17
	brne zp9
	cpi pocet,0
	dec pocet
	brne ct1
	ret
;-------------------------------------------------------------- 
Kontrola:
	ldi pocet,2
pdb1:
	cpi pocet,2
	brne pdb2
	mov dataobec,data1
	rjmp pdb3

pdb2:
	cpi pocet,1
	brne abskc
	mov dataobec,data2
pdb3:
	mov akum,dataobec
	sbrc akum,0;odpovídá jnc u 51
	inc jedna
	sbrc akum,1
	inc jedna
	sbrc akum,2
	inc jedna
	sbrc akum,4
	inc jedna
	sbrc akum,6
	inc jedna
	mov akum,jedna
	
	cpi akum,1
	brne ko1
	ldi hamming,0
ko1:cpi akum,2
	brne ko2
	ldi hamming,1
ko2:cpi akum,3
	brne ko3
	ldi hamming,0
ko3:cpi akum,4
	brne ko4
	ldi hamming,1
ko4:cpi akum,5
	brne next
	ldi hamming,0
	rjmp next
abskc:
	rjmp absk
next:
	mov akum,hamming
	clc;nebylo clc
	ror akum;sem je vse v poradku
	ror akum
	mov hamming,akum
	ldi jedna,0
	mov akum,dataobec

	sbrc akum,0;odpovídá jnc u 51
	inc jedna
	sbrc akum,3
	inc jedna
	sbrc akum,4
	inc jedna
	sbrc akum,7
	inc jedna

	mov akum,jedna
	cpi akum,1
	brne ko5
	ldi pomocnak,1
ko5:cpi akum,2
	brne ko6
	ldi pomocnak,0
ko6:cpi akum,3
	brne ko7
	ldi pomocnak,1
ko7:cpi akum,4
	brne next2
	ldi pomocnak,0
next2:
	mov akum,hamming
	clc
	ror akum
	mov hamming,akum
	mov akum,pomocnak
	sbrc akum,0;kdyz bude 0,skace;chyba;bylo akum;bylo srbc
	rjmp nas1
	rjmp nas2
nas1:
	sbr hamming,128
	rjmp hm1
nas2:
	cbr hamming,128;bylo 7
hm1:ldi jedna,0
	ldi pomocnak,0
next3:
	ldi jedna,0
	mov akum,dataobec

	sbrc akum,1;odpovídá jnc u 51
	inc jedna
	sbrc akum,5
	inc jedna
	sbrc akum,6
	inc jedna
	sbrc akum,7
	inc jedna

	mov akum,jedna
	cpi akum,1
	brne ko8
	ldi pomocnak,0
ko8:cpi akum,2
	brne ko9
	ldi pomocnak,1
ko9:cpi akum,3
	brne ko10
	ldi pomocnak,0
ko10:cpi akum,4
	brne next4
	ldi pomocnak,1
next4:
	mov akum,hamming
	clc
	ror akum
	mov hamming,akum
	mov akum,pomocnak
	sbrc akum,0;kdyz bude 0,skace
	rjmp nas3
	rjmp nas4
nas3:
	sbr hamming,128
	rjmp hm2;
nas4:
	cbr hamming,128;bylo 7
hm2:ldi jedna,0
	ldi pomocnak,0
	rjmp next5
abskc3:
	rjmp pdb1
;cvrty Hammiguv bit
next5:
	ldi jedna,0
	mov akum,dataobec

	sbrc akum,2;odpovídá jnc u 51
	inc jedna
	sbrc akum,3
	inc jedna
	sbrc akum,4
	inc jedna
	sbrc akum,5
	inc jedna
	sbrc akum,6
	inc jedna
	sbrc akum,7
	inc jedna

	mov akum,jedna
	cpi akum,1
	brne ko11
	ldi pomocnak,1
ko11:
	cpi akum,2
	brne ko12
	ldi pomocnak,0
ko12:
	cpi akum,3
	brne ko13
	ldi pomocnak,1
ko13:
	cpi akum,4
	brne ko14
	ldi pomocnak,0
ko14:
	cpi akum,5
	brne ko15
	ldi pomocnak,1
ko15:
	cpi akum,6
	brne next6
	ldi pomocnak,0
next6:
	mov akum,hamming
	clc
	ror akum
	mov hamming,akum
	mov akum,pomocnak
	sbrc akum,0;kdyz bude 0,skace
	rjmp nas5
	rjmp nas6
nas5:
	sbr hamming,128
	rjmp hm3;
nas6:
	cbr hamming,128
hm3:ldi jedna,0
	ldi pomocnak,0

	mov akum,hamming
	swap akum
	mov hamming,akum
	cpi pocet,2
	brne pdb4
	mov hamming3,hamming
	clc
	rjmp dskok
pdb4:
	cpi pocet,1
	brne dskok
	mov hamming4,hamming
dskok:
	dec pocet
	brne abskc3
	ldi hamming,0
	ldi pomocnak,0
	ldi dataobec,0
	ldi akum,0
	

absk:ret
