; vytvoril: DANYK ; http://danyk.cz ; Napsáno pro frekvenci 1MHz !!!!!!!!!!!!!!! .NOLIST .INCLUDE "m8def.inc" .LIST .DEF REG=R16 .DEF REG2=R17 .DEF CIF1=R18 .DEF CIF2=R19 .DEF CIF3=R20 .DEF MULTREG=R21 .DEF VZORREG=R22 .EQU SMER=DDRD .EQU PORT=PORTD .EQU SMER2=DDRC .EQU PORT2=PORTC .EQU SMER3=DDRB .EQU PORT3=PORTB .CSEG .ORG 0 RJMP START ; 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 jako výstup LDI REG,0xFF OUT SMER,REG LDI REG,0xFF OUT PORT,REG ;nastaví port C jako vstup, aktivuje pullup odpory PC 4 a 5 LDI REG,0b00000000 OUT SMER2,REG LDI REG,0b00110000 OUT PORT2,REG ;nastaví port B jako výstup LDI REG,0xFF OUT SMER3,REG LDI REG,0xFF OUT PORT3,REG LDI REG,LOW(RAMEND) OUT SPL,REG LDI REG,HIGH(RAMEND) OUT SPH,REG LDI MULTREG,1 ;prednastavi registr stavu multiplexu ; NASTAVENI CASOVACE A JEHO PRERUSENI LDI REG,0b00001110 ; nulovani pri dosazeni porovnavane hodnoty... OUT TCCR2,REG ; ...(tzv. CTC), OC0 nevyuzit. preddeli 256 LDI REG,12 ; 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,0b11000000 ; int ref 2,56V, zarovna vpravo, zvoli vstup ADC0 OUT ADMUX,REG ; 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 OUT MCUCR,REG SEI ;povoli globalni preruseni ;vypne analog. komparator - neni nikdy vyuzit (setri energii) LDI REG,0b10000000 OUT ACSR,REG ;hlavní smyčka SMYCKA: RJMP SMYCKA ZMERIT: ;vstupem do sleep modu ADC noise reduction se aktivuje ADC konverze SEI 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 MULTIPLEX: RCALL MULT DEC MULTREG BRNE MULTHOP LDI MULTREG,3 DEC VZORREG BRNE MULTHOP LDI VZORREG,25 ;vzorkovací f = 100 / n RCALL ZMERIT MULTHOP: RETI MULT: ;multiplex LDI REG,0b00000000 OUT PORT3,REG CPI MULTREG,1 BREQ MULT1 CPI MULTREG,2 BREQ MULT2 CPI MULTREG,3 BREQ MULT3 MULT1: MOV REG,CIF1 RCALL ZOBRAZ OUT PORT,REG LDI REG,0b00000001 OUT PORT3,REG RET MULT2: MOV REG,CIF2 RCALL ZOBRAZ IN REG2,PINC ;vyhodnotí stav propojky SBRS REG2,4 SUBI REG,128 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG LDI REG,0b00000010 OUT PORT3,REG RET MULT3: MOV REG,CIF3 RCALL ZOBRAZ IN REG2,PINC ;vyhodnotí stav propojky SBRS REG2,5 SUBI REG,128 ;tohle rozsvěcí tečku na nejvyšším bitu OUT PORT,REG LDI REG,0b00000100 OUT PORT3,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 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