LIST P=16F876A, W=2, X=ON, R=DEC #INCLUDE P16F876A.INC __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC ; Side 146 i datasheet b'11111100111010' ; PIC16F876A.INC ligger i MPASM Suit under C:\Programmer\MicroChip\ #define bank1 bsf STATUS,RP0 #define bank0 bcf STATUS,RP0 count EQU 0x20 ; variabel til delay adsum EQU 0x21 ; Variabel til AD resultat del1 EQU 0x22 ; til langt delay del2 EQU 0x23 ; til langt delay del3 EQU 0x24 ; til langt delay value10 EQU 0x25 ; 10 cm. værdi (det som ADconverteren afgiver ved 10 cm.) skal initialiseres i init value20 EQU 0x26 ; 20 cm. værdi (det som ADconverteren afgiver ved 20 cm.) Skal initialiseres i init org 0x00 ; goto main ; org 0x0a ; ;*****************Main**************************************** main bank0 ;bank0? hvorfor er den der?? call init call frem ;sætter bilens retning til fremad call fuldf ;sætter bilen til at køre nykon call adkon ;foretag konvertering af signal call cm20 ;tjek for 20 cm. call cm10 ;tjek fr 10 cm. goto nykon ;Ny omgang (Den havde vi også glemt) ;************************************************************** ;****Tjekker om noget er 20cm væk***************************** cm20 movf value20,W ;Læg 20 cm. værdien i w subwf adsum,W ;F-W (adsum-w) btfss STATUS,C ;hvis der er noget (c-bit i status bliver lav ved negativ result) call halvf ;så sæt farten til halv fremad return ;************************************************************* ;********Tjekker om noget er 10cm væk************************* cm10 movf value10,W subwf adsum,W btfsc STATUS,C ;hvis der ikke er noget på 10 cm. grænsen goto ud ;så spring ud call stop ;stopper bilen call bak ;sætter retning til bak call fuldb ;sætter omdrejninger på hjulene call ldelay ;kør 1-2 meter bagud via langt delay call stop ;Stop igen og så er vi klar til en ny omgang call frem ;start bilen igen call fuldf ud return ;*************************************************************** ;**********************STOP************************************* stop clrf CCPR1L ;sæt dutycycle til 0 clrf CCPR2L ;sæt dutycycle til 0 call delay return ;***************************************************************** ;****************Retning fremad*********************************** frem bcf PORTC,0 bcf PORTC,3 return ;****************************************************************** ;***************Retning bagud************************************** bak bsf PORTC,0 bsf PORTC,3 return ;****************************************************************** ;**********************Fuld speed fremad*************************** fuldf movlw 0x80 ;Skal være til den stærkeste/hurtigeste motor movwf CCPR1L ;sætter dutycycle til den ene motor movlw 0xff ;Skal være til den svageste/langsomeste motor movwf CCPR2L ;sætter dutycycle til den anden motor return ;******************************************************************* ;***********************Halv hastighed frem************************* halvf movlw 0x10 ;stærkeste motor movwf CCPR1L movlw 0x20 ;svageste motor movwf CCPR2L return ;****************************************************************** ;***********************FULD HASTIGHED bagud*********************** fuldb movlw 0x80 ;stærkeste motor movwf CCPR1L movlw 0xff ;svageste motor movwf CCPR2L return ;***************************************************************** ;**********************Halv hastighed bagud*********************** halvb movlw 0x10 ;stærkeste motor (hvordan er det nu jeg regner den frekvens ud, samt dutycyclen? movwf CCPR1L movlw 0x20 ;svageste motor movwf CCPR2L return ;****************************************************************** ;*************A/D Konverteren************************************** adkon bank0 bsf ADCON0,2 ; Start konvertering vent btfsc ADCON0,2 ; Vent på den er slut goto vent movf ADRESH,W ; Flyt 8 højeste bit til W movwf adsum ; Skriv værdi over i variablen ADSUM call delay ; ikke køre for hurtigt return ;**************************************************************** ;***************Initalisering************************************* init bcf STATUS,RP1 ; RP1 sættes til 0 ; bank 0 og 1 vælgws via ; mine defines bank1 clrf TRISC ; hele C-porten er udad bsf TRISA,0 ; indad til analog sp. ;******OPSÆTNING AF PWM************************************** bank0 bcf CCP1CON,0 bcf CCP1CON,1 bcf CCP1CON,2 bcf CCP1CON,3 bsf CCP1CON,2 bsf CCP2CON,3 clrf CCPR1L ;PWM bliver sat til 0, så den kører ingen steder clrf CCPR2L bank1 movlw 0xff movwf PR2 bcf TRISC,1 ;Udgang PWM2, hastighed højre motor bcf TRISC,2 ;Udgang PWM1, hastighed venstre motor bcf TRISC,0 ;Udgang retning højre motor bcf TRISC,3 ;Udgang retning venstre motor bsf T2CON,1 ;Sætter Timer2 modul til 16prescale bcf T2CON,0 ;Sætter timer2 modul til 16prescale bsf T2CON,2 ; UPS glemte at starte timeren i første omgang, denne starter timeren ;******SLUT PÅ OPSÆTNING AF PWM****************************** ;******OPSÆTNING AF CONVERTEREN MED 1 LINJE, AN0 porta,0***** bank0 bsf ADCON0,7 ; 20 MHz cryst. bcf ADCON0,6 ; Neddeling med 32 bcf ADCON0,5 ; En fast kanal til konvert. bcf ADCON0,4 ; Der bruges AN0 bcf ADCON0,3 ; Kanalen styres af 3 bit bank1 bcf ADCON1,7 ; Venstrestil de 10 bit bcf ADCON1,3 ; Der konverteres fra max. bcf ADCON1,2 ; 5 kanaler. Jeg bruger 1. bsf ADCON1,1 ; Der konverteres ml. 0 og 5 V. bcf ADCON1,0 ; Styres af 4 bit. bank0 bsf ADCON0,0 ; Sæt strøm på converteren call delay call delay ;****** SLUT PÅ OPSÆTNING AF CONVERTER************************ ;**************init af øvrige variabler*********************** bank0 movlw 0x32 ;værdierne som der trigges på ved 10 og 20 cm. movwf value20 ;skal sættes her movlw 0x1e ;og movwf value10 ;her ;**************slut på init af øvrige variabler*************** return ;********************************************************************** ;****************Delay**************************************************** delay clrf count again decfsz count goto again return ;************************************************************************ ;****************Langt delay********************************************** ldelay movlw 0x40 ;længden til bakket væk fra muren SÆTTES HER (større tal er længere og omvendt) movwf del3 more3 movlw 0xff movwf del2 more2 movlw 0xff movwf del1 more1 decfsz del1 goto more1 decfsz del2 goto more2 decfsz del3 goto more3 return ;************************************************************************* end