; vytvoril: DANYK ; http://danyk.cz ; Napsáno pro frekvenci 1MHz !!!!!!!!!!!!!!! .NOLIST .INCLUDE "m32def.inc" .LIST .DEF REG=R16 ;dva univerzalni docasne registry .DEF REG2=R17 ;... .DEF CIF1=R18 ;nejnizsi cifra .DEF CIF2=R19 .DEF CIF3=R20 ;nejvyssi cifra .DEF DISPREG=R21 ;registr pamatujici si polaritu napeti displeje (bit0) .DEF VZORREG=R22 ;registr na deleni frekvence (ziska se vzork. f) .EQU SMER1=DDRA .EQU PORT1=PORTA .EQU SMER2=DDRB .EQU PORT2=PORTB .EQU SMER3=DDRC .EQU PORT3=PORTC .EQU SMER4=DDRD .EQU PORT4=PORTD .CSEG .ORG 0 RJMP START ; vektory preruseni .ORG OC0addr ;preruseni citacem0 ridici multiplex, obnovovaci frekvenci RJMP DISPLEJ .ORG ADCCaddr ;preruseni pri dokonceni AD konverze RJMP HOTOVO START: ;nastaví port 1 jako vstup LDI REG,0b00000000 OUT SMER1,REG LDI REG,0b00000000 OUT PORT1,REG ;nastaví port 2 jako výstup LDI REG,0xFF OUT SMER2,REG LDI REG,0xFF OUT PORT2,REG ;nastaví port 3 jako výstup LDI REG,0xFF OUT SMER3,REG LDI REG,0xFF OUT PORT3,REG ;nastaví port 4 jako výstup LDI REG,0xFF OUT SMER4,REG LDI REG,0xFF OUT PORT4,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG LDI VZORREG,1 ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00001100 ; nulovani pri dosazeni porovnavane hodnoty... OUT TCCR0,REG ; ...(tzv. CTC), OC0 nevyuzit. preddeli 256 LDI REG,38 ; nastavi porovnavanou hodnotu (dělí se n+1) OUT OCR0,REG ; LDI REG,0b00000010 ; povoli preruseni CTC OCIE2 OUT TIMSK,REG ; ;NASTAVENI ADC a MCU LDI REG,0b11000000 ; int ref 2,56V, zarovna vpravo, zvoli vstup ADC0 OUT ADMUX,REG ; ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;hlavní smyčka SMYCKA: LDI REG,0b00001011 ; zakaze ADC OUT ADCSRA,REG ; LDI REG,0b10000000 ;povoli uspani (sleep) a nastavi mód idle OUT MCUCR,REG SEI ;povoli globalni preruseni SLEEP RJMP SMYCKA ZMERIT: ;vstupem do sleep modu ADC noise reduction se aktivuje ADC konverze LDI REG,0b10001011 ; povoleno ADC, jednoraz.,prerus. povoleno, OUT ADCSRA,REG ; deleni 8 (z 1MHz na 125kHz.) LDI REG,0b10010000 ;povoli uspani (sleep) a nastavi mód ADCnr OUT MCUCR,REG SEI ;povoli globalni preruseni SLEEP RET HOTOVO: ;preruseni pri dokonceni AD konverze IN REG,ADCL IN REG2,ADCH LDI CIF1,0 LDI CIF2,0 LDI CIF3,0 ZNOVU100: CPI REG,100 ;16-bitová podmínka vetsi nebo rovno 100 BRSH MINUS100 CPI REG2,1 BRSH MINUS100 RJMP POD100 MINUS100: SUBI REG,100 ;16-bitový odčítání čísla 100 od výsledku SBCI REG2,0 INC CIF3 RJMP ZNOVU100 POD100: CPI CIF3,10 ;podmínka vetsi nebo rovno 10 BRSH NAD999 ;když už cifra3 = 10, je mimo rozsah ZNOVU10: CPI REG,10 ;8-bitová podmínka vetsi nebo rovno 10 BRLO POD10 SUBI REG,10 ;8-bitový odčítání čísla 10 od výsledku INC CIF2 RJMP ZNOVU10 POD10: MOV CIF1,REG RJMP DO999 NAD999: ;co když je výsledek nad 999 LDI CIF1,255 ;nastavení cifer mimo 0-9 zobrazí "-" LDI CIF2,255 LDI CIF3,255 DO999: RETI DISPLEJ: ;preruseni RCALL PREPOLUJ INC DISPREG ;zmeni bit0, ostatni se ignoruji DEC VZORREG ;delenim z f displeje ziska vzorkovaci f BRNE VZORHOP LDI VZORREG,25 ;vzorkovaci f = 100 / n RCALL ZMERIT VZORHOP: RETI PREPOLUJ: ;displej se prepoluje MOV REG,CIF3 RCALL ZOBRAZ ORI REG,0b10000000 ;řídí společnou elektrodu (BP) SBRC DISPREG,0 COM REG OUT PORT4,REG MOV REG,CIF2 RCALL ZOBRAZ ANDI REG,0b01111111 ;řídí tečku (h) SBRC DISPREG,0 COM REG OUT PORT3,REG MOV REG,CIF1 RCALL ZOBRAZ SBRC DISPREG,0 COM REG OUT PORT2,REG RET ZOBRAZ: CPI REG,0 BREQ ZOBRAZ0 CPI REG,1 BREQ ZOBRAZ1 CPI REG,2 BREQ ZOBRAZ2 CPI REG,3 BREQ ZOBRAZ3 CPI REG,4 BREQ ZOBRAZ4 CPI REG,5 BREQ ZOBRAZ5 CPI REG,6 BREQ ZOBRAZ6 CPI REG,7 BREQ ZOBRAZ7 CPI REG,8 BREQ ZOBRAZ8 CPI REG,9 BREQ ZOBRAZ9 LDI REG,0b10111111 ;pokud je hodnota mimo 0-9, zobrazi "-" RET ZOBRAZ0: LDI REG,0b11000000 RET ZOBRAZ1: LDI REG,0b11111001 RET ZOBRAZ2: LDI REG,0b10100100 RET ZOBRAZ3: LDI REG,0b10110000 RET ZOBRAZ4: LDI REG,0b10011001 RET ZOBRAZ5: LDI REG,0b10010010 RET ZOBRAZ6: LDI REG,0b10000010 RET ZOBRAZ7: LDI REG,0b11111000 RET ZOBRAZ8: LDI REG,0b10000000 RET ZOBRAZ9: LDI REG,0b10010000 RET