; Vysilac bezdratoveho teplomeru ATtiny13A / 13 / 13V
; verze s kontrolou paritnim bitem a inverzi
; CPU = 1,2 MHz (9,6/8)
; DANYK
; http://danyk.cz/avr_btep.html

.NOLIST   
.INCLUDE "tn13def.inc"     
.LIST     

.DEF POS3=R13		;posuvne
.DEF POS1=R14		;posuvne
.DEF POS2=R15		;posuvne

.DEF REG=R16		;pracovni registr
.DEF REG2=R17		;pracovni registr 2
.DEF CYKLY=R18		;pocitadlo vysilacich cyklu
.DEF BITY=R19		;pocitadlo odeslanych bitu

.DEF SOUCETL=R20
.DEF SOUCETH=R21
.DEF PRUMREG=R22

.DEF SPUSTENI=R23

.DEF DATA1=R24		;data
.DEF DATA2=R25		;data
.DEF DATA3=R26		;data


.EQU SMER=DDRB 		;smer portu
.EQU PORT=PORTB		;port
.EQU PINY=PINB		;vstupy

                    
.CSEG				;kodovy segment   

.ORG 0
RJMP START

.ORG PCI0addr		;preruseni testovacim tlacitkem
RJMP TLACITKA

.ORG WDTaddr		;preruseni psem
RJMP CASOVANI

.ORG ADCCaddr		;preruseni pri dokonceni AD konverze
RJMP HOTOVO


START:

LDI REG,LOW(RAMEND)
OUT SPL,REG

;nastavi portB
LDI REG,0b00100
OUT SMER,REG
LDI REG,0b00011
OUT PORT,REG


CLR SOUCETL
CLR SOUCETH
LDI PRUMREG,38
CLR SPUSTENI


LDI	REG,0b00100000	; povoli preruseni PCINT 
OUT	GIMSK,REG    	;

LDI	REG,0b00000011	; ktere vstupy maji PCINT - testovaci tlac.
OUT	PCMSK,REG    	;

;NASTAVENI ADC
LDI	REG,0b01000010	; int. ref, zarovna vpravo, zvoli vstup ADC2
OUT	ADMUX,REG    	; 

;vypne analog. komparator - neni nikdy vyuzit (setri energii)
LDI	REG,0b10000000	
OUT	ACSR,REG  

;vypne digitalni vstup u ADC2
LDI	REG,0b00010000
OUT	DIDR0,REG  

WDR 
LDI REG, (1<<WDCE) | (1<<WDE)
OUT	WDTCR,REG
LDI REG, (1<<WDTIE)
OUT	WDTCR,REG

RCALL TL_TEST


SMYCKA:
CLI
LDI	REG,0b00000000	; zakaze ADC
OUT	ADCSRA,REG    	; 
LDI	REG,0b00110000	; povoli uspani (sleep) a nastavi mod Power Down
OUT	MCUCR,REG		;
SEI
SLEEP
RJMP SMYCKA


CASOVANI:
CLI
LDI	REG,0b10001011	; povoleno ADC, jednorazove, prerus. povoleno, 
OUT	ADCSRA,REG    	; deleni 8 (z 1,2 MHz na 150 kHz)
LDI	REG,0b00101000	; povoli uspani (sleep) a nastavi mod ADC nr
OUT	MCUCR,REG		;
SEI
SLEEP	
RETI


HOTOVO:			;preruseni pri dokonceni AD konverze
IN REG,ADCL
IN REG2,ADCH

ADD SOUCETL,REG
ADC SOUCETH,REG2

DEC PRUMREG
BRNE NEJSOU_VSECHNY

LDI PRUMREG,38

RCALL ZAKODUJ

CLR SOUCETH
CLR SOUCETL

NEJSOU_VSECHNY:
RETI


ZAKODUJ:		;prepocet a zakodovani vysledku
LSR SOUCETH		;16 bitove deleni 32ma
ROR SOUCETL
LSR SOUCETH
ROR SOUCETL
LSR SOUCETH
ROR SOUCETL
LSR SOUCETH
ROR SOUCETL
LSR SOUCETH
ROR SOUCETL

MOVW DATA1,SOUCETL


ZAKODUJ_TEST:
;vytvori inverzi a prida k datum
MOVW REG,DATA1
COM REG
COM REG2
LSL REG
ROL REG2
LSL REG
ROL REG2
LSL REG
ROL REG2
LSL REG
ROL REG2
LSL REG
ROL REG2
MOV DATA3,REG2
OR DATA2,REG

;zjisti kanal vysilace 0 nebo 1 a prida ho k datum
IN REG,PINY
SBRC REG,3
ORI DATA2,0b00001000

;spocita paritni bit (REG) z dolni pulky REG2 a z REG
MOVW REG,DATA1
EOR REG2,REG
SWAP REG
EOR REG2,REG
MOV REG,REG2
LSR REG2
LSR REG2
EOR REG,REG2
MOV REG2,REG
LSR REG2
EOR REG,REG2
ANDI REG,1
;prida paritni bit
SWAP REG
OR DATA2,REG


RCALL VYSILEJ

SBRS SPUSTENI,0
RCALL NACTI_PSA
RET


NACTI_PSA:
;nastaveni psa na preruseni
SER SPUSTENI
IN REG,PINY
SBRC REG,0
RJMP POMALU

WDR 
LDI REG, (1<<WDCE) | (1<<WDE)
OUT	WDTCR,REG
LDI REG, (1<<WDTIE)
OUT	WDTCR,REG

RET
POMALU:

WDR 
LDI REG, (1<<WDCE) | (1<<WDE)
OUT	WDTCR,REG
LDI REG, (1<<WDTIE) | (1<<WDP2) | (1<<WDP0)
OUT	WDTCR,REG

RET


;Tlacitka testovani a kalibrace
TLACITKA:
RCALL TL_TEST
RCALL NACTI_PSA
RETI

TL_TEST:
IN REG,PINY
SBRC REG,1
RJMP TEST_NE
ANDI DATA2,0b111
ADIW DATA1,1
LDI REG2,HIGH(1211)
CPI DATA1,LOW(1211)
CPC DATA2,REG2
BRSH INIC_TEST
LDI REG2,HIGH(90)
CPI DATA1,LOW(90)
CPC DATA2,REG2
BRLO INIC_TEST
TEST_POKRAC:
RCALL ZAKODUJ_TEST
RJMP TL_TEST
TEST_NE:
RET

INIC_TEST:
LDI DATA2,HIGH(90)
LDI DATA1,LOW(90)
RJMP TEST_POKRAC



;Vysila s pouzitim inverzniho kontrolniho kodu
;Kodovani delkou pulzu (dlouhy = 1)
;Zacina se MSB
VYSILEJ:
LDI CYKLY,3		;pocet vzorku v jednom vysilacim impulzu
VYSILEJ_DAL:

MOVW POS1,DATA1
MOV POS3,DATA3

LDI BITY,24
DALSI_BIT:
SBRS POS3,7
RCALL KRATKA_1
SBRC POS3,7
RCALL DLOUHA_1
RCALL KRATKA_0
LSL POS1
ROL POS2
ROL POS3
DEC BITY
BRNE DALSI_BIT

RCALL KRATKA_0
RCALL KRATKA_0
RCALL KRATKA_0

DEC CYKLY
BREQ DOVYSILEJ
RJMP VYSILEJ_DAL
DOVYSILEJ:

RET



;Krátká mezera
KRATKA_0:
LDI REG,100		;x 2,5us
CEKEJ_K0:
DEC REG
BRNE CEKEJ_K0
RET


;Krátký impulz
KRATKA_1:
SBI PORT,2

LDI REG,51		;x 2,5us
CEKEJ_K1:
DEC REG
BRNE CEKEJ_K1

CBI PORT,2
RET


;Dlouhý impulz
DLOUHA_1:
SBI PORT,2

LDI REG,205		;x 2,5us
CEKEJ_D1:
DEC REG
BRNE CEKEJ_D1

CBI PORT,2
RET
