; 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