; Dvojteplomer s min a max, ATmega8, 1MHz !!!!!!!!!!!!!!! ; DANYK (danyk.cz) ; http://danyk.cz/avr_tep2.html .NOLIST .INCLUDE "m8def.inc" .LIST .DEF REG=R16 .DEF REG2=R17 .DEF SONDAREG=R18 .DEF MULTREG=R19 .DEF SOUCETL=R20 .DEF SOUCETH=R21 .DEF PREVODL=R22 .DEF PREVODH=R23 .DEF PRUMREG=R24 .DEF CIF1=R25 .DEF CIF2=R26 .DEF CIF3=R27 .DEF CIF4=R28 .DEF CIF5=R29 .DEF CIF6=R30 .DEF CIF7=R31 .EQU SMER=DDRD .EQU PORT=PORTD .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU VSTUPY=PINC .EQU SMER3=DDRB .EQU PORT3=PORTB .EQU S1MINL=0x0060 .EQU S1MINH=0x0061 .EQU S1MAXL=0x0062 .EQU S1MAXH=0x0063 .EQU S2MINL=0x0064 .EQU S2MINH=0x0065 .EQU S2MAXL=0x0066 .EQU S2MAXH=0x0067 .CSEG .ORG 0 RJMP START ; vektory preruseni .ORG OC2addr ;preruseni citacem2 ridici multiplex, obnovovaci frekvenci RJMP MULTIPLEX .ORG ADCCaddr ;preruseni pri dokonceni AD konverze RJMP HOTOVO START: ;nastaví port D jako výstup LDI REG,0xFF OUT SMER,REG LDI REG,0xFF OUT PORT,REG ;nastaví port C LDI REG,0b00000000 OUT SMER2,REG LDI REG,0b00111100 OUT PORT2,REG ;nastaví port B jako výstup LDI REG,0xFF OUT SMER3,REG LDI REG,0xFF OUT PORT3,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG LDI MULTREG,1 ;prednastavi registr stavu multiplexu LDI SONDAREG,20 ;prednastavi registr volby sondy LDI PRUMREG,1 ;prednastavi registr pocitajici vzorky LDI REG,0 STS S1MAXL,REG STS S1MAXH,REG STS S2MAXL,REG STS S2MAXH,REG LDI REG,255 STS S1MINL,REG STS S2MINL,REG STS S1MINH,REG STS S2MINH,REG ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00001010 ; nulovani pri dosazeni porovnavane hodnoty... OUT TCCR2,REG ; ...(tzv. CTC), OC0 nevyuzit. preddeli 8 LDI REG,138 ; nastavi porovnavanou hodnotu (dělí se n+1) OUT OCR2,REG ; LDI REG,0b10000000 ; povoli preruseni CTC OCIE2 OUT TIMSK,REG ; ;NASTAVENI ADC a MCU LDI REG,0b00000000 ; ext. ref, zarovna vpravo, zvoli vstup ADC0 OUT ADMUX,REG ; LDI REG,0b10010000 ;povoli uspani (sleep) a nastavi mód ADC Noise Reduction OUT MCUCR,REG ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG SEI ;povoli globalni preruseni ;hlavní smyčka 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 HOTOVO: ;preruseni pri dokonceni AD konverze IN REG,ADCL IN REG2,ADCH ADD SOUCETL,REG ADC SOUCETH,REG2 DEC PRUMREG BRNE HOTOHOP LDI PRUMREG,64 RCALL OBNOV DEC SONDAREG BRNE SONDAHOP LDI SONDAREG,2 SONDAHOP: MOV REG,SONDAREG DEC REG ANDI REG,0b00000001 OUT ADMUX,REG HOTOHOP: RETI OBNOV: LDI REG,16 ;zlepsi zaokrouhlovani. 0,05 uz je 0,1 LDI REG2,0 ADD SOUCETL,REG ADC SOUCETH,REG2 LSR SOUCETH ;profi 16bitový dělení 32 ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL MOVW PREVODL,SOUCETL SBRC SONDAREG,0 ;vetveni, ktery teplomer se prave obnovuje RJMP OBNOV1 RJMP OBNOV2 OBNOV1: ;obnoveni teplomeru 1 CPI SONDAREG,3 BRSH MINMAX1_PRODLEVA LDS REG2,S1MINH LDS REG,S1MINL CP SOUCETH,REG2 BRLO S1MIN CP REG2,SOUCETH BRLO S1MIN_NE CP SOUCETL,REG BRSH S1MIN_NE S1MIN: STS S1MINH,SOUCETH STS S1MINL,SOUCETL S1MIN_NE: LDS REG2,S1MAXH LDS REG,S1MAXL CP REG2,SOUCETH BRLO S1MAX CP SOUCETH,REG2 BRLO S1MAX_NE CP REG,SOUCETL BRSH S1MAX_NE S1MAX: STS S1MAXH,SOUCETH STS S1MAXL,SOUCETL S1MAX_NE: MINMAX1_PRODLEVA: LDI SOUCETH,0 LDI SOUCETL,0 ZOBR_MINMAX1: IN REG,VSTUPY SBRC REG,4 RJMP Z_S1MIN_NE LDS PREVODH,S1MINH LDS PREVODL,S1MINL Z_S1MIN_NE: SBRC REG,5 RJMP Z_S1MAX_NE LDS PREVODH,S1MAXH LDS PREVODL,S1MAXL Z_S1MAX_NE: CPI PREVODH,0b00000111 BRLO DOBRY_A CPI PREVODL,0b11111110 BRLO DOBRY_A RJMP NAD1500 DOBRY_A: CPI PREVODH,0 BRNE DOBRY_B CPI PREVODL,0 BRNE DOBRY_B RJMP NAD1500 DOBRY_B: LDI CIF1,0 LDI CIF2,0 LDI CIF3,0 LDI CIF4,0 ;zjisti, jestli je teplota zaporna (u MCP9700 cislo do 499) CPI PREVODH,2 BRSH KLADNA CPI PREVODH,1 BRLO ZAPORNA CPI PREVODL,244 BRLO ZAPORNA KLADNA: ;kladna vcetne nuly (u MCP9700 500 a vic) SUBI PREVODL,244 ;odecte od hodnoty 500 SBCI PREVODH,1 RJMP KLADNA_KONEC ZAPORNA: LDI REG,244 ;odecte hodnotu od 500 LDI REG2,1 SUB REG,PREVODL SBC REG2,PREVODH MOVW PREVODL,REG LDI CIF4,128 KLADNA_KONEC: ZNOVU1000: CPI PREVODH,4 ;16-bitová podmínka vetsi nebo rovno 1000 BRSH MINUS1000 CPI PREVODH,3 BRLO POD1000 CPI PREVODL,232 BRLO POD1000 MINUS1000: SUBI PREVODL,232 ;16-bitový odčítání čísla 1000 od výsledku SBCI PREVODH,3 INC CIF4 RJMP ZNOVU1000 POD1000: 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 CIF3 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 CIF2 RJMP ZNOVU10 POD10: MOV CIF1,PREVODL RJMP DO1500 NAD1500: ;co když je výsledek nad 999 LDI CIF1,10 ;nastavení cifer mimo 0-9 zobrazí "_" LDI CIF2,10 LDI CIF3,10 LDI CIF4,0 DO1500: LDI PREVODL,0 LDI PREVODH,0 RET OBNOV2: ;obnoveni teplomeru 2 CPI SONDAREG,3 BRSH MINMAX2_PRODLEVA LDS REG2,S2MINH LDS REG,S2MINL CP SOUCETH,REG2 BRLO S2MIN CP REG2,SOUCETH BRLO S2MIN_NE CP SOUCETL,REG BRSH S2MIN_NE S2MIN: STS S2MINH,SOUCETH STS S2MINL,SOUCETL S2MIN_NE: LDS REG2,S2MAXH LDS REG,S2MAXL CP REG2,SOUCETH BRLO S2MAX CP SOUCETH,REG2 BRLO S2MAX_NE CP REG,SOUCETL BRSH S2MAX_NE S2MAX: STS S2MAXH,SOUCETH STS S2MAXL,SOUCETL S2MAX_NE: MINMAX2_PRODLEVA: LDI SOUCETH,0 LDI SOUCETL,0 ZOBR_MINMAX2: IN REG,VSTUPY SBRC REG,4 RJMP Z_S2MIN_NE LDS PREVODH,S2MINH LDS PREVODL,S2MINL Z_S2MIN_NE: SBRC REG,5 RJMP Z_S2MAX_NE LDS PREVODH,S2MAXH LDS PREVODL,S2MAXL Z_S2MAX_NE: LDI CIF5,0 LDI CIF6,0 LDI CIF7,0 ;zjisti, jestli je teplota zaporna (u MCP9700 cislo do 499) CPI PREVODH,2 BRSH KLADNA_2 CPI PREVODH,1 BRLO ZAPORNA_2 CPI PREVODL,244 BRLO ZAPORNA_2 KLADNA_2: ;kladna vcetne nuly (u MCP9700 500 a vic) CPI PREVODH,6 ;podminka vetsi/rovno 1500 (=nad rozsahem 99,9) BRSH NAD999_2 CPI PREVODH,5 BRLO KLADNA_2_OK CPI PREVODL,220 BRSH NAD999_2 KLADNA_2_OK: SUBI PREVODL,244 ;odecte od hodnoty 500 SBCI PREVODH,1 RJMP KLADNA_KONEC_2 ZAPORNA_2: LDI REG,244 ;odecte hodnotu od 500 LDI REG2,1 SUB REG,PREVODL SBC REG2,PREVODH MOVW PREVODL,REG LDI CIF7,128 KLADNA_KONEC_2: 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 CIF7 RJMP ZNOVU100_2 POD100_2: CPI CIF7,129 ;podmínka vetsi nebo rovno 129 BRSH NAD999_2 ;když už cifra3 = 129, je pod rozsahem (pod -9,9) 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 CIF6 RJMP ZNOVU10_2 POD10_2: MOV CIF5,PREVODL RJMP DO999_2 NAD999_2: ;co když je výsledek nad 999 LDI CIF5,10 ;nastavení cifer mimo 0-9 zobrazí "_" LDI CIF6,10 LDI CIF7,10 DO999_2: LDI PREVODL,0 LDI PREVODH,0 RET MULTIPLEX: DEC MULTREG BRNE MULTHOP LDI MULTREG,9 MULTHOP: RCALL MULT RETI MULT: ;multiplex LDI REG,0b00000000 OUT PORT3,REG CPI MULTREG,9 BREQ MULT9 CPI MULTREG,8 BREQ MULT8 CPI MULTREG,7 BREQ MULT7 CPI MULTREG,6 BREQ MULT6 CPI MULTREG,5 BREQ MULT5 CPI MULTREG,4 BREQ MULT4 CPI MULTREG,3 BREQ MULT3 CPI MULTREG,2 BREQ MULT2 CPI MULTREG,1 BREQ MULT1 MULT9: MOV REG,CIF1 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00000001 OUT PORT3,REG RET MULT8: MOV REG,CIF2 RCALL ZOBRAZ ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG LDI REG,0b00000010 OUT PORT3,REG RET MULT7: MOV REG,CIF3 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00000100 OUT PORT3,REG RET MULT6: MOV REG,CIF4 CPI REG,0 BREQ POTLAC0 RCALL ZOBRAZ RJMP ZOBRAZ_CIF4 POTLAC0: LDI REG,0b11111111 ZOBRAZ_CIF4: OUT PORT,REG LDI REG,0b00001000 OUT PORT3,REG RET MULT5: MOV REG,CIF5 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00010000 OUT PORT3,REG RET MULT4: MOV REG,CIF6 RCALL ZOBRAZ ANDI REG,127 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG LDI REG,0b00100000 OUT PORT3,REG RET MULT3: MOV REG,CIF7 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b01000000 OUT PORT3,REG RET MULT2: LDI REG,0b00000000 OUT PORT,REG RET MULT1: IN REG,VSTUPY ANDI REG,0b00110000 CPI REG,0b00000000 BREQ TLAC_RESET CPI REG,0b00110000 BRNE TLAC_MINMAX RJMP TLAC_KONEC TLAC_RESET: LDI REG,0 STS S1MAXL,REG STS S1MAXH,REG STS S2MAXL,REG STS S2MAXH,REG LDI REG,255 STS S1MINL,REG STS S2MINL,REG STS S1MINH,REG STS S2MINH,REG TLAC_MINMAX: RCALL ZOBR_MINMAX1 RCALL ZOBR_MINMAX2 TLAC_KONEC: RCALL ZMERIT RET ZOBRAZ: CPI REG,0 BREQ ZOBRAZ0 CPI REG,1 BREQ ZOBRAZ1 CPI REG,2 BREQ ZOBRAZ2 CPI REG,3 BREQ ZOBRAZ3 CPI REG,4 BREQ ZOBRAZ4 CPI REG,5 BREQ ZOBRAZ5 CPI REG,6 BREQ ZOBRAZ6 CPI REG,7 BREQ ZOBRAZ7 CPI REG,8 BREQ ZOBRAZ8 CPI REG,9 BREQ ZOBRAZ9 CPI REG,128 BREQ ZOBRAZ_MINUS LDI REG,0b11110111 RET ZOBRAZ0: LDI REG,0b11000000 RET ZOBRAZ1: LDI REG,0b11111001 RET ZOBRAZ2: LDI REG,0b10100100 RET ZOBRAZ3: LDI REG,0b10110000 RET ZOBRAZ4: LDI REG,0b10011001 RET ZOBRAZ5: LDI REG,0b10010010 RET ZOBRAZ6: LDI REG,0b10000010 RET ZOBRAZ7: LDI REG,0b11111000 RET ZOBRAZ8: LDI REG,0b10000000 RET ZOBRAZ9: LDI REG,0b10010000 RET ZOBRAZ_MINUS: LDI REG,0b10111111 RET