;*** Zacatek souboru *********************************************************
;
; Soubor: KALIBR02.ASM
;  Nazev: Kalibrace zavislosti kmitoctu na teplote ci napeti
;  Verse: 0.2
;    CPU: ATMEL ATTINY15L
;  Autor: OK2PPK, Brno, 2003/11
;
; Popis:
;
;   Generuje pravouhly obdelnikovy signal se stridou 1:1 s delkou
;   intervalu L=5C a H=5C na pinu PB0. Vystupni kmitocet je proto fclk/10.
;   Tak je mozne zmerit zavislost oscilatoru CPU na zmene napeti a teploty.
;
; Popis zmen:
;
;   v0.2 (18.11.2003)
;     nastavuje OSCCAL na hodnotu odectenou na portu
;
;   v0.1 (18.11.2003)
;     vychozi verze, nastavuje OSCCAL na kalibracni hodnotu
;
; Souvisejici soubory:
;
;   tn15def.inc ... definice jednotlivych registru a bitu v CPU
;
; Poznamky:
;
;   XTAL = vnitrni casovac cca 1.6MHz, tj. 1C = 0.625us
;
; Specialni nastaveni pri zapisu programu a dat do CPU:
;
;   Kalibracni bajt: precist ho a pak zapsat do posledniho bajtu
;                    flash-memory (adresa $03FF)
;
;   Fuse bity: BODLEVEL = 0 (default)
;              BODEN = 1 (default)
;              SPIEN = 0 (default)
;              RSTDISBL = 0 (naprogramovat)
;              CKSEL1 = 0 (default)
;              CKSEL0 = 0 (default)
;
; Vyuziti moznosti integrovanych I/O zarizeni:
;
;   SPI    = moznost programovani v systemu nepouzita
;   BOD    = brownout detekce vypnuta
;   POD    = prepnuto na interni RESET
;   WATCHD = watchdog nepouzit
;   TIM0   = nepouzito
;   TIM1   = nepouzito
;   PWM    = nepouzito
;   ACOMP  = nepouzito
;   ADC    = nepouzito
;   EEPROM = nepouzito
;   PORT   = pouzit 1 bit pro vystup signalu
;
; Preruseni:
;
;   EXTINT0   = nepouzito
;   PINCHANGE = nepouzito
;   TIM0OVF   = nepouzito
;   TIM1OVF   = nepouzito
;   TIM1CMP   = nepouzito
;   EERDY     = nepouzito
;   ANACMP    = nepouzito
;   ADC       = nepouzito
;
; Prirazeni vyvodu:
;
;   PB0 = SGO vystup signalu
;   PB1 = vstup D3
;   PB2 = vstup D4
;   PB3 = vstup D5
;   PB4 = vstup D6
;   PB5 = vstup D7 (nutny externi pull-up odpor)
;
; Spolupracujici obvody:
;
;   zadne

;*** Vlozeni souboru s popisem CPU *******************************************

.include "tn15def.inc"

;--- Doplneni chybejicich udaju v TN15DEF.INC --------------------------------

.equ	E2END	=$3F                      ;konec pameti EEPROM
.equ	FLASHEND=$3FF                     ;konec pameti programu

;*** Definice ****************************************************************

;--- Konstanty ---------------------------------------------------------------

.equ   CalByte  = FLASHEND                ;umisteni kalibracni hodnoty

;--- Ostatni -----------------------------------------------------------------

.equ    SGO     = PB0                     ;vystup signalu

;*** MAIN - hlavni cast programu *********************************************

;--- segment pameti programu -------------------------------------------------

                .cseg

;--- startovaci vektory po resetu a preruseni --------------------------------

; (u ATTINY15L adresy $000 az $008)

.org 0
		rjmp	Start             ;reset
.org INT0addr
		reti                      ;vnejsi preruseni
.org PCINTaddr
		reti                      ;zmena na pinu
.org T1COMPaddr
		reti                      ;casovac 1 - porovnani
.org OVF1addr
		reti                      ;casovac 1 - preteceni
.org OVF0addr
		reti                      ;casovac 0 - preteceni
.org EERDYaddr
		reti                      ;eeprom  - hotovo
.org ACIaddr
		reti                      ;analogovy komparator
.org ADCCaddr
		reti                      ;AD prevodnik

;--- zacatek programu po resetu ----------------------------------------------
   
Start:
                ; kalibrace oscilatoru (kalibracni bajt ulozen pri programovani
                ; CPU do posledniho bajtu programove pameti)
                ; ldi     ZL,low(CalByte)
                ; ldi     ZH,high(CalByte)
                ; lpm
                
                ; kalibraci nacist z portu (hornich 5 bitu)
                
                ; inicializovat porty
                ldi     r16, 0b00011110   ;bity 4-1 zapnout pull-upy (PUD=0 po resetu)
                out     PORTB, r16
                ldi     r16, 0b00000001   ;bit 0 jako vystupni
                out     DDRB, r16
                
                in      r16, PINB         ;nacist cely port
                andi    r16, 0b00111110   ;vymaskovat bity 5-1
                lsl     r16               ;posunout o 2 bity vlevo
                lsl     r16
                out     OSCCAL,r16

                ; generovat signal
Smycka:
                cbi     PORTB, SGO        ;signal = 0, 2C
                nop                       ;1C
                nop                       ;1C
                nop                       ;1C
                sbi     PORTB, SGO        ;signal = 1, 2C
                nop                       ;1C
                rjmp    Smycka            ;2C

;*** Konec souboru ***********************************************************
.EXIT
