; Nejjednodussi otackomer s ATtiny24A / 24 / 24V
; int. RC 1MHz, BOD 2,7V
; VI. 2013
; vytvoril: DANYK
; http://danyk.cz/avr_ot.html

.NOLIST
.INCLUDE "tn24def.inc"
.LIST


.DEF REG=R16		; docasny registr
 
.DEF UDAJ1=R17		; spodnich 8bitu 16-bitoveho vysledku
.DEF UDAJ2=R18		; hornich 8bitu 16-bitoveho vysledku

.DEF DELREG=R19		; registr deleni frekvence

.DEF MULTREG=R20	; registr si pamatuje stav multiplexu 

.DEF CIF1=R21		; nejnizsi cifra
.DEF CIF2=R22		; nejvyssi cifra


.EQU SMER=DDRA		;PORT - katody segmentu, vstup
.EQU PORT=PORTA
.EQU SMER2=DDRB 	;PORT - anody, tecka, prepinac
.EQU PORT2=PORTB
.EQU PIN2=PINB


.CSEG
.ORG 0
RJMP START

; sem skoci program pri preruseni
.ORG OC0Aaddr
RJMP CITAC0


START:
;nastavi port
LDI REG,0b11101111
OUT SMER,REG
LDI REG,0b11101111
OUT PORT,REG

;nastaví port
LDI REG,0b011
OUT SMER2,REG
LDI REG,0b100
OUT PORT2,REG


LDI REG,LOW(RAMEND)
OUT SPL,REG

; vypne analogovy komparator (setri energii).
LDI REG,0b10000000
OUT ACSR,REG

; sleep mod IDLE
LDI REG,0b00100000
OUT MCUCR,REG

; vypne ADC a USI (setri energii).
LDI REG,0b00000011
OUT PRR,REG


; NASTAVENI CITACU/CASOVACU
LDI	REG,0b00000010 	; nastavi citac0 na nulovani pri dosazeni porovnavane...
OUT	TCCR0A,REG    	; ...hodnoty (tzv. CTC), OC0 nevyuzit, deleni 256
LDI	REG,0b00000011 	; 
OUT	TCCR0B,REG 
LDI	REG,77      	; porovnavana hodnota, vznikne 625Hz (multiplex 156,25Hz)
OUT	OCR0A,REG     	; 

LDI	REG,0b00000010	; povoli preruseni
OUT	TIMSK0,REG    	; (bit 1 povoli preruseni CTC)

LDI	REG,0b00000000	; nastavi citac1 na normalni mod
OUT	TCCR1A,REG    	; 
LDI	REG,0b00000111 	; externi taktovani
OUT	TCCR1B,REG


; vynuluje/prednastavi registry
LDI DELREG,30
LDI MULTREG,1
CLR CIF1
CLR CIF2

SEI ;povoli globalni preruseni


;hlavni smycka
SMYCKA:
SLEEP
RJMP SMYCKA


MULT:
LDI REG,0b100
OUT PORT2,REG

CPI MULTREG,2
BREQ MULT2

MULT1:
MOV REG,CIF1
RCALL ZOBRAZ
OUT PORT,REG
SBI PORT2,0
RET

MULT2:
MOV REG,CIF2
RCALL ZOBRAZ
OUT PORT,REG
SBI PORT2,1
RET


ZOBRAZ:
CPI REG,10
BRSH ZOBRAZ_MIMO
LDI ZH,HIGH(2*TABULKA)
LDI ZL,LOW(2*TABULKA)

ADD ZL,REG
CLR REG
ADC ZH,REG
LPM REG,Z
RET

ZOBRAZ_MIMO:
LDI REG,0b01101111
RET


OBNOVA:
IN UDAJ1,TCNT1L
IN UDAJ2,TCNT1H
CLR REG
OUT	TCNT1H,REG
OUT	TCNT1L,REG

CLR CIF1
CLR CIF2

CPI UDAJ1,100		;kontrola, zda neni mimo rozsah
LDI REG,0
CPC UDAJ2,REG
BRLO DO99
SER CIF2
SER CIF1
RJMP KONEC_OBNOVY
DO99:


ZNOVU:
CPI UDAJ1,10		;8-bitova podminka mensi nez 10
BRLO MENSI
SUBI UDAJ1,10		;8-bitove odcitání cisla 10 od vysledku
INC CIF2
RJMP ZNOVU
MENSI:

MOV CIF1,UDAJ1


KONEC_OBNOVY:
RET


; preruseni ridici multiplex a zdroj casovani
CITAC0:
RCALL MULT
DEC MULTREG
BRNE HOP
LDI MULTREG,2

DEC DELREG
BRNE HOP
RCALL OBNOVA
LDI DELREG,60
IN REG,PIN2
SBRS REG,2
LDI DELREG,30
HOP:

RETI


TABULKA:
.DB 0b10000000,0b11101001	;0, 1
.DB 0b01000100,0b01100000	;2, 3
.DB 0b00101001,0b00100010	;4, 5
.DB 0b00000010,0b11101000	;6, 7
.DB 0b00000000,0b00100000	;8, 9
