You are on page 1of 13

Linguagem Assembly para estação meteorológica

; 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
Linguagem Assembly para estação meteorológica

; 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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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
Linguagem Assembly para estação meteorológica

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 ;-, _