; Analyzator baterii - akumulatoru ; Meri kapacitu v Ah, energii ve Wh a cas vybijeni v hodinach (0.00 - 999h) ; Vybijeci proud 0,01 - 2,56 A, koncove napeti 0,8 - 20 V ; ATmega8A / 8 / 8L ; 8 MHz interni RC, casovani krystal 32 768 Hz ; DANYK 28. IV. 2014 ; http://danyk.cz/avr_aku.html ; -------------------------------------------------- .NOLIST .INCLUDE "m8def.inc" .LIST .DEF VYB=R3 ;bit 0 udava, zda je spusteno vybijeni .DEF SOUCETL=R4 .DEF SOUCETH=R5 .DEF NAPETIL=R6 .DEF NAPETIH=R7 .DEF BLIK=R8 .DEF CIF1=R9 .DEF CIF2=R10 .DEF CIF3=R11 .DEF CIF4=R12 .DEF CIF5=R13 .DEF CIF6=R14 .DEF CIF7=R15 .DEF PREVOD1=R16 .DEF PREVOD2=R17 .DEF PREVOD3=R18 .DEF PRUMREG=R19 .DEF MULTREG=R20 .DEF MODREG=R21 .DEF ROZREG=R22 .DEF DELIC_SEK=R23 .DEF KONCOVEL=R24 .DEF KONCOVEH=R25 .DEF REG=R26 .DEF REG2=R27 .DEF STOPKYL=R28 .DEF STOPKYH=R29 .EQU SMER=DDRD .EQU PORT=PORTD .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU VSTUPY=PINC .EQU SMER3=DDRB .EQU PORT3=PORTB .EQU STAV_TLAC=0x0060 ;stav tlačítek - pamatuje si předchozí stav .EQU PRODL_TLAC=0x0061 ;prodleva tlacitek od dalsi reakce .EQU DOBA_TLAC=0x0062 ;meri dobu stisku tlacitka .EQU ENERG1=0x0063 .EQU ENERG2=0x0064 .EQU ENERG3=0x0065 .EQU ENERG_S1=0x0066 .EQU ENERG_S2=0x0067 .EQU ENERG_S3=0x0068 .EQU ENERG_S4=0x0069 .EQU ENERG_S5=0x006A .EQU KAPAC_S1=0x006B .EQU KAPAC_S2=0x006C .EQU KAPAC_S3=0x006D .EQU KAPAC_S4=0x006E .EQU KAPAC1=0x006F .EQU KAPAC2=0x0070 .EQU KAPAC3=0x0071 .EQU ZB1=0x0072 .EQU ZB2=0x0073 .EQU ZB3=0x0074 .EQU ZB4=0x0075 .EQU ZB5=0x0076 .CSEG .ORG 0 RJMP START ; vektory preruseni .ORG OC2addr ;casovani - 1x za sekundu RJMP SEKUNDY .ORG OVF0addr ;preruseni citacem, ridici multiplex, tlacitka, ... RJMP CASOVANI .ORG ADCCaddr ;preruseni pri dokonceni AD konverze RJMP HOTOVO START: ;nastaví port D LDI REG,0b11111111 OUT SMER,REG LDI REG,0b11111111 OUT PORT,REG ;nastaví port C LDI REG,0b100000 OUT SMER2,REG LDI REG,0b111110 OUT PORT2,REG ;nastaví port B LDI REG,0b111110 OUT SMER3,REG LDI REG,0b000001 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 MODREG,1 ;prednastavi registr modu CLR ROZREG ;rozsah LDI DELIC_SEK,36 ;delic sekundovych pulzu CLR PRUMREG ;prumerovani - pocita vzorky pri prevzorkovani CLR VYB ;bit 0 = zapnuti vybijeni CLR PREVOD1 CLR PREVOD2 CLR PREVOD3 CLR STOPKYL CLR STOPKYH CLR NAPETIL CLR NAPETIH LDI KONCOVEL,LOW(100) LDI KONCOVEH,HIGH(100) CLR REG STS ENERG1,REG STS ENERG2,REG STS ENERG3,REG STS KAPAC1,REG STS KAPAC2,REG STS KAPAC3,REG STS ENERG_S1,REG STS ENERG_S2,REG STS ENERG_S3,REG STS ENERG_S4,REG STS ENERG_S5,REG STS KAPAC_S1,REG STS KAPAC_S2,REG STS KAPAC_S3,REG STS KAPAC_S4,REG ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00000100 ; preddeli 256 OUT TCCR0,REG ; LDI REG,0b00001001 ; 8-bit, preddeli 1 OUT TCCR1B,REG ; LDI REG,0 ; OUT OCR1AH,REG ; LDI REG,0 ; OUT OCR1AL,REG ; LDI REG,0b00000000 ; zakaze preruseni citacema OUT TIMSK,REG ; LDI REG,0b00001000 ; asynchronni provoz OUT ASSR,REG ; LDI REG,0b00001111 ; CTC, preddeli 1024 OUT TCCR2,REG ; LDI REG,31 ; nastavi porovnavanou hodnotu (dělí se n+1) OUT OCR2,REG ; CEKEJ_ASSR: IN REG,ASSR CPI REG,0b00001000 BRNE CEKEJ_ASSR LDI REG,0b11000000 ; vymaze flagy citace 2 OUT TIFR,REG ; LDI REG,0b10000001 ; povoli preruseni OCIE2 a TOIE0 OUT TIMSK,REG ; ;NASTAVENI ADC a MCU LDI REG,0b01000000 ; ref. AVCC, zarovna vpravo, zvoli vstup ADC0 OUT ADMUX,REG ; LDI REG,0b10000000 ;povoli uspani (sleep) a nastavi mod IDLE OUT MCUCR,REG ; ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;hlavni smycka SMYCKA: CLI LDI REG,0b00000000 ; zakaze ADC OUT ADCSRA,REG ; SEI SLEEP RJMP SMYCKA ZMERIT: ;vstupem do sleep modu se aktivuje ADC konverze LDI REG,0b10001110 ; povoleno ADC, jednorazove, prerus. povoleno, OUT ADCSRA,REG ; deleni 64 (z 8MHz na 125kHz) SEI SLEEP RET SEKUNDY: MOVW NAPETIL,SOUCETL CP KONCOVEL,NAPETIL CPC KONCOVEH,NAPETIH BRLO NEUKONCUJ CLR VYB NEUKONCUJ: SBRC VYB,0 RCALL PRIPOCTI LDI PRUMREG,64 CLR SOUCETH CLR SOUCETL RETI CASOVANI: ;casovani LDI REG,178 OUT TCNT0,REG DEC MULTREG BRNE MULTHOP LDI MULTREG,4 RCALL TLACITKA LDI REG,0b00000001 ; vyp SBRC VYB,0 LDI REG,0b10000001 ; OC1A rychle PWM, neinvertujici OUT TCCR1A,REG ; SBRC VYB,0 CBI PORT2,5 SBRS VYB,0 SBI PORT2,5 INC BLIK BRNE BLIK_NE_0 LDI REG,128 MOV BLIK,REG BLIK_NE_0: MULTHOP: RCALL MULT CLR REG CPSE PRUMREG,REG RCALL ZMERIT RETI HOTOVO: ;preruseni pri dokonceni AD konverze CPI PRUMREG,0 BREQ HOTOHOP IN REG,ADCL IN REG2,ADCH ADD SOUCETL,REG ADC SOUCETH,REG2 DEC PRUMREG BRNE HOTOHOP LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL LSR SOUCETH ROR SOUCETL HOTOHOP: RETI PRIPOCTI: ;posouva casomiru DEC DELIC_SEK BRNE DEL_S_HOP LDI DELIC_SEK,36 ADIW STOPKYL,1 BRNE DEL_S_HOP SER STOPKYL SER STOPKYH DEL_S_HOP: ;ulozi cifry, aby mohl registry docasne zneuzit pro vypocty PUSH CIF1 PUSH CIF2 PUSH CIF3 PUSH CIF4 PUSH CIF5 ; --------- KAPACITA ------------- ;nacte surovou kapacitu do docasnych registru LDS CIF1,KAPAC_S1 LDS CIF2,KAPAC_S2 LDS CIF3,KAPAC_S3 LDS CIF4,KAPAC_S4 ;zjisti proud a pripocte k surove kapacite IN REG,OCR1AL IN REG2,OCR1AH ADIW REG,1 ;proud je n+1 ADD CIF1,REG ADC CIF2,REG2 CLR REG ADC CIF3,REG ADC CIF4,REG BRCC NEPRETEKLO SER REG MOV CIF1,REG MOV CIF2,REG MOV CIF3,REG MOV CIF4,REG NEPRETEKLO: ;ulozi surovou kapacitu z registru do ram STS KAPAC_S1,CIF1 STS KAPAC_S2,CIF2 STS KAPAC_S3,CIF3 STS KAPAC_S4,CIF4 ; ---- deleni 32-bit (CIF4:1) / 16-bit (konst) = 32-bit (CIF4:1) ---- LDI REG,33 ;Nastavi pocet bitu delence (n+1) do R0 MOV R0,REG CLC CLR REG ;REG je docasny registr STS ZB1,REG ;Vynuluje zbytek STS ZB2,REG STS ZB3,REG STS ZB4,REG SMYCKA_DELENI: ROL CIF1 ;Posune vysledek doleva ROL CIF2 ; ROL CIF3 ; ROL CIF4 ; DEC R0 ;Dekrementuje pocitadlo bitu BRNE JESTE_NE ;Pokud jsou vsechny bity hotove, konci RJMP DELENI_HOTOVO JESTE_NE: LDS REG,ZB1 ROL REG ;Posune zbytek doleva STS ZB1,REG LDS REG,ZB2 ROL REG STS ZB2,REG LDS REG,ZB3 ROL REG STS ZB3,REG LDS REG,ZB4 ROL REG STS ZB4,REG LDS REG,ZB1 ;Odecte delitel od zbytku SUBI REG,LOW(360) STS ZB1,REG LDS REG,ZB2 SBCI REG,HIGH(360) STS ZB2,REG LDS REG,ZB3 SBCI REG,0 STS ZB3,REG LDS REG,ZB4 SBCI REG,0 STS ZB4,REG BRCC SKOK_DELENI ;Pokud je vysledek zaporny LDS REG,ZB1 ;Vrati odecitani LDI REG2,LOW(360) ADD REG,REG2 STS ZB1,REG LDS REG,ZB2 LDI REG2,HIGH(360) ADC REG,REG2 STS ZB2,REG CLR REG2 LDS REG,ZB3 ADC REG,REG2 STS ZB3,REG LDS REG,ZB4 ADC REG,REG2 STS ZB4,REG CLC ;Vynuluje C RJMP SMYCKA_DELENI ;Znovu smycka SKOK_DELENI: SEC ;Nastavi C RJMP SMYCKA_DELENI ;Znovu smycka DELENI_HOTOVO: STS KAPAC1,CIF1 STS KAPAC2,CIF2 STS KAPAC3,CIF3 ; --------- ENERGIE ------------- ;nacte surovou energii do CIF5:1 LDS CIF1,ENERG_S1 LDS CIF2,ENERG_S2 LDS CIF3,ENERG_S3 LDS CIF4,ENERG_S4 LDS CIF5,ENERG_S5 ;do REG2:REG nacte proud IN REG,OCR1AL IN REG2,OCR1AH ADIW REG,1 ;proud je n+1 ;nasobi proud x napeti a pricita do registru surove energie MUL NAPETIL,REG ADD CIF1,R0 ADC CIF2,R1 CLR R0 ADC CIF3,R0 ADC CIF4,R0 ADC CIF5,R0 BRCS PRETEKLO2 MUL NAPETIH,REG ADD CIF2,R0 ADC CIF3,R1 CLR R0 ADC CIF4,R0 ADC CIF5,R0 BRCS PRETEKLO2 MUL NAPETIL,REG2 ADD CIF2,R0 ADC CIF3,R1 CLR R0 ADC CIF4,R0 ADC CIF5,R0 BRCS PRETEKLO2 MUL NAPETIH,REG2 ADD CIF3,R0 ADC CIF4,R1 CLR R0 ADC CIF5,R0 BRCS PRETEKLO2 RJMP NEPRETEKLO2 PRETEKLO2: SER REG MOV CIF1,REG MOV CIF2,REG MOV CIF3,REG MOV CIF4,REG MOV CIF5,REG NEPRETEKLO2: STS ENERG_S1,CIF1 STS ENERG_S2,CIF2 STS ENERG_S3,CIF3 STS ENERG_S4,CIF4 STS ENERG_S5,CIF5 ; ---- deleni 40-bit (CIF5:1) / 16-bit (konst) = 40-bit (CIF5:1) ---- LDI REG,41 ;Nastavi pocet bitu delence (n+1) do R0 MOV R0,REG CLC CLR REG ;REG je docasny registr STS ZB1,REG ;Vynuluje zbytek STS ZB2,REG STS ZB3,REG STS ZB4,REG STS ZB5,REG SMYCKA_DELENI2: ROL CIF1 ;Posune vysledek doleva ROL CIF2 ; ROL CIF3 ; ROL CIF4 ; ROL CIF5 ; DEC R0 ;Dekrementuje pocitadlo bitu BRNE JESTE_NE2 ;Pokud jsou vsechny bity hotove, konci RJMP DELENI2_HOTOVO JESTE_NE2: LDS REG,ZB1 ROL REG ;Posune zbytek doleva STS ZB1,REG LDS REG,ZB2 ROL REG STS ZB2,REG LDS REG,ZB3 ROL REG STS ZB3,REG LDS REG,ZB4 ROL REG STS ZB4,REG LDS REG,ZB5 ROL REG STS ZB5,REG LDS REG,ZB1 ;Odecte delitel od zbytku SUBI REG,LOW(36000) STS ZB1,REG LDS REG,ZB2 SBCI REG,HIGH(36000) STS ZB2,REG LDS REG,ZB3 SBCI REG,0 STS ZB3,REG LDS REG,ZB4 SBCI REG,0 STS ZB4,REG LDS REG,ZB5 SBCI REG,0 STS ZB5,REG BRCC SKOK_DELENI2 ;Pokud je vysledek zaporny LDS REG,ZB1 ;Vrati odecitani LDI REG2,LOW(36000) ADD REG,REG2 STS ZB1,REG LDS REG,ZB2 LDI REG2,HIGH(36000) ADC REG,REG2 STS ZB2,REG CLR REG2 LDS REG,ZB3 ADC REG,REG2 STS ZB3,REG LDS REG,ZB4 ADC REG,REG2 STS ZB4,REG LDS REG,ZB5 ADC REG,REG2 STS ZB5,REG CLC ;Vynuluje C RJMP SMYCKA_DELENI2 ;Znovu smycka SKOK_DELENI2: SEC ;Nastavi C RJMP SMYCKA_DELENI2 ;Znovu smycka DELENI2_HOTOVO: ;kontrola zda se vysledek vleze do 24 bitu, pokud ne, nastavi na same 1ky CLR REG CP CIF4,REG CPC CIF5,REG BREQ ENERG_NEPRETEK SER REG MOV CIF1,REG MOV CIF2,REG MOV CIF3,REG ENERG_NEPRETEK: ;uloui energii do ram STS ENERG1,CIF1 STS ENERG2,CIF2 STS ENERG3,CIF3 ;vrati do cifer puvodni hodnoty POP CIF5 POP CIF4 POP CIF3 POP CIF2 POP CIF1 RET PREVOD_3: CPI PREVOD1,BYTE1(1000) LDI REG,BYTE2(1000) CPC PREVOD2,REG LDI REG,BYTE3(1000) CPC PREVOD3,REG BRLO PREVOD RJMP NAD PREVOD_4: CPI PREVOD1,BYTE1(10000) LDI REG,BYTE2(10000) CPC PREVOD2,REG LDI REG,BYTE3(10000) CPC PREVOD3,REG BRLO PREVOD RJMP NAD PREVOD_5: CPI PREVOD1,BYTE1(65535) LDI REG,BYTE2(65535) CPC PREVOD2,REG LDI REG,BYTE3(65535) CPC PREVOD3,REG BRLO PREVOD RJMP NAD PREVOD_7: CPI PREVOD1,BYTE1(9999999) LDI REG,BYTE2(9999999) CPC PREVOD2,REG LDI REG,BYTE3(9999999) CPC PREVOD3,REG BRLO PREVOD RJMP NAD PREVOD: CLR CIF1 CLR CIF2 CLR CIF3 CLR CIF4 CLR CIF5 CLR CIF6 CLR CIF7 CLR ROZREG ZNOVU_7: CPI PREVOD1,BYTE1(1000000) ;24-bitova podminka mensi nez 1 000 000 LDI REG,BYTE2(1000000) CPC PREVOD2,REG LDI REG,BYTE3(1000000) CPC PREVOD3,REG BRLO MENSI_7 SUBI PREVOD1,BYTE1(1000000) ;24-bitove odcitani cisla 1000 000 od vysledku SBCI PREVOD2,BYTE2(1000000) SBCI PREVOD3,BYTE3(1000000) INC CIF7 RJMP ZNOVU_7 MENSI_7: ZNOVU_6: CPI PREVOD1,BYTE1(100000) ;24-bitova podminka mensi nez 100 000 LDI REG,BYTE2(100000) CPC PREVOD2,REG LDI REG,BYTE3(100000) CPC PREVOD3,REG BRLO MENSI_6 SUBI PREVOD1,BYTE1(100000) ;24-bitove odcitani cisla 100 000 od vysledku SBCI PREVOD2,BYTE2(100000) SBCI PREVOD3,BYTE3(100000) INC CIF6 RJMP ZNOVU_6 MENSI_6: ZNOVU_5: CPI PREVOD1,BYTE1(10000) ;24-bitova podminka mensi nez 10 000 LDI REG,BYTE2(10000) CPC PREVOD2,REG LDI REG,BYTE3(10000) CPC PREVOD3,REG BRLO MENSI_5 SUBI PREVOD1,BYTE1(10000) ;24-bitove odcitani cisla 10 000 od vysledku SBCI PREVOD2,BYTE2(10000) SBCI PREVOD3,BYTE3(10000) INC CIF5 RJMP ZNOVU_5 MENSI_5: ZNOVU1000: CPI PREVOD1,LOW(1000) LDI REG,HIGH(1000) CPC PREVOD2,REG ;16-bitova podminka mensi nez 1000 BRLO POD1000 SUBI PREVOD1,LOW(1000) ;16-bitove odcitani čísla 1000 od vysledku SBCI PREVOD2,HIGH(1000) INC CIF4 RJMP ZNOVU1000 POD1000: ZNOVU100: CPI PREVOD1,LOW(100) LDI REG,HIGH(100) CPC PREVOD2,REG ;16-bitova podminka mensi nez 100 BRLO POD100 SUBI PREVOD1,LOW(100) ;16-bitove odcitani čísla 100 od vysledku SBCI PREVOD2,HIGH(100) INC CIF3 RJMP ZNOVU100 POD100: ZNOVU10: CPI PREVOD1,10 ;8-bitova podminka mensi nez 10 BRLO POD10 SUBI PREVOD1,10 ;8-bitove odcitani čísla 10 od vysledku INC CIF2 RJMP ZNOVU10 POD10: MOV CIF1,PREVOD1 POSUN_ZNOVU: CLR REG CP CIF5,REG CPC CIF6,REG CPC CIF7,REG BRNE POSUN CPI MODREG,5 BREQ POSUN_KONEC CPI MODREG,6 BREQ POSUN_KONEC CP CIF4,REG BREQ POSUN_KONEC POSUN: MOV CIF1,CIF2 MOV CIF2,CIF3 MOV CIF3,CIF4 MOV CIF4,CIF5 MOV CIF5,CIF6 MOV CIF6,CIF7 CLR CIF7 INC ROZREG RJMP POSUN_ZNOVU POSUN_KONEC: RET NAD: ;co kdyz je vysledek nad rozsahem LDI REG,10 MOV CIF1,REG ;nastaveni cifer na 10 zobrazi "-" MOV CIF2,REG MOV CIF3,REG MOV CIF4,REG CLR CIF5 CLR CIF6 CLR CIF7 SER ROZREG RET MULT: ;multiplex LDI REG,0b000001 OUT PORT3,REG LDI ZL,LOW(MULT_SKOK) ;vetveni, ktera cifra se rozsviti LDI ZH,HIGH(MULT_SKOK) MOV REG,MODREG LSL REG LSL REG ADD REG,MULTREG SUBI REG,5 ADD ZL,REG CLR REG ADC ZH,REG IJMP MULT_SKOK: RJMP MULT_A1 RJMP MULT_A2 RJMP MULT_A3 RJMP MULT_A4 RJMP MULT_B1 RJMP MULT_B2 RJMP MULT_B3 RJMP MULT_B4 RJMP MULT_C1 RJMP MULT_C2 RJMP MULT_C3 RJMP MULT_C4 RJMP MULT_D1 RJMP MULT_D2 RJMP MULT_D3 RJMP MULT_D4 RJMP MULT_E1 RJMP MULT_E2 RJMP MULT_E3 RJMP MULT_E4 RJMP MULT_F1 RJMP MULT_F2 RJMP MULT_F3 RJMP MULT_F4 ;Mod A - Zobrazeni aktualniho napeti (x.xx - xx.x V) MULT_A1: LDI REG,0b11000001 OUT PORT,REG SBI PORT3,2 RET MULT_A2: MOV REG,CIF1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,3 RET MULT_A3: MOV REG,CIF2 RCALL ZOBRAZ CPI ROZREG,1 BRNE TECKA_A3_NE ANDI REG,0b01111111 TECKA_A3_NE: OUT PORT,REG SBI PORT3,4 RET MULT_A4: MOV REG,CIF3 RCALL ZOBRAZ CPI ROZREG,0 BRNE TECKA_A4_NE ANDI REG,0b01111111 TECKA_A4_NE: OUT PORT,REG SBI PORT3,5 CLR PREVOD3 MOVW PREVOD1,NAPETIL RCALL PREVOD_4 RET ;Mod B - Zobrazeni koncoveho napeti (x.xx - xx.x V) MULT_B1: SER REG SBRC BLIK,4 LDI REG,0b11000001 OUT PORT,REG SBI PORT3,2 RET MULT_B2: MOV REG,CIF1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,3 RET MULT_B3: MOV REG,CIF2 RCALL ZOBRAZ CPI ROZREG,1 BRNE TECKA_B3_NE ANDI REG,0b01111111 TECKA_B3_NE: OUT PORT,REG SBI PORT3,4 RET MULT_B4: MOV REG,CIF3 RCALL ZOBRAZ CPI ROZREG,0 BRNE TECKA_B4_NE ANDI REG,0b01111111 TECKA_B4_NE: OUT PORT,REG SBI PORT3,5 CLR PREVOD3 MOVW PREVOD1,KONCOVEL RCALL PREVOD_4 RET ;Mod C - Zobrazeni vybijeciho proudu (x.xx A) MULT_C1: SER REG SBRC BLIK,4 LDI REG,0b10001000 OUT PORT,REG SBI PORT3,2 RET MULT_C2: MOV REG,CIF1 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,3 RET MULT_C3: MOV REG,CIF2 RCALL ZOBRAZ OUT PORT,REG SBI PORT3,4 RET MULT_C4: MOV REG,CIF3 RCALL ZOBRAZ ANDI REG,0b01111111 OUT PORT,REG SBI PORT3,5 IN REG,OCR1AL IN REG2,OCR1AH ADIW REG,1 CLR PREVOD3 MOVW PREVOD1,REG RCALL PREVOD_3 RET ;Mod D - Zobrazeni casu vybijeni (x.xx - xxx H) MULT_D1: LDI REG,0b10001011 OUT PORT,REG SBI PORT3,2 RET MULT_D2: MOV REG,CIF1 RCALL ZOBRAZ CPI ROZREG,2 BRNE TECKA_D2_NE ANDI REG,0b01111111 TECKA_D2_NE: OUT PORT,REG SBI PORT3,3 RET MULT_D3: MOV REG,CIF2 RCALL ZOBRAZ CPI ROZREG,1 BRNE TECKA_D3_NE ANDI REG,0b01111111 TECKA_D3_NE: OUT PORT,REG SBI PORT3,4 RET MULT_D4: MOV REG,CIF3 RCALL ZOBRAZ CPI ROZREG,0 BRNE TECKA_D4_NE ANDI REG,0b01111111 TECKA_D4_NE: OUT PORT,REG SBI PORT3,5 CLR PREVOD3 MOVW PREVOD1,STOPKYL RCALL PREVOD_5 RET ;Mod E - Zobrazeni kapacity (x.xxx - xxxx Ah) MULT_E1: MOV REG,CIF1 RCALL ZOBRAZ CPI ROZREG,3 BRNE TECKA_E1_NE ANDI REG,0b01111111 TECKA_E1_NE: SBRS BLIK,7 SER REG OUT PORT,REG SBI PORT3,2 RET MULT_E2: MOV REG,CIF2 RCALL ZOBRAZ CPI ROZREG,2 BRNE TECKA_E2_NE ANDI REG,0b01111111 TECKA_E2_NE: SBRS BLIK,7 LDI REG,0b10001011 OUT PORT,REG SBI PORT3,3 RET MULT_E3: MOV REG,CIF3 RCALL ZOBRAZ CPI ROZREG,1 BRNE TECKA_E3_NE ANDI REG,0b01111111 TECKA_E3_NE: SBRS BLIK,7 LDI REG,0b10001000 OUT PORT,REG SBI PORT3,4 RET MULT_E4: MOV REG,CIF4 RCALL ZOBRAZ CPI ROZREG,0 BRNE TECKA_E4_NE ANDI REG,0b01111111 TECKA_E4_NE: SBRS BLIK,7 SER REG OUT PORT,REG SBI PORT3,5 LDS PREVOD1,KAPAC1 LDS PREVOD2,KAPAC2 LDS PREVOD3,KAPAC3 RCALL PREVOD_7 RET ;Mod F - Zobrazeni energie (x.xxx - xxxx Wh) MULT_F1: MOV REG,CIF1 RCALL ZOBRAZ CPI ROZREG,3 BRNE TECKA_F1_NE SBRC BLIK,4 ANDI REG,0b01111111 TECKA_F1_NE: SBRS BLIK,7 SER REG OUT PORT,REG SBI PORT3,2 RET MULT_F2: MOV REG,CIF2 RCALL ZOBRAZ CPI ROZREG,2 BRNE TECKA_F2_NE SBRC BLIK,4 ANDI REG,0b01111111 TECKA_F2_NE: SBRS BLIK,7 LDI REG,0b10101011 OUT PORT,REG SBI PORT3,3 RET MULT_F3: MOV REG,CIF3 RCALL ZOBRAZ CPI ROZREG,1 BRNE TECKA_F3_NE SBRC BLIK,4 ANDI REG,0b01111111 TECKA_F3_NE: SBRS BLIK,7 LDI REG,0b10000110 OUT PORT,REG SBI PORT3,4 RET MULT_F4: MOV REG,CIF4 RCALL ZOBRAZ CPI ROZREG,0 BRNE TECKA_F4_NE SBRC BLIK,4 ANDI REG,0b01111111 TECKA_F4_NE: SBRS BLIK,7 SER REG OUT PORT,REG SBI PORT3,5 LDS PREVOD1,ENERG1 LDS PREVOD2,ENERG2 LDS PREVOD3,ENERG3 RCALL PREVOD_7 RET TLACITKA: ;Zjištění stavu tlačítek. f je 100Hz 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,VSTUPY ;Zjistí stav tlačítek ANDI REG,0b00011100 STS STAV_TLAC,REG ;Uloží ho pro příští test CP REG2,REG ;pokud předchozí stav = současný, TL už nereaguje znovu BREQ NEREAGOVAT LDS REG2,PRODL_TLAC ;pokud neuplynula minimální prodleva, nereaguje znovu CPI REG2,0 BRNE NEREAGOVAT SBRS REG,2 RJMP NA_TLAC1 SBRS REG,3 RJMP NA_TLAC2 SBRS REG,4 RJMP NA_TLAC3 RJMP NEREAGOVAT NA_TLAC1: RCALL TLAC1 RJMP BYLO_TLAC NA_TLAC2: RCALL TLAC2 RJMP BYLO_TLAC NA_TLAC3: RCALL TLAC3 BYLO_TLAC: LDS REG,STAV_TLAC NEREAGOVAT: LDI REG2,5 ;určuje prodlevu do další reakce (x 10ms) ;stisknutí/držení tlačítka nastaví prodlevu do další reakce SBRS REG,2 STS PRODL_TLAC,REG2 SBRS REG,3 STS PRODL_TLAC,REG2 SBRS REG,4 STS PRODL_TLAC,REG2 ;tady zacina vyhodnoceni dlouheho stisku CPI REG,0b00011100 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,97 STS DOBA_TLAC,REG2 SBRS REG,2 RJMP NA_TLAC1_D SBRS REG,3 RJMP NA_TLAC2_D SBRS REG,4 RJMP NA_TLAC3_D RJMP NE100 NA_TLAC1_D: RCALL TLAC1 RJMP NE100 NA_TLAC2_D: RCALL TLAC2 RJMP NE100 NA_TLAC3_D: RCALL TLAC3_D NE100: RET ; tlacitko B (+) TLAC2: LDI ZL,LOW(B_SKOK) ;vetveni, ktera cifra se rozsviti LDI ZH,HIGH(B_SKOK) ADD ZL,MODREG CLR REG ADC ZH,REG IJMP B_SKOK: RJMP B_MOD1 RJMP B_MOD1 RJMP B_MOD2 RJMP B_MOD3 RJMP B_MOD4 RJMP B_MOD5 RJMP B_MOD6 B_MOD1: RET B_MOD2: CPI KONCOVEL,LOW(2000) LDI REG,HIGH(2000) CPC KONCOVEH,REG BRSH KONCOVEL_NEZVYS CPI KONCOVEL,LOW(1000) LDI REG,HIGH(1000) CPC KONCOVEH,REG BRLO ZVYS_POMALU ADIW KONCOVEL,5 ZVYS_POMALU: CPI KONCOVEL,LOW(500) LDI REG,HIGH(500) CPC KONCOVEH,REG BRLO ZVYS_POMALU2 ADIW KONCOVEL,4 ZVYS_POMALU2: ADIW KONCOVEL,1 KONCOVEL_NEZVYS: RET B_MOD3: IN REG,OCR1AL IN REG2,OCR1AH INC REG BRNE PROUD_NEZVYS DEC REG PROUD_NEZVYS: CLR REG2 OUT OCR1AH,REG2 OUT OCR1AL,REG RET B_MOD4: RET B_MOD5: RET B_MOD6: RET ; tlacitko A (-) TLAC1: LDI ZL,LOW(A_SKOK) ;vetveni, ktera cifra se rozsviti LDI ZH,HIGH(A_SKOK) ADD ZL,MODREG CLR REG ADC ZH,REG IJMP A_SKOK: RJMP A_MOD1 RJMP A_MOD1 RJMP A_MOD2 RJMP A_MOD3 RJMP A_MOD4 RJMP A_MOD5 RJMP A_MOD6 A_MOD1: RET A_MOD2: CPI KONCOVEL,LOW(81) LDI REG,HIGH(81) CPC KONCOVEH,REG BRLO KONCOVEL_NESNIZ CPI KONCOVEL,LOW(1001) LDI REG,HIGH(1001) CPC KONCOVEH,REG BRLO SNIZ_POMALU SBIW KONCOVEL,5 SNIZ_POMALU: CPI KONCOVEL,LOW(501) LDI REG,HIGH(501) CPC KONCOVEH,REG BRLO SNIZ_POMALU2 SBIW KONCOVEL,4 SNIZ_POMALU2: SBIW KONCOVEL,1 KONCOVEL_NESNIZ: RET A_MOD3: IN REG,OCR1AL IN REG2,OCR1AH DEC REG CPI REG,255 BRNE PROUD_NESNIZ CLR REG PROUD_NESNIZ: CLR REG2 OUT OCR1AH,REG2 OUT OCR1AL,REG RET A_MOD4: A_MOD5: A_MOD6: SBRC VYB,0 RJMP NERESETUJ CLR STOPKYL CLR STOPKYH CLR REG STS ENERG1,REG STS ENERG2,REG STS ENERG3,REG STS KAPAC1,REG STS KAPAC2,REG STS KAPAC3,REG STS ENERG_S1,REG STS ENERG_S2,REG STS ENERG_S3,REG STS ENERG_S4,REG STS ENERG_S5,REG STS KAPAC_S1,REG STS KAPAC_S2,REG STS KAPAC_S3,REG STS KAPAC_S4,REG NERESETUJ: RET ; tlačítko C - mod TLAC3: DEC MODREG ;pamatuje si mód BRNE MODKONEC LDI MODREG,6 MODKONEC: CLR BLIK RET ; tlacitko 3 dlouze TLAC3_D: INC MODREG ;pamatuje si mód CPI MODREG,7 BRLO MODKONEC2 LDI MODREG,1 MODKONEC2: INC VYB LDI REG2,101 STS DOBA_TLAC,REG2 CLR BLIK RET ; Prevod BCD na 7segmentu ZOBRAZ: CPI REG,12 BRLO ZOBRAZ_JE_OK LDI REG,11 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 (1gfedcba) 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,0b11111111 ;Nad, Nic