Advertisement
Guest User

Untitled

a guest
Jan 29th, 2017
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;   File Name: MagicRaceCar.asm
  2. ;   Authors: Andreas Søgaard Berthou, Jacob Kjærby Christensen & Tobias Jessen
  3. ;   Content: Magic sleek code to race car
  4.     list        p=16f684        ; list directive to define processor
  5.     #include    <P16F684.inc>       ; processor specific variable definitions
  6.     __CONFIG    _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF
  7. ;***** VARIABLE DEFINITIONS
  8. w_temp      EQU 0x7E            ; variable used for context saving
  9. status_temp EQU 0x7F            ; variable used for context saving
  10. AN1R        EQU 0x21
  11. xref        EQU 0x22            ; brugt til referenceværdien
  12. xthresh     EQU 0x23            ; brugt til threshholdværdien
  13. ;**********************************************************************
  14.     ORG     0x000               ; processor reset vector
  15.     goto        INIT            ; go to beginning of program
  16.  
  17.  
  18.     ORG     0x004               ; interrupt vector location
  19.     movwf       w_temp          ; save off current W register contents
  20.     movf        STATUS,w        ; move status register into W register
  21.     movwf       status_temp     ; save off contents of STATUS register
  22.  
  23.  
  24.  
  25. INIT
  26.     ;Variable
  27.    
  28.     ; Setup for controller
  29.     BSF STATUS,RP0              ; Goto bank 1
  30.     CLRF    ANSEL
  31.     CLRF    TRISA
  32.     BCF STATUS,RP0              ; Goto bank 0
  33.     MOVLW   B'00000111'
  34.     MOVWF   CMCON0
  35.  
  36.     ; Setup og start timer 2
  37.     CLRF    TMR2                ; Nulstil Timer 2 registeret
  38.     BSF STATUS,RP0              ; Skift til Bank 1
  39.     MOVLW   D'195'              ; S?t Period registeret
  40.     MOVWF   PR2                 ;
  41.     BCF STATUS,RP0              ; Skift til Bank 0
  42.     MOVLW   B'01111111'         ; Indstil post- og pre-scaler
  43.     MOVWF   T2CON               ; og start timer 2 
  44.    
  45.     ; PWM PWM PWM PWM
  46.     ; PWM frequency
  47.     BSF STATUS,RP0
  48.     MOVLW   D'128'
  49.     MOVWF   PR2
  50.     BCF STATUS,RP0              ;Sørger for at PWM duty-cycle er som den skal være
  51.    
  52.     ; PWM starting cycle
  53.     CLRF    CCPR1L              ; Set duty cycle = 0%
  54.     MOVLW   B'00001100'         ; All P1A,B,C,D = high
  55.     MOVWF   CCP1CON
  56.    
  57.     ; PWM output mode
  58.     BSF STATUS,RP0
  59.     BCF TRISC, 5                ; Bit 2 = output
  60.    
  61.     ;Input pins
  62.     BSF TRISC,0                 ;C1
  63.     BSF TRISC,1                 ;C2
  64.     BSF ANSEL,5                 ;C1=ANALOG
  65.     BSF ANSEL,4                 ;C0=analog
  66.     BCF STATUS,RP0
  67.    
  68.     ; Clear timer
  69.     CLRF    TMR2
  70.    
  71.     ; Enable timer
  72.     BSF T2CON, TMR2ON
  73.    
  74.     ;Setup ADC
  75.     BSF STATUS,RP0              ; Bank 1
  76.     MOVLW   b'00100000'         ; Cycle
  77.     MOVWF   ADCON1              ; Set cycle in ADCON1
  78.     BCF STATUS,RP0              ; Bank 0
  79.     BSF ADCON0, 0               ; Turns on AD conversion
  80.     BSF ADCON0, 2
  81.     BSF ADCON0, 4               ; Sets CHS to 101 for AN5 input
  82.    
  83.     GOTO    tomgang
  84. tomgang
  85.     BSF ADCON0,GO               ;start ADC
  86. testlys BTFSC   ADCON0,GO       ;vent på ADC er færdig
  87.     GOTO    testlys
  88.     MOVF    ADRESH,W            ;Flyt ADC-værdien ind i W
  89.     SUBLW   d'30'               ;Træk 30 fra W (Hvor meget lyset skal under)
  90.     BTFSS   STATUS,C            ;Tjek om det går under 0
  91.     GOTO    tomgang             ;Hvis ikke, prøv ADC igen
  92.     CLRF    ADCON0              ;Ellers sæt AN4 som ADC pin
  93.     MOVLW   b'00010001'         ;^^
  94.     MOVWF   ADCON0              ;^^
  95.     BSF     ADCON0, GO          ;vv
  96. setref  BTFSC   ADCON0,GO       ;Start ADC på magneten
  97.     GOTO    setref              ;Vent på den er færdig
  98.     MOVF    ADRESH,W            ;Flyt ADC-værdien i W
  99.     MOVWF   xref                ;Flyt W til 'xref' (referenceværdien for magneten)
  100.     MOVLW   d'2'                ;Træk 2 fra xref
  101.     SUBWF   xref,0              ;Flyt det nye resultat over i W(Så der er op til 2 ud af 255 i usikkerhed til små fejlkilder)
  102.     MOVWF   xthresh             ;FLyt det derefter over i xthresh (Threshhold-værdien)
  103.     GOTO    drive               ;Begynd at teste til at køre
  104.  
  105. lowspeed                        ;Flytter 40 over i dutycycle som hastighed
  106.     MOVLW   d'40'
  107.     CLRF    CCPR1L
  108.     MOVWF   CCPR1L
  109.     GOTO    drive
  110.    
  111. fullspeed                       ;Flytter 50 ind i duty-cycle som hastighed
  112.     MOVLW   d'50'
  113.     CLRF    CCPR1L
  114.     MOVWF   CCPR1L
  115.     GOTO    drive
  116. drive
  117.     BSF ADCON0,GO               ;Test ADC
  118. getmag  BTFSC   ADCON0,GO       ;Vent på den er færdig
  119.     GOTO    getmag              ;Vent på den er færdig
  120.     MOVF    ADRESH,W            ;Flyt værdien ind i W
  121.     SUBWF   xthresh,0           ;Træk W fra xthresh
  122.     BTFSC   STATUS,C            ;Tjek om målt ADC-værdi er større end threshholdværdien
  123.     GOTO    lowspeed            ;Hvis den er lavere, sæt lav speed
  124.     GOTO    fullspeed           ;Ellers sæt høj speed
  125.    
  126.     GOTO    drive               ;Test ny værdi
  127.    
  128.     END                         ; directive 'end of program'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement