Assembly Help

Discussion in 'Embedded Systems and Microcontrollers' started by jakery, Nov 6, 2013.

  1. jakery

    Thread Starter New Member

    Oct 28, 2013
    2
    0
    Hey guys,

    I've been working on an assembly assignment program for some time now and am having a few issues nearing the completion of the program. Basically it reads values from the ADC and checks if they are correct. It needs to check 4 values.

    The program is for a PICF690 microcontroller is MPLAB v8.

    Here is my code atm:

    http://pastebin.com/3CNBfRsg

    So my problem is this, I read the value from the potentiometer and parse it to the LED's just fine, this is working as it should (thankfully).

    I now need to record the value from the ADC when the switch is high and check if this value is correct and this is where I am having issues. I understand that I want to subtract the value from a number and determine if it is 0 (if it is than the number was correct), but I'm having issues implementing this, you can see my pseduo attempt within.

    If this should be posted elsewhere I apologise,

    I would appreciate any help at all, I'm desperate.

    Regards.
     
  2. ErnieM

    AAC Fanatic!

    Apr 24, 2011
    7,388
    1,605
    This is a fine spot for your post. Welcome to the forums!

    It would be most helpful (to YOU) if you post your code here instead of linking to it. DO put code tags (see the # icon above the reply text box?) so it keeps formatting.

    Especially with just one post it is likely no one will follow your link, and I would advice everyone to do just that.
     
  3. jakery

    Thread Starter New Member

    Oct 28, 2013
    2
    0
    Thanks,

    Here is is:

    Code ( (Unknown Language)):
    1. #include <p16f690.inc>
    2.  
    3. __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)
    4.  
    5. ; Setup ADC subroutine
    6.                
    7.                 ORG     0x00
    8.         pause   EQU     0x10
    9.         pause1  EQU     0x20
    10.         val1    EQU     0x21
    11.         val2    EQU     0x22
    12.         val3    EQU     0x23
    13.         val4    EQU     0x24
    14.         checkVal    EQU     0x25
    15.                 goto    main       
    16.  
    17.  
    18.  
    19.    
    20.         checkError
    21.         ;       return
    22.    
    23.         checkCorrect
    24.         ;       return 
    25.    
    26.     #include <p16f690.inc>
    27.  
    28. __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _FCMEN_OFF)
    29.  
    30. ; Setup ADC subroutine
    31.                
    32.                 ORG     0x00
    33.         pause   EQU     0x10
    34.         pause1  EQU     0x20
    35.         val1    EQU     0x21
    36.         val2    EQU     0x22
    37.         val3    EQU     0x23
    38.         val4    EQU     0x24
    39.         checkVal    EQU     0x25
    40.                 goto    main       
    41.  
    42.  
    43.  
    44.    
    45.         checkError
    46.         ;       return
    47.    
    48.         checkCorrect
    49.         ;       return 
    50.    
    51.         readVal1
    52.  
    53.         ;       call        readADC
    54.         ;       movlw       W, val1
    55.                            
    56.         ;       call        LED1
    57.         ;       goto        loop1      
    58.  
    59.         readVal2   
    60.        
    61.         ;       call        readADC
    62.         ;       movlw       W, val2
    63.                            
    64.         ;       call        LED1
    65.         ;       goto        loop1
    66.  
    67.         readVal3   
    68.  
    69.         ;       call        readADC
    70.         ;       movlw       W, val3
    71.                            
    72.         ;       call        LED1
    73.         ;       goto        loop1
    74.                
    75.         readVal4                   
    76.         ;       call        readADC
    77.         ;       movlw       W, val4
    78.                            
    79.         ;       call        LED1
    80.         ;       goto        loop1
    81.  
    82. ;       check   btfsc       subwf val1,1
    83.         ;       call        checkError
    84.                
    85.         ;       btfsc       subwf val2,2
    86.         ;       call        checkError
    87.                
    88.         ;       btfsc       subwf val3,3
    89.         ;       call        checkError
    90.                
    91.         ;       btfsc       subwf val4,4
    92.         ;       call        checkError
    93.                
    94.         ;       call        checkCorrect           
    95.  
    96.         ; Subroutine setSwitch
    97.        
    98.         LED1                 
    99.                 movwf       PORTC
    100.             ;   bsf         PORTC, W
    101.                 call        delay
    102.                 bcf         PORTC, W
    103.                 return
    104.        
    105.         delay
    106.                 decfsz      pause,f
    107.                 goto        delay
    108.                 decfsz      pause1,f
    109.                 goto        delay
    110.                 return
    111.        
    112.         setSwitch
    113.                 BANKSEL     TRISA   ;Select BankA
    114.                 bsf         TRISA,3 ;Set bit3 PORTA as input
    115.                 BANKSEL     PORTA   ;select bank 0     
    116.                 return
    117.        
    118.         setLEDs
    119.                 BANKSEL     TRISC
    120.                 CLRF        TRISC  
    121.                 BANKSEL     PORTC
    122.                 RETURN
    123.  
    124.  
    125.            
    126.         initTimer0
    127.                 BANKSEL     OPTION_REG
    128.                 movlw       B'10000111' ; Configure Timer0
    129.                 movwf       OPTION_REG ; Maximum prescalar
    130.                 BANKSEL     TMR0
    131.                 clrf        TMR0 ; Initialise Timer0
    132.                 movlw       B'10100000' ; Timer0 interrupt active
    133.                 movwf       INTCON
    134.                 return
    135.  
    136.         setADC
    137.                 BANKSEL     TRISA
    138.                 bsf         TRISA,0
    139.                 movlw       0x10
    140.                 movwf       ADCON1
    141.                 BANKSEL     ANSEL
    142.                 bsf         ANSEL,0
    143.                 BANKSEL     ADCON0
    144.                 movlw       B'00000001'
    145.                 movwf       ADCON0
    146.                 goto        $+1
    147.                 goto        $+1
    148.                 goto        $+1
    149.                 return
    150.  
    151.         readADC
    152.                 BANKSEL     ADCON0 ; Select bank 0
    153.                 bsf         ADCON0,GO ; Start ADC conversion
    154.         loop    btfsc       ADCON0,GO ; Check if converted
    155.                 goto        loop ; Poll (loop) until done
    156.                 movf        ADRESH,W ; Put 8-bit result in W
    157.                 return
    158.  
    159.         main
    160.                 call        setADC ; Setup Channel 0 of ADC
    161.                 call        readADC ; Read the ADC value
    162.                 call        setSwitch
    163.                 call        setLEDs
    164.         loop1   btfsc       PORTA,3
    165.                 call        pressed
    166.                 call        LED1
    167.                 goto        loop1  
    168.        
    169.         pressed call        readADC
    170.  
    171.                 call        LED1
    172.                
    173.             ;   sublw       val1
    174.             ;   btfsc       zflg
    175.             ;   goto        $+2
    176.             ;   call        readVal1
    177.                
    178.             ;   btfsc       val2
    179.         ;       goto        $+2
    180.         ;       call        readVal2
    181.                
    182.         ;       btfsc       val3
    183.         ;       goto        $+2
    184.         ;       call        readVal3
    185.                
    186.         ;       btfsc       val4
    187.         ;       goto        $+2
    188.         ;       call        readVal4
    189.                
    190.    
    191.                 return
    192.  
    193.                 goto        $               ; Wait here
    194.                 end
    195.                    
    196.        
    197.        
    Would appreciate any help!
     
    Last edited: Nov 6, 2013
Loading...