- .include "tn2313def.inc"
- .equ SEG_G =0x1000
- .equ SEG_P_G =0x4000
- .equ SEG_L_G =0x2000
- .equ SEG_SR =0x8000
- .equ SEG_P_D =0x2
- .equ SEG_L_D =0x1
- .equ SEG_D =0x4
- .equ KROPKA =0x8
- .equ zero =SEG_G+SEG_P_G+SEG_L_G+SEG_P_D+SEG_L_D+SEG_D
- .equ jeden =SEG_P_G+SEG_P_D
- .equ dwa =SEG_G+SEG_P_G+SEG_SR+SEG_L_D+SEG_D
- .equ trzy =SEG_G+SEG_P_G+SEG_SR+SEG_P_D+SEG_D
- .equ cztery =SEG_L_G+SEG_P_G+SEG_SR+SEG_P_D
- .equ piec =SEG_G+SEG_L_G+SEG_SR+SEG_P_D+SEG_D
- .equ szesc =SEG_G+SEG_L_G+SEG_SR+SEG_P_D+SEG_L_D+SEG_D
- .equ siedem =SEG_G+SEG_P_G+SEG_P_D
- .equ osiem =SEG_G+SEG_P_G+SEG_L_G+SEG_SR+SEG_P_D+SEG_L_D+SEG_D
- .equ dziewiec=SEG_G+SEG_P_G+SEG_L_G+SEG_SR+SEG_P_D+SEG_D
- .equ litstopien=SEG_G+SEG_P_G+SEG_L_G+SEG_SR
- .equ litc =SEG_G+SEG_L_G+SEG_L_D+SEG_D
- .equ litj =SEG_L_D + SEG_D + SEG_P_D + SEG_P_G
- .equ litd =SEG_L_D+SEG_D+SEG_P_D+SEG_SR+SEG_P_G
- .equ litp =SEG_L_D+SEG_L_G+SEG_G+SEG_SR+SEG_P_G
- .equ litn =SEG_SR+SEG_P_D+SEG_L_D
- .equ MINUS = 10
- .equ NIC = 11
- .equ STOPIEN = 12
- .equ C = 13
- .equ J = 14
- .equ D = 15
- .equ P = 16
- .equ N = 17
- .equ PORT595 =PORTB
- .equ DDR595 =DDRB
- .equ DIN =PB4
- .equ CLK =PB6
- .equ LOAD =PB3
- .equ _1WDDR = DDRB
- .equ _1WPIN = PINB
- .equ _1WL = PB2
- .equ _1WPORT = PORTB
- ;rejestry
- .def sregtmp =r0
- .def tmpi1 =r1
- .def wysl_i =r2
- .def ZERO =r3
- .def mig1 =r4
- .def mig2 =r5
- .def przyc =r6
- .def stp =r7
- .def ptmp =r8
- .def jasnosc =r9
- .def ile_czuj=r10
- .def stan =r11 ;0-czas, 1-data, 2-temp
- .def stan_tmp=r12
- .def mig2r =r13
- .def rjasnosc=r14
- ;r15
- ;tylko dla search_rom
- .def powtorz=r11
- .def ostatni=r12
- .def licznik=r13
- .def ostatni_zero =r14
- .def dana=r15
- .def tmp =r16
- .def tmp1 =r17
- .def L =r18
- .def ARGD =r19
- .def LSB =r20
- .def tmpi2 =r20
- .def MSB =r21
- .def tmpi =r22
- .def ustaw_i =r23
- .def ARG =r24
- .def ARGL =r24
- .def ARGH =r25
- .def X =r26
- .def tryb =r27
- .def LY =r28
- .def HY =r29
- .def LZ =r30
- .def HZ =r31
- .macro adpmZ
- ldi r30, (@0*2)&255
- ldi r31, @0>>7
- .endmacro
- .macro lsr16
- lsr @1
- ror @0
- .endmacro
- .macro adi
- subi @0, 256-@1
- .endmacro
- .dseg
- w: .byte 7
- minusik: .byte 1
- minusik1: .byte 1
- minusik2: .byte 1
- temperatura1: .byte 2
- temperatura2: .byte 2
- czas:
- sek: .byte 1
- min: .byte 1
- godz: .byte 1
- dzient: .byte 1
- dzienm: .byte 1
- mies: .byte 1
- rok: .byte 1
- konf:
- jasn_dzien: .byte 1
- jasn_noc: .byte 1
- pocz_dnia: .byte 1
- pocz_nocy: .byte 1
- cykl: .byte 1
- czasc: .byte 1
- rom:
- ukl1: .byte 8
- ukl2: .byte 8
- dtemp: .byte 1
- .cseg
- ldi tmp, RAMEND ;stos
- out SPL, tmp
- ldi tmp, 1<<WGM01
- out TCCR0A, tmp
- ldi tmp, (1<<CS00)+(1<<CS01)
- out TCCR0B, tmp
- ldi tmp, (1<<LOAD)+(1<<CLK)+(1<<DIN)
- out DDR595, tmp
- clr ZERO
- sbi PORTD, 0
- sbi PORTD, 1
- sbi PORTA, 1
- rjmp main
- vector_TM0A:
- in sregtmp, SREG
- push X
- ldi tmpi, 180 ;start rejestru timera
- out TCNT0, tmpi
- sbrs mig1, 1 ;obsl. klawiatury
- rcall obsl_przyc
- inc mig1
- brne int_wysylaj
- inc mig2r
- inc mig2
- mov tmpi, mig2r
- andi tmpi, 0x0f
- brne jasnosc_ust
- cp rjasnosc, jasnosc
- breq jasnosc_ust
- brlo jasnosc_mniejsza
- dec rjasnosc
- rjmp jasnosc_ust
- jasnosc_mniejsza:
- inc rjasnosc
- jasnosc_ust:
- lds tmpi, czasc ;czas przelaczania
- add tmpi, tmpi
- adi tmpi, 12
- cp mig2, tmpi
- brlo int_wysylaj
- clr mig2
- lds tmpi, cykl ;przelaczanie czas/temp
- cpi tmpi, 2
- brlo podany_cykl
- inc tryb
- rjmp int_wysylaj
- podany_cykl:
- mov tryb, tmpi
- int_wysylaj:
- and tryb, tryb ;przy ustawianiu zawsze jasnosc bez plynnego przejscia
- brne nie_ustawianie
- mov rjasnosc, jasnosc
- nie_ustawianie:
- mov tmpi, mig1 ;jasnosc
- andi tmpi, 0x1f
- cp rjasnosc, tmpi
- brlo int_wyjdz
- ldi L, 7
- ldi X, w
- rcall wygas_zero
- adpmZ siatka
- int_petla: ;petla wyswietlania
- ld tmpi, X+
- add tmpi, tmpi
- movw LY, LZ
- adpmZ cyfra
- add LZ, tmpi
- ; adc HZ, ZERO
- lpm LSB, Z+
- lpm MSB, Z
- cpi L, 6 ;przecinek
- sbrc stan, 1
- brsh test_przec
- cpi L, 1 ;migajaca kropka
- brne orb
- sbrs mig2r, 1 ;miganie
- rjmp orb
- cp stan, ZERO ;tylko jesli czas
- brne orb
- cpi tmpi, 20
- brsh orb
- rjmp u_kropka
- test_przec: ;przecinek
- mov LZ, X
- ldd tmpi, Z+1
- cpi tmpi, STOPIEN
- brne orb
- u_kropka:
- ori LSB, KROPKA
- orb:
- movw LZ, LY
- lpm tmpi, Z+
- lpm tmpi1, Z+
- or LSB, tmpi
- or MSB, tmpi1
- rcall wyslij
- dec L
- brne int_petla
- rcall wysw_koniec
- int_wyjdz:
- pop X
- out SREG, sregtmp
- reti
- wysw_koniec:
- ldi MSB, high(0x800)
- ldi LSB, 0
- sbrs stan, 1
- rjmp spr_kropka
- lds tmpi, minusik ;minus
- sbrc tmpi, 3
- ori MSB, high(SEG_SR)
- rjmp nie_ma
- spr_kropka:
- sbrc stan, 0
- ori LSB, low(KROPKA)
- nie_ma:
- rcall wyslij ;wyslij siatke 1
- rcall wyslij ;wyczysc wyswietlacz
- ret
- obsl_przyc:
- and przyc, przyc
- breq przyc_dalej ;jak przyc>0 nie sprawdzaj
- ret
- przyc_dalej:
- in tmpi, PIND
- sbrs tmpi, 0
- rjmp wcisniety
- sbrs tmpi, 1
- rjmp wcisniety
- in tmpi, PINA
- sbrs tmpi, 1
- rjmp wcisniety
- clr stp
- ret
- wcisniety:
- mov tmpi, stp
- cpi tmpi, 255
- breq wpisz_przyc
- inc stp
- cpi tmpi, 2
- breq wpisz_przyc
- ret
- wpisz_przyc:
- clr tmpi2
- in tmpi, PIND
- sbrs tmpi, 0
- ori tmpi2, 1
- sbrs tmpi, 1
- ori tmpi2, 2
- in tmpi, PINA
- sbrs tmpi, 1
- ori tmpi2, 4
- mov przyc, tmpi2
- ret
- przycisk:
- mov ptmp, przyc
- clr przyc
- ret
- wygas_zero:
- lds tmpi, w+6
- cpi tmpi, 11
- brsh niezero
- ld tmpi, X
- cpi tmpi, 0
- brne niezero
- ldi tmpi, NIC
- st X, tmpi
- niezero:
- ret
- main:
- clr przyc
- ldi X, w
- pet_zer:
- st X+, ZERO
- cpi X, dtemp
- brlo pet_zer
- st X, ZERO
- ldi ARG, 7
- ldi ARGH, 1
- rcall i2cSend
- ldi X, konf ;wczytaj ustawienia
- ldi ARG, 8
- ldi ARGH, 6
- rcall i2cReceive
- rcall search_rom
- and ile_czuj, ile_czuj
- brne nie_wylacz_temp
- sts cykl, ZERO
- nie_wylacz_temp:
- ldi tmp, 1<<OCIE0A
- out TIMSK, tmp
- clr stan_tmp
- ; sei
- ; ldi ARG, 15
- ; mov jasnosc, ARG
- petla:
- ; ldi ARG, 0
- ; ldi ARGH, 1
- ; ldi X, sek
- ; rcall i2cReceive
- ; lds ARG, sek
- ; rcall bcd2bin
- ; ldi X, w
- ; rcall dz
- ; ldi ARG, 50
- ; rcall _delay_ms
- ; rjmp petla
- sei
- mov stan, stan_tmp
- rcall odcz_czas
- rcall przycisk
- sbrc ptmp, 2
- rcall ustaw
- sbrc ptmp, 1 ;przel czas/data
- rjmp przel_data
- sbrc ptmp, 0
- rjmp przel_data
- sbrc tryb, 0 ;temperatura
- breq main_temp
- rjmp petla ;koniec odcz czasu
- main_temp: ;odcz temperatury
- mov stan_tmp, stan
- rcall wysw_temp
- lds tmp, cykl
- cpi tmp, 1 ;jesli cykl=1 to odczytuj temp w cyklu
- breq petla
- czekaj_na_tryb: ;jesli nie, odczytaj tylko raz
- rcall przycisk
- sbrc ptmp, 2
- rcall ustaw
- sbrc tryb,0
- rjmp czekaj_na_tryb
- rjmp petla
- przel_data: ;przel czas/data
- mov tmp, stan
- cp stan, ZERO
- breq stan_zero
- mov stan_tmp, ZERO
- rjmp petla
- stan_zero:
- ldi tmp, 1
- mov stan_tmp, tmp
- rjmp petla
- minusw:
- ldi tmp, MINUS ;zastepowanie nieustawianych liczb kreskami
- st X+, tmp
- st X+, tmp
- ret
- ustaw:
- clr ustaw_i
- ustaw_petla:
- clr tryb
- rcall odcz_czas
- ldi X, w
- cpi ustaw_i, 0 ;godz
- breq u0
- cpi ustaw_i, 1 ;min
- breq u1
- cpi ustaw_i, 2 ;sek
- breq u2
- cpi ustaw_i, 3 ;dzien
- breq u3
- cpi ustaw_i, 4 ;mies
- breq u4
- cpi ustaw_i, 5 ;rok
- breq u5
- cpi ustaw_i, 6 ;jas dzien
- breq u6
- cpi ustaw_i, 7 ;jas noc
- breq u7
- cpi ustaw_i, 8 ;pocz dnia
- breq u8
- cpi ustaw_i, 9 ;pocz nocy
- breq u9
- cpi ustaw_i, 10 ;cykl
- breq u10
- u11: ;opoznienie
- ldi tmp, D
- st X+, tmp
- ldi tmp, NIC
- st X, tmp
- rjmp ustaw_dalej
- u10: ;cykl
- and ile_czuj, ile_czuj
- brne sa_czujniki
- ret ;jesli nie ma czujnikow temp
- sa_czujniki:
- ldi tmp, C
- st X+, tmp
- ldi tmp, NIC
- st X, tmp
- rjmp ustaw_dalej
- u9: ;pocz nocy
- ldi tmp, P
- st X+, tmp
- ldi tmp, N
- st X, tmp
- rjmp ustaw_dalej
- u3: ;dzien
- u0: ;godz
- ldi X, w+3
- rcall minusw
- rcall minusw
- rjmp ustaw_dalej
- u4: ;mies
- u1: ;min
- rcall minusw
- ldi X, w+5
- rcall minusw
- rjmp ustaw_dalej
- u5: ;rok
- u2: ;sek
- rcall minusw
- inc X
- rcall minusw
- rjmp ustaw_dalej
- u7: ;jasnosc noc
- ldi tmp, J
- st X+, tmp
- ldi tmp, N
- st X, tmp
- rjmp ustaw_dalej
- u6: ;jasnosc dzien
- ldi tmp, J
- st X+, tmp
- ldi tmp, D
- st X, tmp
- rjmp ustaw_dalej
- u8: ;pocz dnia
- ldi tmp, P
- st X+, tmp
- ldi tmp, D
- st X, tmp
- ;rjmp ustaw_dalej
- ustaw_dalej:
- cpi ustaw_i, 6
- brlo nie_konf
- mov tmp, ustaw_i ;wyswietlanie przy ustawianiu konf
- subi tmp, 6
- ldi X, konf
- add X, tmp
- ld ARG, X
- ldi X, w+2
- rcall dz
- ldi tmp, NIC
- st X+, tmp
- st X+, tmp
- st X, tmp
- nie_konf:
- sei
- rcall przycisk
- and ptmp, ptmp
- brne _ustaw_wcisniety
- rjmp ustaw_petla ;nie rob nic wiecej jak nie byl wcisniety
- _ustaw_wcisniety:
- sbrs ptmp, 2 ;ustaw nastepna
- rjmp ustaw_nie_nastepny
- inc ustaw_i
- cpi ustaw_i, 6 ;stan data - tylko jesli ustawiamy date
- brsh nie_kropka
- cpi ustaw_i, 3
- brlo nie_kropka
- ldi tmp, 1
- mov stan, tmp
- rjmp ustaw_nastepny
- nie_kropka:
- mov stan, ZERO
- ustaw_nastepny: ;ustaw nastepna
- cpi ustaw_i, 12
- breq ustaw_koniec
- rjmp ustaw_petla
- ustaw_koniec:
- ret
- ustaw_nie_nastepny: ;a jesli nie ustaw nastepna, to byl wcisniety +/-
- cpi ustaw_i, 0 ;godz
- breq zm0
- cpi ustaw_i, 1 ;min
- breq zm1
- cpi ustaw_i, 2 ;sek
- breq zm2
- cpi ustaw_i, 3 ;dzien
- breq zm3
- cpi ustaw_i, 4 ;mies
- breq zm4
- cpi ustaw_i, 5 ;rok
- breq zm5
- cpi ustaw_i, 6 ;jas dzien
- breq zm6
- cpi ustaw_i, 7 ;jas noc
- breq zm7
- cpi ustaw_i, 8 ;pocz dnia
- breq zm8
- cpi ustaw_i, 9 ;pocz nocy
- breq zm9
- cpi ustaw_i, 10 ;cykl
- breq zm10
- ;breq zm11 ;opozn
- zm11: ;opoznienie
- ldi ARG, 15
- ldi X, czasc
- rjmp ustaw_zapis_konf
- zm10: ;cykl
- ldi ARG, 2
- ldi X, cykl
- rjmp ustaw_zapis_konf
- zm9: ;pocz nocy
- ldi ARG, 23
- ldi X, pocz_nocy
- rjmp ustaw_zapis_konf
- zm8: ;pocz dnia
- ldi ARG, 23
- ldi X, pocz_dnia
- rjmp ustaw_zapis_konf
- zm7: ;jasnosc noc
- ldi ARG, 31
- ldi X, jasn_noc
- rjmp ustaw_zapis_konf
- zm6: ;jasnosc dzien
- ldi ARG, 31
- ldi X, jasn_dzien
- rjmp ustaw_zapis_konf
- zm5: ;ust rok
- ldi X, rok
- ldi ARG, 99
- rjmp ustaw_zapis
- zm4: ;ust mies
- ldi X, mies
- ldi ARG, 12
- rjmp ustaw_zapis
- zm3: ;ust dzien
- ldi X, dzienm
- ldi ARG, 31
- rjmp ustaw_zapis
- zm2: ;zeruj sekundy
- ldi X, sek
- st X, ZERO
- ldi ARGH, 1
- ldi ARG, 0
- rcall i2cSend
- rjmp ustaw_petla
- zm0: ;ust godziny
- ldi X, godz
- ldi ARG, 23
- rjmp ustaw_zapis
- zm1: ;ust minuty
- ldi X, min
- ldi ARG, 59
- ustaw_zapis: ;zapis czasu
- rcall pm
- ldi X, min
- ldi tmp, 6
- konw_petla:
- ld ARG, X
- rcall bin2bcd
- st X+, ARG
- dec tmp
- brne konw_petla
- ldi X, min
- ldi ARGH, 6
- ldi ARG, 1
- rcall i2cSend
- rjmp ustaw_petla
- ustaw_zapis_konf: ;zapis konfiguracji
- rcall pm
- ldi X, konf
- ldi ARG, 8
- ldi ARGH, 6
- rcall i2cSend
- rjmp ustaw_petla
- pm:
- ld tmp, X
- sbrc ptmp, 0
- rjmp pm_plus
- cpi tmp, 0 ;minus
- breq pm_zero
- dec tmp
- st X, tmp
- ret
- pm_zero:
- st X, ARG
- ret
- pm_plus: ;plus
- cp tmp, ARG
- brsh pm_max
- inc tmp
- st X, tmp
- ret
- pm_max:
- st X, ZERO
- ret
- wyslij_adr:
- ldi X, dtemp
- ld tmp, X
- sbrc tmp, 0
- ldi X, ukl2
- sbrs tmp, 0
- ldi X, ukl1
- ldi tmp1, 8
- adr_petla:
- ld ARG, X+
- rcall _1wire_write
- dec tmp1
- brne adr_petla
- ret
- wysw_temp:
- ldi tmp, 2
- mov stan, tmp
- clr tmp1
- sbrc ile_czuj, 1
- rjmp dwa_czuj
- rjmp jeden_czuj
- dwa_czuj:
- lds tmp1, dtemp
- inc tmp1
- jeden_czuj:
- sts dtemp, tmp1
- sbrs tmp1, 0
- rjmp odcz1
- ldi X, temperatura2
- lds tmp, minusik2
- ldi tmp1, 2
- rjmp kon_odcz
- odcz1:
- ldi X, temperatura1
- lds tmp, minusik1
- ldi tmp1, NIC
- sbrc ile_czuj, 1
- ldi tmp1, 1
- kon_odcz:
- sts minusik, tmp
- sts w+5, tmp1
- ld ARG, X+ ;stopnie
- ld tmp, X ;dziesiate
- ldi X, w
- ldi tmp1, NIC
- cpi ARG, 10
- brlo mniej_10
- rcall dz
- rjmp wiecej_10
- mniej_10:
- st X+, ARG
- sts w+4, tmp1
- wiecej_10:
- st X+, tmp
- ldi tmp, STOPIEN
- st X+, tmp
- ldi tmp, C
- st X, tmp
- sts w+6, tmp1
- rcall _1wire_init ;odczyt i konwersja
- ldi ARG, 0x55
- rcall _1wire_write
- rcall wyslij_adr
- ldi ARG, 0x44
- rcall _1wire_write
- sbi _1WPORT, _1WL ;zasilanie 'parasite'
- sbi _1WDDR, _1WL
- sei
- ldi ARG, 255
- rcall _delay_ms
- ldi ARG, 255
- rcall _delay_ms
- ldi ARG, 255
- rcall _delay_ms
- cbi _1WPORT, _1WL
- cbi _1WDDR, _1WL
- rcall _1wire_init
- ldi ARG, 0x55
- rcall _1wire_write
- rcall wyslij_adr
- ldi ARG, 0xBE
- rcall _1wire_write
- sei
- rcall _1wire_read
- push ARG
- rcall _1wire_read
- mov tmp1, ARG ;test na minus
- andi tmp1, 8
- lds tmp, dtemp
- sbrs tmp, 0
- sts minusik1, tmp1
- sbrc tmp, 0
- sts minusik2, tmp1
- pop tmp
- breq nieujemna
- com ARG
- neg tmp
- nieujemna:
- mov tmp1, tmp ;stopnie beda w ARG
- andi tmp1, 0xf0
- or ARG, tmp1
- swap ARG
- andi tmp, 0x0f ;dziesiate beda w tmp
- add tmp, tmp
- mov tmp1, tmp
- add tmp, tmp
- add tmp, tmp
- add tmp, tmp1
- swap tmp
- andi tmp, 0x0f
- lds tmp1, dtemp
- sbrs tmp1, 0
- ldi X, temperatura1
- sbrc tmp1, 0
- ldi X, temperatura2
- st X+, ARG
- st X, tmp
- ret
- odcz_czas:
- ldi ARGH, 7 ;odczytaj
- ldi X, czas
- ldi ARG, 0
- rcall i2cReceive
- ldi tmp1, 7
- ldi X, czas
- odcz_petla: ;bcd2bin
- ld ARG, X
- rcall bcd2bin
- st X+, ARG
- dec tmp1
- brne odcz_petla
- lds ARG, godz ;wyswietl
- sbrc stan, 0
- lds ARG, dzienm
- ldi X, w
- cli
- rcall dz
- ldi ARG, NIC
- st X+, ARG
- lds ARG, min
- sbrc stan, 0
- lds ARG, mies
- rcall dz
- lds ARG, sek
- sbrc stan, 0
- lds ARG, rok
- rcall dz
- ;ustaw jasnosc wyswietlacza w zalezn. od godziny
- lds tmp, godz
- ldi X, pocz_dnia ;pocz dnia
- ld tmp1, X+
- cp tmp, tmp1
- brlo noc
- ld tmp1, X ;pocz nocy
- cp tmp, tmp1
- brsh noc
- lds jasnosc, jasn_dzien
- ret
- noc:
- lds jasnosc, jasn_noc
- ret
- wyslij:
- clr wysl_i
- petla_wys:
- sbrs LSB, 0
- rjmp wlacz
- cbi PORT595, DIN
- rjmp zeg
- wlacz:
- sbi PORT595, DIN
- zeg:
- sbi PORT595, CLK
- cbi PORT595, CLK
- lsr16 LSB, MSB
- inc wysl_i
- sbrs wysl_i, log2(16)
- rjmp petla_wys
- sbi PORT595, LOAD
- cbi PORT595, LOAD
- ret
- _delay_ms:
- delay_pet:
- ldi ARGD, 255
- rcall _delay_us
- ldi ARGD, 255
- rcall _delay_us
- ldi ARGD, 255
- rcall _delay_us
- ldi ARGD, 255
- rcall _delay_us
- dec ARG
- brne delay_pet
- ret
- _delay_us:
- cpi ARGD, 0
- brne cz
- ldi ARGD, 60
- cz:
- nop
- nop
- nop
- nop
- nop
- dec ARGD
- brne cz
- ret
- divmod:
- clr ARGH
- div_petla:
- cpi ARGL, 10
- brlo div_koniec
- inc ARGH
- subi ARGL, 10
- rjmp div_petla
- div_koniec:
- ret
- bcd2bin:
- mov tmp, ARG
- andi tmp, 0x0f
- swap ARG
- andi ARG, 0x0f
- add ARG, ARG
- add tmp, ARG
- add ARG, ARG
- add ARG, ARG
- add ARG, tmp
- ret
- bin2bcd:
- rcall divmod
- swap ARGH
- andi ARGH, 0xf0
- add ARG, ARGH
- ret
- .equ SDAPIN =PINB
- .equ SCLDDR =DDRB
- .equ SDADDR =DDRB
- .equ SCL =PB7
- .equ SDA =PB5
- scl_toggle:
- rcall _delay_us
- cbi SCLDDR, SCL
- rcall _delay_us
- sbi SCLDDR, SCL
- rcall _delay_us
- ret
- istart:
- rcall _delay_us
- sbi SDADDR, SDA
- rcall _delay_us
- sbi SCLDDR, SCL
- rcall _delay_us
- ret
- istop:
- rcall _delay_us
- cbi SCLDDR, SCL
- rcall _delay_us
- cbi SDADDR, SDA
- rcall _delay_us
- ret
- i2cPutbyte:
- ldi tmp, 8
- _putbyte_petla:
- sbrs ARG, 7
- rjmp _putbyte_lo
- cbi SDADDR, SDA
- rjmp _putbyte_d
- _putbyte_lo:
- sbi SDADDR, SDA
- _putbyte_d:
- rcall scl_toggle
- lsl ARG
- dec tmp
- brne _putbyte_petla
- cbi SDADDR, SDA
- rcall scl_toggle
- sbi SDADDR, SDA
- ret
- i2cGetbyte:
- mov tmp1, ARG
- cbi SDADDR, SDA
- clr ARG
- ldi tmp, 8
- _getbyte_petla:
- lsl ARG
- rcall _delay_us
- cbi SCLDDR, SCL
- sbic SDAPIN, SDA
- ori ARG, 1
- rcall _delay_us
- sbi SCLDDR, SCL
- dec tmp
- brne _getbyte_petla
- cpi tmp1, 0
- breq _getbyte_n
- sbi SDADDR, SDA
- _getbyte_n:
- rcall scl_toggle
- sbi SDADDR, SDA
- ret
- i2cSend: ;ARG - poczatek, ARGH - dlugosc, X - adres
- rcall istart
- push ARG
- ldi ARG, 0b11010000
- rcall i2cPutbyte
- pop ARG
- rcall i2cPutbyte
- _send_petla:
- ld ARG, X+
- rcall i2cPutbyte
- dec ARGH
- brne _send_petla
- sbi SDADDR, SDA
- rcall istop
- ret
- i2cReceive: ;ARG - poczatek, ARGH - dlugosc, X - adres
- rcall istart
- push ARG
- ldi ARG, 0b11010000
- rcall i2cPutbyte
- pop ARG
- rcall i2cPutbyte
- cbi SDADDR, SDA
- cbi SCLDDR, SCL
- rcall istart
- ldi ARG, 0b11010001
- rcall i2cPutbyte
- _receive_petla:
- mov ARG, ARGH
- rcall i2cGetbyte
- st X+, ARG
- dec ARGH
- brne _receive_petla
- stop:
- rcall istart
- rcall istop
- sbis SDAPIN, SDA
- rjmp stop
- ret
- dz: ; X - adres
- rcall divmod
- cpi ARGH, 10
- brlo dz_dalej
- ldi ARGH, 10
- dz_dalej:
- st X+, ARGH
- st X+, ARGL
- ret
- _1wire_init:
- cli
- sbi _1WDDR, _1WL
- ldi ARG, 1
- rcall _delay_ms
- cbi _1WDDR, _1WL
- rcall _delay_us
- sei
- ldi ARG, 1
- rcall _delay_ms
- ret
- _1wire_write:
- ldi tmp, 8
- _write_petla:
- rcall write_slot
- dec tmp
- breq _write_koniec
- sei
- lsr ARG
- rjmp _write_petla
- _write_koniec:
- ret
- _1wire_read:
- clr ARG
- ldi tmp, 1
- _read_petla:
- rcall read_slot
- sbrc ARGH, 0
- or ARG, tmp
- lsl tmp
- brne _read_petla
- ret
- read_slot: ;wejscie: lsb rej. ARGH
- cli
- sbi _1WDDR, _1WL
- ldi ARGD, 1
- rcall _delay_us
- cbi _1WDDR, _1WL
- ldi ARGD, 14
- rcall _delay_us
- andi ARGH, 0b11111110
- sbic _1WPIN, _1WL
- ori ARGH, 0b00000001
- sei
- rcall _delay_us
- ret
- write_slot: ;wyjscie: lsb rej. ARG
- cli
- sbi _1WDDR, _1WL
- ldi ARGD, 1
- rcall _delay_us
- sbrc ARG, 0
- cbi _1WDDR, _1WL
- rcall _delay_us
- cbi _1WDDR, _1WL
- ret
- search_rom:
- clr ile_czuj
- clr powtorz
- clr ostatni
- ldi X, rom
- gl_petla:
- rcall _1wire_init
- ldi ARG, 0xF0
- rcall _1wire_write
- clr ostatni_zero
- clr licznik
- search_petla:
- rcall read_slot
- bst ARGH, 0
- rcall read_slot
- brtc nie_blad
- sbrs ARGH, 0
- rjmp nie_blad
- blad:
- clr ile_czuj
- ret
- nie_blad:
- brts search_wyslij
- sbrc ARGH, 0
- rjmp search_wyslij
- cp powtorz, licznik
- breq rowne
- brlo wieksze
- bst ostatni, 0
- rjmp dalej
- rowne:
- set
- rjmp dalej
- wieksze:
- clt
- dalej:
- brts search_wyslij
- mov ostatni_zero, licznik
- search_wyslij:
- bld ostatni, 0
- mov ARG, ostatni
- rcall write_slot
- lsr ARG
- ror dana
- mov tmp, licznik
- andi tmp, 0b111
- inc tmp
- sbrc tmp, 3
- st X+, dana
- inc licznik
- sbrs licznik, 6
- rjmp search_petla
- inc ile_czuj
- mov powtorz, ostatni_zero
- and powtorz, powtorz
- breq koniec
- sbrc ile_czuj, 1
- koniec:
- ret
- rjmp gl_petla
- siatka: .dw 0x100, 0x80, 0x40, 0x200, 0x20, 0x10, 0x400
- cyfra: .dw zero, jeden, dwa, trzy, cztery, piec, szesc, siedem, osiem, dziewiec, SEG_SR, 0, litstopien, litc, litj, litd, litp, litn