; ; ; File: SERVTEST.ASM ; ;----------------------------------------------------- ;PIC12C671 jako test 2 serv dvema potenciometry ;----------------------------------------------------- ;GP0 AN0 Vstup potenciometr 0 ;GP1 AN1 Vstup potenciometr 1 ;GP2 OUT Vystup servo 0 ;GP3 OUT Vystup servo 1 (vystup resen pripojovanim pullup odporu pres tranzistor, takze pripojeny ; pullup odpovida nule na vystupu) ;Vstupy z potenciometru jsou 0 az 5V a vystupy pulsu jsou 990us pro 0V, 2010us pro 5V. ;POZNAMKA: ; WDT nepouzivat - vypnout ; MCLRE pouzit vnitrni reset - ne pin ; CP zapnout ochranu proti cteni programu ; pouzit XTAL oscilator 4MHz list p=12c671 #include p12c671.inc cblock 0x20 ;Variables ch0 ;namerena hodnota potenciometru 0 ch1 ;namerena hodnota potenciometru 1 pom ;pomocna promenna pro smycky pom2 ;pomocna promenna pro smycky endc org 0x0 call 0x3FF bsf STATUS,RP0 ;stranka 1 movwf OSCCAL ;pouzivam xtal tak neni potreba, ale kdybych chtel jet i bez xtalu ... goto start org 0x40 start ;jsem ve strance 1 movlw b'00000000' ;povolit pullup movwf OPTION_REG ;GP2 je vystup ne T0CK movlw b'00111011' movwf TRISIO ;GP2 vystup, ostatni vstup (GP3 resi vystup pripojenim a odpojenim pullup) bcf STATUS,RP0 ;stranka 0 movlw b'00000000' ;Nastavit vystupy do Low movwf GPIO movlw b'10000001' ;ADC rizen Fosc/32, ADC zapnut movwf ADCON0 ;parametry do registru ADCON0 bsf STATUS,RP0 ;stranka 1 movlw b'00000100' ;AN0 a AN1 pouzit pro ADC, ostatni jsou I/O porty movwf ADCON1 ;parametry do registru ADCON1 loop ;shodime pullup, at muzeme merit a zaroven tim generujeme puls na GP3 bsf STATUS,RP0 ;stranka 1 ;1 ;3 cykly do celku ;1 movlw b'10000000' ;1 ;- ;2 movwf OPTION_REG ;Vystup z GP3 pres tranzistor nahozen - bez pullup;1 ;- ;3 ;nahozen, odtud se pocita delka trvani bcf STATUS,RP0 ;stranka 0 ;1 ;pockat na srovnani vstupniho napeti po odpojeni pullup movlw 0x80 ;1 ;1 ;2 movwf pom ;celkem ceka 3*128 microsec = 384 us ;384 ;386 smyc1 decfsz pom,f ;- goto smyc1 ;- ;zmerime AN0 bcf ADCON0,CHS0 ;pouze CHS0 budeme prehazovat (AN0 a AN1) ;1 ;387 movlw 0x40 ;1 ;1 ;388 movwf pom ;celkem ceka 3*64 microsec = 192 us ;192 ;580 smyc1a decfsz pom,f ;- goto smyc1a ;- bsf ADCON0,GO ;1 ;581 ;pockame, at se spolehlive zmeri (8 microsec minimalne) movlw 0x20 ;1 ;1 ;582 movwf pom ;celkem ceka 3*32 microsec = 96 us ;96 ;678 smyc1b decfsz pom,f ;- goto smyc1b ;- movf ADRES,w ;1 ;679 movwf ch0 ;v ch0 je zmeren potenciometr 0 ;1 ;680 ;zmerime AN1 bsf ADCON0,CHS0 ;pouze CHS0 budeme prehazovat (AN0 a AN1) ;1 ;681 movlw 0x40 ;1 ;1 ;682 movwf pom ;celkem ceka 3*64 microsec = 192 us ;192 ;874 smyc2a decfsz pom,f ;- goto smyc2a ;- bsf ADCON0,GO ;1 ;875 ;pockame, at se spolehlive zmeri (8 microsec minimalne) movlw 0x22 ;1 ;1 ;876 movwf pom ;celkem ceka 3*34 microsec = 102 us ;102 ;978 smyc2b decfsz pom,f ;- goto smyc2b ;- nop ;dorovnani casu ;1 ;979 movf ADRES,w ;1 ;980 movwf ch1 ;v ch1 je zmeren potenciometr 1 ;1 ;981 ;ted cyklit 4 * ch0 + 4 microsec movf ch0,w ;1 ;982 movwf pom ;1 ;983 incf pom,f ;v 0 cykli 4*256, tedy pricteme 1 ;4*ch0+4 smyc4 nop decfsz pom,f goto smyc4 ;nahodit zpet pullup bsf STATUS,RP0 ;stranka 1 ;1 ;984 movlw b'00000000' ;povolit pullup ;1 ;985 movwf OPTION_REG ;GP3 pres tranzistor shozen - pullup nahozen ;1 ;986 + 4 + 4*ch0 - konecna bcf STATUS,RP0 ;stranka 0 ;1 ;1 do celku ;nahodit GP2 bsf GPIO,2 ;1 ;1 do celku ;4 ;pocitani druheho pulsu movlw 0x0F5 ;245 dec ;1 movwf pom ;980 ;981 smyc4a nop ;- decfsz pom,f ;- goto smyc4a ;- ;ted cyklit 4 * ch1 + 4 microsec movf ch1,w ;1 ;982 movwf pom ;1 ;983 incf pom,f ;v 0 cykli 4*256, tedy pricteme 1 ;4*ch1 + 4 smyc5 nop ;- decfsz pom,f ;- goto smyc5 ;- nop ;dorovnani casu ;1 ;984 nop ;dorovnani casu ;1 ;985 ;shodit GP2 bcf GPIO,2 ;1 ;986 + 4 + 4*ch1 - konecna ;dopocitat do 20ms ;tohle musi trvat presne 20ms - 4028us - 6us ;ted cyklit ch0 do 256 nop ;4*(256-ch0) smyc6 nop incfsz ch0,f goto smyc6 ;cele max 256*4 us ;ted cyklit ch1 do 256 nop ;4*(256-ch1) smyc7 nop incfsz ch1,f goto smyc7 ;cele max 256*4 us ;sem to trva vzdy uplne stejne - tedy ... 4028+4=4032us ;doplnime jeste 15966 us movlw 0x14 ;20dec ;1 ;1 movwf pom2 ;1 ;2 smyc8 clrf pom ;trva vzdy 768us ;768 ;768*20 smyc9 decfsz pom,f ; goto smyc9 ; decfsz pom2,f ;3*20-1 ;59 goto smyc8 ;dohromady smycka 15422 ;jeste 544 movlw 0x0B5 ;181dec ;1 movwf pom ;3*181=543 smyc10 decfsz pom,f goto smyc10 ;celkem smycka 544 ;a ted cele znovu goto loop ;2 ;2 cykly do celku ;6 end