; Meteostanice - teplota + vlhkost + tlak, MIN + MAX ; ATmega8 / 8A / 8L, 1MHz interni RC ; DANYK ; http://danyk.cz/avr_meteo.html ; -------------------------------------------------- .NOLIST .INCLUDE "m8def.inc" .LIST .DEF BARO1=R6 .DEF BARO2=R7 .DEF BARO3=R8 .DEF BARO4=R9 .DEF HYGRO1=R10 .DEF HYGRO2=R11 .DEF TERMO1=R12 .DEF TERMO2=R13 .DEF TERMO3=R14 .DEF SOUCET3=R15 .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 PRODLEVA=R25 .EQU SMER=DDRD .EQU PORT=PORTD .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU VSTUPY=PINC .EQU SMER3=DDRB .EQU PORT3=PORTB .EQU BARO_MAXL=0x0060 .EQU BARO_MAXH=0x0061 .EQU HYGRO_MAX=0x0062 .EQU TERMO_MAXL=0x0063 .EQU TERMO_MAXH=0x0064 .EQU BARO_MINL=0x0065 .EQU BARO_MINH=0x0066 .EQU HYGRO_MIN=0x0067 .EQU TERMO_MINL=0x0068 .EQU TERMO_MINH=0x0069 .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 LDI REG,0xFF OUT SMER,REG LDI REG,0xFF OUT PORT,REG ;nastaví port C LDI REG,0b100000 OUT SMER2,REG LDI REG,0b011000 OUT PORT2,REG ;nastaví port B LDI REG,0xFF OUT SMER3,REG LDI REG,0x00 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,1 ;prednastavi registr volby sondy LDI PRUMREG,1 ;prednastavi registr pocitajici vzorky LDI PRODLEVA,15 ;prednastavi registr prodlevy min/max po zapnuti LDI REG,11 MOV BARO1,REG MOV BARO2,REG MOV BARO3,REG MOV BARO4,REG MOV HYGRO1,REG MOV HYGRO2,REG MOV TERMO1,REG MOV TERMO2,REG MOV TERMO3,REG CLR PREVODL CLR PREVODH CLR SOUCETL CLR SOUCETH CLR SOUCET3 LDI REG,0 STS BARO_MAXL,REG STS BARO_MAXH,REG STS HYGRO_MAX,REG STS TERMO_MAXL,REG STS TERMO_MAXH,REG LDI REG,255 STS BARO_MINL,REG STS BARO_MINH,REG STS HYGRO_MIN,REG STS TERMO_MINL,REG STS TERMO_MINH,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 mod ADC nr OUT MCUCR,REG ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG SEI ;povoli globalni preruseni ;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, jednorazove, 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 CLR REG ADC SOUCET3,REG DEC PRUMREG BRNE HOTOHOP RCALL OBNOV CPI PRODLEVA,0 BREQ PRODLEVA_PRYC DEC PRODLEVA PRODLEVA_PRYC: DEC SONDAREG BRNE SONDAHOP LDI SONDAREG,3 SONDAHOP: MOV REG,SONDAREG DEC REG ORI REG,0b01000000 OUT ADMUX,REG CLR SOUCETH CLR SOUCETL CLR SOUCET3 HOTOHOP: RETI OBNOV: LDI ZL,LOW(VELICINA_SKOK) ;vetveni, ktery udaj se prave obnovuje LDI ZH,HIGH(VELICINA_SKOK) MOV REG,SONDAREG DEC REG ADD ZL,REG CLR REG ADC ZH,REG IJMP VELICINA_SKOK: RJMP OBNOV1 RJMP OBNOV2 RJMP OBNOV3 OBNOV1: ;obnoveni barometru LDI PRUMREG,156 ;Pocet vzorku TERMO ; POZOR - Pocty vzorku jsou pro nasledujici senzor, ne prave obnovovany! LSR SOUCET3 ;24 bitove deleni 128 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LDI REG,LOW(106) LDI REG2,HIGH(106) ADD SOUCETL,REG ADC SOUCETH,REG2 MOVW PREVODL,SOUCETL CPI PRODLEVA,0 BRNE MINMAX1_PRODLEVA LDS REG2,BARO_MINH LDS REG,BARO_MINL CP SOUCETL,REG CPC SOUCETH,REG2 BRSH BARO_MIN_NE STS BARO_MINH,SOUCETH STS BARO_MINL,SOUCETL BARO_MIN_NE: LDS REG2,BARO_MAXH LDS REG,BARO_MAXL CP REG,SOUCETL CPC REG2,SOUCETH BRSH BARO_MAX_NE STS BARO_MAXH,SOUCETH STS BARO_MAXL,SOUCETL BARO_MAX_NE: MINMAX1_PRODLEVA: ZOBR_MINMAX_BARO: IN REG,VSTUPY SBRC REG,3 RJMP Z_BARO_MIN_NE LDS PREVODH,BARO_MINH LDS PREVODL,BARO_MINL Z_BARO_MIN_NE: SBRC REG,4 RJMP Z_BARO_MAX_NE LDS PREVODH,BARO_MAXH LDS PREVODL,BARO_MAXL Z_BARO_MAX_NE: CPI PREVODL,LOW(1151) ;Kontrola, zda neni nad rozsahem LDI REG,HIGH(1151) CPC PREVODH,REG BRLO BARO_DOBRY RJMP BARO_NAD BARO_DOBRY: CPI PREVODL,LOW(150) ;Kontrola, zda neni pod rozsahem LDI REG,HIGH(150) CPC PREVODH,REG BRSH BARO_DOBRY2 RJMP BARO_POD BARO_DOBRY2: CLR BARO1 CLR BARO2 CLR BARO3 CLR BARO4 ZNOVU1000: CPI PREVODL,LOW(1000) LDI REG,HIGH(1000) CPC PREVODH,REG ;16-bitova podminka mensi nez 1000 BRLO POD1000 SUBI PREVODL,LOW(1000) ;16-bitove odcitani čísla 1000 od vysledku SBCI PREVODH,HIGH(1000) INC BARO4 RJMP ZNOVU1000 POD1000: ZNOVU100: CPI PREVODL,LOW(100) LDI REG,HIGH(100) CPC PREVODH,REG ;16-bitova podminka mensi nez 100 BRLO POD100 SUBI PREVODL,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SBCI PREVODH,HIGH(100) INC BARO3 RJMP ZNOVU100 POD100: ZNOVU10: CPI PREVODL,10 ;8-bitova podminka mensi nez 10 BRLO POD10 SUBI PREVODL,10 ;8-bitove odcitani čísla 10 od vysledku INC BARO2 RJMP ZNOVU10 POD10: MOV BARO1,PREVODL RET BARO_POD: ;co kdyz je vysledek pod rozsahem LDI REG,11 MOV BARO1,REG ;nastaveni cifer na 11 zobrazi "_" MOV BARO2,REG MOV BARO3,REG MOV BARO4,REG RET BARO_NAD: ;co kdyz je vysledek nad rozsahem LDI REG,10 MOV BARO1,REG ;nastaveni cifer na 10 zobrazi "-" MOV BARO2,REG MOV BARO3,REG MOV BARO4,REG RET OBNOV2: ;obnoveni hygro LDI PRUMREG,139 ;Pocet vzorku BARO ; POZOR - Pocty vzorku jsou pro nasledujici senzor, ne prave obnovovany! ;24 bitove deleni 512 MOV SOUCETL,SOUCETH MOV SOUCETH,SOUCET3 CLR SOUCET3 LSR SOUCETH ROR SOUCETL SUBI SOUCETL,LOW(23) SBCI SOUCETH,HIGH(23) BRCC HYGRO_NEZAPOR CLR SOUCETH CLR SOUCETL HYGRO_NEZAPOR: MOVW PREVODL,SOUCETL CPI PRODLEVA,0 BRNE MINMAX2_PRODLEVA LDS REG,HYGRO_MIN CP SOUCETL,REG BRSH HYGRO_MIN_NE STS HYGRO_MIN,SOUCETL HYGRO_MIN_NE: LDS REG,HYGRO_MAX CP REG,SOUCETL BRSH HYGRO_MAX_NE STS HYGRO_MAX,SOUCETL HYGRO_MAX_NE: MINMAX2_PRODLEVA: ZOBR_MINMAX_HYGRO: IN REG,VSTUPY SBRC REG,3 RJMP Z_HYGRO_MIN_NE CLR PREVODH LDS PREVODL,HYGRO_MIN Z_HYGRO_MIN_NE: SBRC REG,4 RJMP Z_HYGRO_MAX_NE CLR PREVODH LDS PREVODL,HYGRO_MAX Z_HYGRO_MAX_NE: CLR HYGRO1 CLR HYGRO2 CPI PREVODL,LOW(100) ;Kontrola, zda neni nad rozsahem LDI REG,HIGH(100) CPC PREVODH,REG BRLO HYGRO_DOBRY RJMP HYGRO_NAD HYGRO_DOBRY: CPI PREVODL,0 ;Kontrola, zda neni pod rozsahem LDI REG,0 CPC PREVODH,REG BRNE HYGRO_DOBRY2 RJMP HYGRO_POD HYGRO_DOBRY2: ZNOVU10_2: CPI PREVODL,10 ;8-bitova podminka vetsi nebo rovno 10 BRLO POD10_2 SUBI PREVODL,10 ;8-bitove odcitani cisla 10 od vysledku INC HYGRO2 RJMP ZNOVU10_2 POD10_2: MOV HYGRO1,PREVODL RET HYGRO_POD: ;co kdyz je vysledek pod rozsahem LDI REG,11 MOV HYGRO1,REG ;nastaveni cifer na 11 zobrazi "_" MOV HYGRO2,REG RET HYGRO_NAD: ;co kdyz je vysledek nad rozsahem LDI REG,10 MOV HYGRO1,REG ;nastaveni cifer na 10 zobrazi "-" MOV HYGRO2,REG RET OBNOV3: ;obnoveni teplomeru LDI PRUMREG,79 ;Pocet vzorku HYGRO ; POZOR - Pocty vzorku jsou pro nasledujici senzor, ne prave obnovovany! LSR SOUCET3 ;24 bitove deleni 32 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL LSR SOUCET3 ROR SOUCETH ROR SOUCETL MOVW PREVODL,SOUCETL CPI PRODLEVA,0 BRNE MINMAX3_PRODLEVA LDS REG2,TERMO_MINH LDS REG,TERMO_MINL CP SOUCETL,REG CPC SOUCETH,REG2 BRSH TERMO_MIN_NE STS TERMO_MINH,SOUCETH STS TERMO_MINL,SOUCETL TERMO_MIN_NE: LDS REG2,TERMO_MAXH LDS REG,TERMO_MAXL CP REG,SOUCETL CPC REG2,SOUCETH BRSH TERMO_MAX_NE STS TERMO_MAXH,SOUCETH STS TERMO_MAXL,SOUCETL TERMO_MAX_NE: MINMAX3_PRODLEVA: ZOBR_MINMAX_TERMO: IN REG,VSTUPY SBRC REG,3 RJMP Z_TERMO_MIN_NE LDS PREVODH,TERMO_MINH LDS PREVODL,TERMO_MINL Z_TERMO_MIN_NE: SBRC REG,4 RJMP Z_TERMO_MAX_NE LDS PREVODH,TERMO_MAXH LDS PREVODL,TERMO_MAXL Z_TERMO_MAX_NE: CLR TERMO1 CLR TERMO2 CLR TERMO3 CPI PREVODL,LOW(1000) ;Kontrola, zda neni nad rozsahem LDI REG,HIGH(1000) CPC PREVODH,REG BRLO TERMO_DOBRY RJMP TERMO_NAD TERMO_DOBRY: CPI PREVODL,LOW(20) ;Kontrola, zda neni pod rozsahem LDI REG,HIGH(20) CPC PREVODH,REG BRSH TERMO_DOBRY2 RJMP TERMO_POD TERMO_DOBRY2: ZNOVU100_3: CPI PREVODL,LOW(100) LDI REG,HIGH(100) CPC PREVODH,REG ;16-bitova podminka mensi nez 100 BRLO POD100_3 SUBI PREVODL,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SBCI PREVODH,HIGH(100) INC TERMO3 RJMP ZNOVU100_3 POD100_3: ZNOVU10_3: CPI PREVODL,10 ;8-bitova podminka vetsi nebo rovno 10 BRLO POD10_3 SUBI PREVODL,10 ;8-bitove odecitani cisla 10 od vysledku INC TERMO2 RJMP ZNOVU10_3 POD10_3: MOV TERMO1,PREVODL RET TERMO_POD: ;co kdyz je vysledek pod rozsahem LDI REG,11 MOV TERMO1,REG ;nastaveni cifer na 11 zobrazi "_" MOV TERMO2,REG MOV TERMO3,REG RET TERMO_NAD: ;co kdyz je vysledek nad rozsahem LDI REG,10 MOV TERMO1,REG ;nastaveni cifer na 10 zobrazi "-" MOV TERMO2,REG MOV TERMO3,REG RET MULTIPLEX: ;multiplex - posun o cifru DEC MULTREG BRNE MULTHOP LDI MULTREG,9 MULTHOP: RCALL MULT RETI MULT: ;multiplex LDI REG,0b00000000 OUT PORT3,REG LDI REG,0b011000 OUT PORT2,REG LDI ZL,LOW(MULT_SKOK) ;vetveni, ktera cifra se rozsviti LDI ZH,HIGH(MULT_SKOK) MOV REG,MULTREG DEC REG ADD ZL,REG CLR REG ADC ZH,REG IJMP MULT_SKOK: RJMP MULT1 RJMP MULT2 RJMP MULT3 RJMP MULT4 RJMP MULT5 RJMP MULT6 RJMP MULT7 RJMP MULT8 RJMP MULT9 MULT9: MOV REG,BARO1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,0 RET MULT8: MOV REG,BARO2 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,1 RET MULT7: MOV REG,BARO3 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,2 RET MULT6: MOV REG,BARO4 CPI REG,0 BREQ POTLAC0 RCALL ZOBRAZ RJMP ZOBRAZ_BARO4 POTLAC0: LDI REG,0b11111111 ZOBRAZ_BARO4: OUT PORT,REG SBI PORT3,3 RCALL VZOREK ;Tady se vola vzorkovani! RET MULT5: MOV REG,HYGRO1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,4 RET MULT4: MOV REG,HYGRO2 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,5 RET MULT3: MOV REG,TERMO1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,6 RET MULT2: MOV REG,TERMO2 RCALL ZOBRAZ ANDI REG,127 ;tohle rozsviti tecku (bit7) OUT PORT,REG SBI PORT3,7 RET MULT1: MOV REG,TERMO3 RCALL ZOBRAZ OUT PORT,REG SBI PORT2,5 RET ; Udela dalsi vzorek a vyhodnoti tlacitka VZOREK: IN REG,VSTUPY ANDI REG,0b00011000 CPI REG,0b00000000 BREQ TLAC_RESET CPI REG,0b00011000 BRNE TLAC_MINMAX RJMP TLAC_KONEC TLAC_RESET: LDI REG,0 STS BARO_MAXL,REG STS BARO_MAXH,REG STS HYGRO_MAX,REG STS TERMO_MAXL,REG STS TERMO_MAXH,REG LDI REG,255 STS BARO_MINL,REG STS BARO_MINH,REG STS HYGRO_MIN,REG STS TERMO_MINL,REG STS TERMO_MINH,REG TLAC_MINMAX: RCALL ZOBR_MINMAX_BARO RCALL ZOBR_MINMAX_HYGRO RCALL ZOBR_MINMAX_TERMO TLAC_KONEC: RCALL ZMERIT RET ; Prevod BCD na 7segmentu ZOBRAZ: CPI REG,12 BRLO ZOBRAZ_JE_OK LDI REG,10 ZOBRAZ_JE_OK: LDI ZH,HIGH(2*TABULKA) LDI ZL,LOW(2*TABULKA) ADD ZL,REG CLR REG ADC ZH,REG LPM REG,Z RET ; tabulka znakove sady TABULKA: .DB 0b11000000,0b11111001 ;0, 1 .DB 0b10100100,0b10110000 ;2, 3 .DB 0b10011001,0b10010010 ;4, 5 .DB 0b10000010,0b11111000 ;6, 7 .DB 0b10000000,0b10010000 ;8, 9 .DB 0b11111110,0b11110111 ;-, _