; Tester transformatoru a indukcnosti (ring tester) s ATtiny24A / 24 / 24V ; int. RC osc. 8MHz, BOD level 2,7V ; low fuse = E2, high fuse = DD, extended fuse = FF, lock fuse = FF ; 22. IX. 2021 ; vytvoril / created: DANYK ; http://danyk.cz/avr_ring.html .NOLIST .INCLUDE "tn24def.inc" .LIST .DEF NULA=R15 ; trvale 0 .DEF REG=R16 ; docasny registr .DEF UDAJ1=R17 ; spodnich 8bitu 16-bitoveho vysledku a pak nizsi cifra .DEF UDAJ2=R18 ; hornich 8bitu 16-bitoveho vysledku a pak vyssi cifra .DEF DELREG=R19 ; registr deleni frekvence .DEF MULTREG=R20 ; registr si pamatuje stav multiplexu .DEF SEGM_A=R21 ; segmenty A obou cifer .DEF SEGM_B=R22 ; segmenty B obou cifer .DEF SEGM_C=R23 ; segmenty C obou cifer .DEF SEGM_D=R24 ; segmenty D obou cifer .DEF SEGM_E=R25 ; segmenty E obou cifer .DEF SEGM_F=R26 ; segmenty F obou cifer .DEF SEGM_G=R27 ; segmenty G obou cifer .DEF PRIPOJ=R28 ; pamatuje si zda je neco pripojeno .EQU SMER=DDRA ; PORTA - 7 katod segmentu, vstup pocitani PA4 .EQU PORT=PORTA .EQU PINY=PINA .EQU SMER2=DDRB ; PORTB - 2 anody cifer, vystup pro MOSFET PB2 .EQU PORT2=PORTB .CSEG .ORG 0 RJMP START ; sem skoci program pri preruseni .ORG OC0Aaddr RJMP CITAC0 START: ;nastavi port LDI REG,0b11101111 ;PA4 vstup, ostatni vystupy OUT SMER,REG LDI REG,0b11101111 ;vystupy log 1, PA4 bez pullup odporu OUT PORT,REG ;nastavi port LDI REG,0b111 ;PB vse vstupy OUT SMER2,REG LDI REG,0b000 ;PB do log 0 OUT PORT2,REG LDI REG,LOW(RAMEND) OUT SPL,REG ; vypne analogovy komparator (setri energii). LDI REG,0b10000000 OUT ACSR,REG ; sleep mod IDLE LDI REG,0b00100000 OUT MCUCR,REG ; vypne ADC a USI (setri energii). LDI REG,0b00000011 OUT PRR,REG ; NASTAVENI CITACU/CASOVACU LDI REG,0b00000010 ; nastavi citac0 na nulovani pri dosazeni porovnavane... OUT TCCR0A,REG ; ...hodnoty (tzv. CTC), OC0 nevyuzit, deleni 64 LDI REG,0b00000011 ; OUT TCCR0B,REG LDI REG,177 ; porovnavana hodnota (deli se n+1) OUT OCR0A,REG ; LDI REG,0b00000010 ; povoli preruseni OUT TIMSK0,REG ; (bit 1 povoli preruseni CTC) LDI REG,0b00000000 ; nastavi citac1 na normalni mod OUT TCCR1A,REG ; LDI REG,0b00000111 ; externi taktovani nabeznou hranou OUT TCCR1B,REG ; vynuluje/prednastavi registry LDI DELREG,1 LDI MULTREG,1 CLR UDAJ1 CLR UDAJ2 CLR NULA CLR PRIPOJ SEI ;povoli globalni preruseni ;hlavni smycka SMYCKA: SLEEP RJMP SMYCKA MULT: ;vypne predchozi segmenty prechodem do log 1, zachova PA4 bez pullup odporu LDI REG,0b11101111 OUT PORT,REG ;vetveni, ktere segmenty se rozsviti LDI ZL,LOW(MULT_SKOK) ;nacte adresu MULT_SKOK do ZL, ZH (R30, R31) LDI ZH,HIGH(MULT_SKOK) MOV REG,MULTREG ;nacte pozici multiplexu DEC REG ;odecte 1, aby to bylo 0-6, nikoliv 1-7 ADD ZL,REG ;pricte pozici mutiplexu k 16bitove adrese ADC ZH,NULA IJMP ;skoci na spravne segmenty multiplexu MULT_SKOK: RJMP MULT_A RJMP MULT_B RJMP MULT_C RJMP MULT_D RJMP MULT_E RJMP MULT_F RJMP MULT_G MULT_A: OUT PORT2,SEGM_A ;na port 2 da novy stav anod cifer CBI PORT,0 ;zapne nove segmenty RET MULT_B: OUT PORT2,SEGM_B CBI PORT,1 RET MULT_C: OUT PORT2,SEGM_C CBI PORT,2 RET MULT_D: OUT PORT2,SEGM_D CBI PORT,3 RET MULT_E: OUT PORT2,SEGM_E CBI PORT,5 RET MULT_F: OUT PORT2,SEGM_F CBI PORT,6 RET MULT_G: OUT PORT2,SEGM_G CBI PORT,7 RET ;prevede cislo 0-9 na 7 segmentu s vyuzitim tabulky ZOBRAZ: CPI REG,10 ;kontrola zda cislo neni vic nez 9 BRSH ZOBRAZ_MIMO LDI ZH,HIGH(2*TABULKA) ;nacte 16bitovou adresu tabulky LDI ZL,LOW(2*TABULKA) ADD ZL,REG ;pricte k adrese tabulky cislici ADC ZH,NULA LPM REG,Z ;nacte 7-segmentovy tvar z tabulky RET ZOBRAZ_MIMO: LDI REG,0b01110111 ;pokud je cislo nad 9, zobrazi "_" RET ; obnovi registry segmentu podle udaje z pocitadla ; zaroven nastavi jejich bit2 na 0, coz vypne MOSFET pri nasledujicim posunu multiplexu OBNOVA: IN UDAJ1,TCNT1L ;nacte stav citace kmitu IN UDAJ2,TCNT1H CPI UDAJ1,99 ; 16-bitova kontrola, zda neni 99 a vice CPC UDAJ2,NULA BRLO DO99 LDI UDAJ1,9 ;pokud je nad 99, zustane na displeji 99 LDI UDAJ2,9 RJMP NAD99 DO99: CLR UDAJ2 ;vymaze z udaj2 predchozi hodnotu, ted bude 0 ZNOVU: ;prevod cisla 0-99 na dve jednociferne hodnoty 0-9 CPI UDAJ1,10 ;8-bitova podminka mensi nez 10 BRLO MENSI ;pokud je pod 10, uz neni treba nic delat SUBI UDAJ1,10 ;8-bitove odcitani cisla 10 od vysledku INC UDAJ2 ;odecita 10 od UDAJ1 a inkrementuje UDAJ2, dokud neni UDAJ1 jednociferny RJMP ZNOVU MENSI: NAD99: ;vynuluje registry vsech segmentu CLR SEGM_A CLR SEGM_B CLR SEGM_C CLR SEGM_D CLR SEGM_E CLR SEGM_F CLR SEGM_G ;prevede udaj1 na 7seg MOV REG,UDAJ1 RCALL ZOBRAZ ;nastavi podle toho bit 0 vsech registru segmentu SBRS REG,0 LDI SEGM_A,0b001 SBRS REG,1 LDI SEGM_B,0b001 SBRS REG,2 LDI SEGM_C,0b001 SBRS REG,3 LDI SEGM_D,0b001 SBRS REG,4 LDI SEGM_E,0b001 SBRS REG,5 LDI SEGM_F,0b001 SBRS REG,6 LDI SEGM_G,0b001 ; potlaceni zobrazeni pocatecni nuly CPI UDAJ2,0 BREQ POTLAC_NULU ; prevede udaj2 na 7seg MOV REG,UDAJ2 RCALL ZOBRAZ ;nastavi podle toho bit 1 vsech registru segmentu SBRS REG,0 SBR SEGM_A,0b010 SBRS REG,1 SBR SEGM_B,0b010 SBRS REG,2 SBR SEGM_C,0b010 SBRS REG,3 SBR SEGM_D,0b010 SBRS REG,4 SBR SEGM_E,0b010 SBRS REG,5 SBR SEGM_F,0b010 SBRS REG,6 SBR SEGM_G,0b010 POTLAC_NULU: RET ; preruseni ridici multiplex a zdroj casovani CITAC0: DEC MULTREG ;pri kazdem preruseni posune multiplex displeje o 1 pozici BRNE HOP ;pokud dospel multiplex na hodnotu 0... LDI MULTREG,7 ;...nastavi ho to na 7, jinak skoci na konec DEC DELREG ;snizi hodnotu delice frekvence BRNE HOP2 ;pokud nedosel na 0, skoci na porovnani s hodnotou, kdy se ma zapnout MOSFET LDI DELREG,25 ;deleni ze 100Hz multiplexu na obnovovaci frekvenci (100 / 25 = 4Hz) CPI PRIPOJ,1 ;je neco pripojeno na svorky? BREQ PRIPOJEN ;pokud je, skoci ; pokud neni nic pripojeno, zobrazi "-" a nemusi nic prevadet na 7seg ; zaroven nastavenim bitu2 na 0 vypne MOSFET pri nasledujicim posunu multiplexu LDI SEGM_A,0b000 LDI SEGM_B,0b000 LDI SEGM_C,0b000 LDI SEGM_D,0b000 LDI SEGM_E,0b000 LDI SEGM_F,0b000 LDI SEGM_G,0b001 RJMP HOP PRIPOJEN: ; obnovi registry segmentu podle udaje z pocitadla ; zaroven nastavi jejich bit2 na 0, coz vypne MOSFET pri nasledujicim posunu multiplexu RCALL OBNOVA RJMP HOP HOP2: ;tady zjistuje, zda neni cas zapnout MOSFET CPI DELREG,12 BRNE HOP ;pokud je neco pripojeno, na vstup PA4 to privadi log 0, jinak se vstup dostal do log 1 LDI PRIPOJ,0 IN REG,PINY SBRS REG,4 LDI PRIPOJ,1 ; vynuluje pocitadlo kmitu OUT TCNT1H,NULA OUT TCNT1L,NULA ; zapne MOSFET pri nasledujicim posunu multiplexu (da PB2 do log 1) SBR SEGM_A,0b100 SBR SEGM_B,0b100 SBR SEGM_C,0b100 SBR SEGM_D,0b100 SBR SEGM_E,0b100 SBR SEGM_F,0b100 SBR SEGM_G,0b100 HOP: RCALL MULT RETI TABULKA: .DB 0b01000000,0b01111001 ;0, 1 .DB 0b00100100,0b00110000 ;2, 3 .DB 0b00011001,0b00010010 ;4, 5 .DB 0b00000010,0b01111000 ;6, 7 .DB 0b00000000,0b00010000 ;8, 9