; Dvoukanalovy digitronovy teplomer s ATtiny24A / 24 / 24V ; int. RC 1MHz (8MHz + CKDIV8), BOD 2,7V ; 15. X. 2015 ; vytvoril: DANYK ; http://danyk.cz/avr_2digtep.html .NOLIST .INCLUDE "tn24def.inc" .LIST .DEF SOUCETL=R14 .DEF SOUCETH=R15 .DEF REG=R16 .DEF REG2=R17 .DEF DELREG=R18 .DEF SONDAREG=R19 .DEF PREVODL=R20 .DEF PREVODH=R21 .DEF PRUMREG=R22 .DEF VENKU_MINUS=R23 .DEF VENKU2=R24 .DEF VENKU3=R25 .DEF UVNITR2=R26 .DEF UVNITR3=R27 .DEF CIF2=R28 .DEF CIF3=R29 .DEF MOD=R30 .DEF DOBA_ZOBR=R31 .EQU SMER=DDRA ;PORT A .EQU PORT=PORTA .EQU PINY=PINA .EQU SMER2=DDRB ;PORT B .EQU PORT2=PORTB .EQU PINY2=PINB .EQU S1MINL=0x0060 .EQU S1MINH=0x0061 .EQU S1MAXL=0x0062 .EQU S1MAXH=0x0063 .EQU S2MINL=0x0064 .EQU S2MINH=0x0065 .EQU S2MAXL=0x0066 .EQU S2MAXH=0x0067 .EQU STAV_TLAC=0x0068 ;předchozí stav tlačítka .EQU PRODL_TLAC=0x0069 ;odpočítává prodlevu tlač. do další reakce .EQU DOBA_TLAC=0x006A ;doba stisku tlacitka .CSEG .ORG 0 RJMP START ; PRERUSENI: ;----------- .ORG EXT_INT0addr ;externi preruseni INT0 (synchronizace duplexu) RJMP DUPLEX .ORG OC0Aaddr ;preruseni casovani OC0A CTC RJMP CASOVANI .ORG ADCCaddr ;preruseni pri dokonceni AD konverze RJMP HOTOVO START: ;nastavi port LDI REG,0b11110000 OUT SMER,REG LDI REG,0b00001000 OUT PORT,REG ;nastaví port LDI REG,0b011 OUT SMER2,REG LDI REG,0b100 OUT PORT2,REG LDI REG,LOW(RAMEND) OUT SPL,REG ; Povoli INT0 LDI REG,0b01000000 OUT GIMSK,REG ; sleep mod IDLE, kazda logicka zmena vyvola INT0 LDI REG,0b00100001 OUT MCUCR,REG ; vypne analogovy komparator (setri energii). LDI REG,0b10000000 OUT ACSR,REG ; vypne citac1 a USI (setri energii). LDI REG,0b00001010 OUT PRR,REG ; vypne digitalni vstupy LDI REG,0b00000111 OUT DIDR0,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,0b00000100 ; OUT TCCR0B,REG LDI REG,77 ; porovnavana hodnota OUT OCR0A,REG ; LDI REG,0b00000010 ; povoli preruseni OUT TIMSK0,REG ; (bit 1 povoli preruseni CTC OCIE0A) ; vynuluje/prednastavi registry LDI SONDAREG,20 ;prednastavi registr volby sondy a prodlevy min/max LDI PRUMREG,1 ;prednastavi registr pocitajici vzorky LDI DELREG,1 ;prednastavi registr CLR CIF2 CLR CIF3 CLR MOD CLR DOBA_ZOBR CLR VENKU_MINUS CLR VENKU2 CLR VENKU3 CLR UVNITR2 CLR UVNITR3 CLR SOUCETL CLR SOUCETH CLR REG STS S1MAXL,REG STS S1MAXH,REG STS S2MAXL,REG STS S2MAXH,REG SER REG STS S1MINL,REG STS S2MINL,REG STS S1MINH,REG STS S2MINH,REG CLR REG STS STAV_TLAC,REG STS PRODL_TLAC,REG STS DOBA_TLAC,REG ;hlavni smycka SMYCKA: CLI LDI REG,0b00001011 ; zakaze ADC OUT ADCSRA,REG ; SEI SLEEP RJMP SMYCKA ZMERIT: ;vstupem do sleep modu ADC noise reduction se aktivuje ADC konverze LDI REG,0b10001011 ; povoleno ADC, jednoraz.,prerus. povoleno, OUT ADCSRA,REG ; deleni 8 (z 1MHz na 125kHz.) SEI SLEEP RET ; preruseni - zdroj casovani CASOVANI: CPI MOD,0 BRNE KONEC_MOD DEC DELREG BRNE HOP LDI DELREG,220 MOVW CIF2,VENKU2 LDI REG,1 ADD REG,VENKU_MINUS ORI REG,0b100 OUT PORT2,REG HOP: CPI DELREG,120 BRNE NE_UVN MOVW CIF2,UVNITR2 LDI REG,0b100 OUT PORT2,REG NE_UVN: CPI DELREG,21 BRSH NE_ROTACE MOV REG,DELREG DEC REG LSR REG LDI CIF2,9 SUB CIF2,REG MOV CIF3,CIF2 LDI REG,0b100 OUT PORT2,REG LDI REG,2 SUB REG,VENKU_MINUS ORI REG,0b100 OUT PORT2,REG NE_ROTACE: KONEC_MOD: CPI DOBA_ZOBR,0 BREQ DOBA_KONEC DEC DOBA_ZOBR BRNE DOBA_KONEC CLR MOD LDI DELREG,21 DOBA_KONEC: RCALL TLACITKO RCALL ZMERIT RETI HOTOVO: ;preruseni pri dokonceni AD konverze IN REG,ADCL IN REG2,ADCH ADD SOUCETL,REG ADC SOUCETH,REG2 DEC PRUMREG BRNE HOTOHOP LDI PRUMREG,39 RCALL OBNOV DEC SONDAREG BRNE SONDAHOP LDI SONDAREG,2 SONDAHOP: MOV REG,SONDAREG ANDI REG,0b00000001 INC REG ORI REG,0b01000000 ;zvoli ext. referenci OUT ADMUX,REG HOTOHOP: RETI OBNOV: ;LDI REG,80 ;zlepsi zaokrouhlovani. ;LDI REG2,0 ;ADD SOUCETL,REG ;ADC SOUCETH,REG2 LSR SOUCETH ;16bitove deleni 16 ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL MOVW PREVODL,SOUCETL SBRS SONDAREG,0 ;vetveni, ktery teplomer se prave obnovuje RJMP OBNOV2 ;OBNOV1: ;obnoveni teplomeru 1 (venku) CPI SONDAREG,3 BRSH MINMAX1_PRODLEVA LDS REG2,S1MINH LDS REG,S1MINL CP SOUCETL,REG CPC SOUCETH,REG2 BRSH VENKU_MIN_NE STS S1MINH,SOUCETH STS S1MINL,SOUCETL VENKU_MIN_NE: LDS REG2,S1MAXH LDS REG,S1MAXL CP REG,SOUCETL CPC REG2,SOUCETH BRSH VENKU_MAX_NE STS S1MAXH,SOUCETH STS S1MAXL,SOUCETL VENKU_MAX_NE: MINMAX1_PRODLEVA: CLR SOUCETH CLR SOUCETL ZOBR_MINMAX1: CLR VENKU_MINUS ;zjisti, zda neni nad rozsahem CPI PREVODL,LOW(1494) LDI REG,HIGH(1494) CPC PREVODH,REG BRSH VENKU_NAD999 ;zjisti, jestli je teplota zaporna (u MCP9700 cislo pod 500) CPI PREVODL,LOW(500) LDI REG,HIGH(500) CPC PREVODH,REG BRLO ZAPORNA ;KLADNA: ;kladna vcetne nuly (u MCP9700 500 a vic) SUBI PREVODL,LOW(495) ;odecte od hodnoty konstantu SBCI PREVODH,HIGH(495) RJMP KLADNA_KONEC ZAPORNA: LDI REG,LOW(505) ;odecte hodnotu od konstanty LDI REG2,HIGH(505) SUB REG,PREVODL SBC REG2,PREVODH MOVW PREVODL,REG LDI VENKU_MINUS,1 KLADNA_KONEC: ;CLR VENKU1 CLR VENKU2 CLR VENKU3 ZNOVU100: CPI PREVODL,100 ;16-bitová podmínka vetsi nebo rovno 100 BRSH MINUS100 CPI PREVODH,1 BRSH MINUS100 RJMP POD100 MINUS100: SUBI PREVODL,100 ;16-bitový odčítání čísla 100 od výsledku SBCI PREVODH,0 INC VENKU3 RJMP ZNOVU100 POD100: ZNOVU10: CPI PREVODL,10 ;8-bitová podmínka vetsi nebo rovno 10 BRLO POD10 SUBI PREVODL,10 ;8-bitový odčítání čísla 10 od výsledku INC VENKU2 RJMP ZNOVU10 POD10: ;MOV VENKU1,PREVODL RJMP VENKU_DO999 VENKU_NAD999: ;co když je výsledek nad 999 LDI VENKU3,9 LDI VENKU2,9 ;LDI VENKU1,9 VENKU_DO999: CLR PREVODL CLR PREVODH RET OBNOV2: ;obnoveni teplomeru 2 CPI SONDAREG,3 BRSH MINMAX2_PRODLEVA LDS REG2,S2MINH LDS REG,S2MINL CP SOUCETL,REG CPC SOUCETH,REG2 BRSH UVNITR_MIN_NE STS S2MINH,SOUCETH STS S2MINL,SOUCETL UVNITR_MIN_NE: LDS REG2,S2MAXH LDS REG,S2MAXL CP REG,SOUCETL CPC REG2,SOUCETH BRSH UVNITR_MAX_NE STS S2MAXH,SOUCETH STS S2MAXL,SOUCETL UVNITR_MAX_NE: MINMAX2_PRODLEVA: CLR SOUCETH CLR SOUCETL ZOBR_MINMAX2: CPI PREVODL,LOW(1494) LDI REG,HIGH(1494) CPC PREVODH,REG BRSH UVNITR_NAD999 ;zjisti, jestli je teplota zaporna (u MCP9700 cislo pod 500) CPI PREVODL,LOW(500) LDI REG,HIGH(500) CPC PREVODH,REG BRSH UVNITR_NEZAPORNA LDI PREVODL,LOW(495) LDI PREVODH,HIGH(495) UVNITR_NEZAPORNA: SUBI PREVODL,LOW(495) ;odecte od hodnoty konstantu SBCI PREVODH,HIGH(495) ;CLR UVNITR1 CLR UVNITR2 CLR UVNITR3 ZNOVU100_2: CPI PREVODL,100 ;16-bitová podmínka vetsi nebo rovno 100 BRSH MINUS100_2 CPI PREVODH,1 BRSH MINUS100_2 RJMP POD100_2 MINUS100_2: SUBI PREVODL,100 ;16-bitový odčítání čísla 100 od výsledku SBCI PREVODH,0 INC UVNITR3 RJMP ZNOVU100_2 POD100_2: ZNOVU10_2: CPI PREVODL,10 ;8-bitová podmínka vetsi nebo rovno 10 BRLO POD10_2 SUBI PREVODL,10 ;8-bitový odčítání čísla 10 od výsledku INC UVNITR2 RJMP ZNOVU10_2 POD10_2: ;MOV UVNITR1,PREVODL RJMP UVNITR_DO999 UVNITR_NAD999: ;co když je výsledek nad 999 ;LDI UVNITR1,9 LDI UVNITR2,9 LDI UVNITR3,9 UVNITR_DO999: CLR PREVODL CLR PREVODH RET DUPLEX: IN REG2,PINY2 MOV REG,CIF2 SBRS REG2,2 MOV REG,CIF3 SWAP REG ANDI REG,0b11110000 ORI REG,0b00001000 OUT PORT,REG RETI TLACITKO: ;Zjištění stavu tlačítka LDS REG,PRODL_TLAC ;počítadlo prodlevy do další reakce CPI REG,0 BREQ UZJE0 DEC REG STS PRODL_TLAC,REG UZJE0: LDS REG2,STAV_TLAC ;Do REG2 načte předchozí stav tlačítek IN REG,PINY ;Zjistí stav tlačítek ANDI REG,0b00001000 STS STAV_TLAC,REG ;Uloží ho pro příští test CP REG2,REG ;pokud předchozí stav = současný, tlac. už nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimální prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT SBRS REG,3 RCALL TLAC1 NEREAGOVAT: LDI REG2,3 ;určuje prodlevu do další reakce (x cca 20ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,3 STS PRODL_TLAC,REG2 ;tady zacina vyhodnoceni dlouheho stisku CPI REG,0b00001000 BREQ NIC_NEDRZI LDS REG2,DOBA_TLAC INC REG2 STS DOBA_TLAC,REG2 NIC_NEDRZI: LDS REG2,PRODL_TLAC CPI REG2,0 BRNE PRODL_NE0 ;LDI REG2,0 STS DOBA_TLAC,REG2 PRODL_NE0: LDS REG2,DOBA_TLAC CPI REG2,100 BRNE NE100 LDI REG2,1 ;(100-x) = po jaké době se opakuje STS DOBA_TLAC,REG2 SBRS REG,3 RJMP NA_TLAC1_D NE100: RET NA_TLAC1_D: RCALL TLAC1_D RET TLAC1: LDI DOBA_ZOBR,200 INC MOD CPI MOD,5 BRLO MOD_HOP LDI MOD,1 MOD_HOP: ;CPI MOD,1 ;BREQ MOD1 CPI MOD,2 BREQ MOD2 CPI MOD,3 BREQ MOD3 CPI MOD,4 BREQ MOD4 MOD1: LDS PREVODH,S1MINH LDS PREVODL,S1MINL RCALL ZOBR_MINMAX1 MOVW CIF2,VENKU2 LDI REG,1 ADD REG,VENKU_MINUS ORI REG,0b100 OUT PORT2,REG RJMP KONEC_MOD MOD2: LDS PREVODH,S1MAXH LDS PREVODL,S1MAXL RCALL ZOBR_MINMAX1 MOVW CIF2,VENKU2 LDI REG,1 ADD REG,VENKU_MINUS ORI REG,0b100 OUT PORT2,REG RJMP KONEC_MOD MOD3: LDS PREVODH,S2MINH LDS PREVODL,S2MINL RCALL ZOBR_MINMAX2 MOVW CIF2,UVNITR2 LDI REG,0b100 OUT PORT2,REG RJMP KONEC_MOD MOD4: LDS PREVODH,S2MAXH LDS PREVODL,S2MAXL RCALL ZOBR_MINMAX2 MOVW CIF2,UVNITR2 LDI REG,0b100 OUT PORT2,REG RJMP KONEC_MOD RET TLAC1_D: CLR DOBA_ZOBR CLR MOD CLR CIF2 CLR CIF3 LDI DELREG,40 LDI REG,0b100 OUT PORT2,REG CLR REG STS S1MAXL,REG STS S1MAXH,REG STS S2MAXL,REG STS S2MAXH,REG SER REG STS S1MINL,REG STS S2MINL,REG STS S1MINH,REG STS S2MINH,REG RET