Author Topic: my program will assemble but wont output anything onto pickit3 with pic18f45k20  (Read 3878 times)

0 Members and 1 Guest are viewing this topic.

Offline marsalTopic starter

  • Newbie
  • Posts: 8
my project is to find the average min and max of a list of several values and then convert it into bcd and display it on the LED of the pickit3, it will build and debug on the simulator however when i connect it to the pickit i receive no output please help here is my code:

list p=18f45k20
   #include p18f45k20.inc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HI_SUM  EQU 0X01    ;USED TO FIND AVERAGE
LO_SUM  EQU 0X02    ;USED TO FIND AVERAGE
CPFLAG  EQU 0X00    ;BIT 0 IN STATUS REGISTER
COUNTER EQU 0X03    ;SET REGISTER 3 AS A COUNTER
AVERAGE EQU 0X04    ;AVERAGE VALUE WILL BE STORED HERE
MAX     EQU 0X05    ;MAX WILL BE STORED HERE
MAX1    EQU 0X12
MIN     EQU 0X06    ;MIN WILL BE STORED HERE
MIN1    EQU 0X13
BUFF0   EQU 0X07    ;BCD    ;BCD0
BUFF1   EQU 0X08    ;BCD    ;BCD1
NUMS    EQU 0X09    ;TEMPORARY STORE NUMBERS
BUFFER  EQU 0X10    ;BEGGINING OF VALUE ADDRESSES IN DATA MEM
REG0    EQU 0X30    ;DELAY REG
REG1    EQU 0X31    ;DELAY REG
REG2    EQU 0X32    ;DELAY REG
REG3    EQU 0X33
REG4    EQU 0X34
INNER_LOOP  EQU D'110'
OUTTER_LOOP EQU D'220'
        ORG 0X400   ;WHERE VALUES WILL BE STORED IN PROGRAM MEM
NUMBERS DB  0X01, 0X08, 0X07, 0X1A, 0X0C, 0X04, 0XFF
        ORG 0X20    ; PROGRAM WILL BE ASSEMBLED AT REG 20
        GOTO    MAIN
;TRANSFERING DATA FROM PM TO DM
DATACOPY
        LFSR    FSR0, BUFFER
        MOVLW   UPPER NUMBERS
        MOVWF   TBLPTRU
        MOVLW   HIGH NUMBERS
        MOVWF   TBLPTRH
        MOVLW   LOW NUMBERS
        MOVWF   TBLPTRL
LOOP:   TBLRD*+
        MOVFF   TABLAT, WREG
        MOVWF   POSTINC0
        CPFSEQ  0XFF
        BRA     LOOP
        RETURN
;FIND AVERAGE
AVG:    MOVLW   D'6'          ; NUMBER OF VALUES
        MOVWF   COUNTER
        LFSR   FSR0, BUFFER      ;Set up FSR0 as pointer for data registers
        CLRF   WREG,0
        CLRF   LO_SUM
        CLRF   HI_SUM
SUM:    ADDWF   POSTINC0,0,0       ;Get data byte in WREG
        BTFSC   STATUS,C
        INCF   HI_SUM         ;Is byte = 0? If yes, data string is finished
        DECF   COUNTER,1,0
        BNZ      SUM
        MOVWF   LO_SUM
AVG2:   CLRF   AVERAGE
DIVIDE: MOVLW   D'6'
        INCF   AVERAGE
        SUBWF   LO_SUM
       BTFSC   STATUS, 0
        GOTO   DIVIDE
        DECF   HI_SUM
        BTFSC   STATUS, 0
        GOTO   DIVIDE
        DECF   AVERAGE
        RETURN
;FIND MAX
MAXIMUM:    MOVLW   D'6'
            MOVWF   COUNTER
            MOVFF   BUFFER, MAX
            LFSR    FSR0, MAX1
NEXT:       MOVWF   POSTINC0, 0
            BZ      FINISH
            BTFSC   WREG, 6
            BRA     NEXT
            CPFSLT  MAX, 0
            BRA     NEXT
            MOVWF   MAX
FINISH:     RETURN
;FIND MIN:
MINIMUM:    MOVLW   D'6'
            MOVWF   COUNTER
            MOVFF   BUFFER, MIN
            LFSR    FSR0, MIN1
NEXT1:      MOVWF   POSTINC0, 0
            BZ      FINISH1
            BTFSC   WREG, 6
            BRA     NEXT1
            CPFSLT  MIN, 0
            BRA     NEXT
            MOVWF   MIN
FINISH1:    RETURN
;CONVERT TO BCD:
BCD
BINBCD:     CLRF    BUFF0
            CLRF    BUFF1
            MOVWF   NUMS
            LFSR    FSR0, BUFF1
            MOVLW   D'10'
            RCALL   DIVISION
            LFSR    FSR0, BUFF0
            MOVFF   NUMS, BUFF0
DIVISION:
            INCF    INDF0
            SUBWF   NUMS
            BTFSC   STATUS, C
            GOTO    DIVISION
            ADDWF   NUMS, 1
            DECF    INDF0
            RETURN
;DELAY CODE:
DELAY
DELAY50MS:  MOVLW   D'166'
            MOVWF   REG3
LOOP1:      DECF    REG3
            BNZ     LOOP1
            DECF    REG4, 1
            BNZ     DELAY50MS
            RETURN
;CODE FOR BLINKING:
BLINKING
START1:     MOVLW   B'10101100' ;load binary value
            MOVWF   TRISD   ; define Port D as output
            MOVWF   REG0
ONOFF:      MOVFF   REG0, PORTD ;set clock speed
            MOVLW   INNER_LOOP  ;first loop = 110
            MOVWF   REG1    ;load reg2 with 110
            MOVLW   OUTTER_LOOP ;second loop = 220
            MOVWF   REG2    ;load loop 2 value into reg 3
LOOP3:      DECF    REG1, 1 ;decrease reg2 by 1
            BNZ     LOOP3   ; check reg2 = 0
            DECF    REG2, 1     ;decrease reg3 by 1
            BNZ     LOOP3   ;check reg 3 = 0
            COMF    REG0 ,1 ; compliment reg1
            BRA     ONOFF   ; branch if command ment
            SLEEP

;MAIN ASSEMBLY CODE:
MAIN
    MOVLW   0X00
    MOVWF   TRISD ; PORT D AS OUTPUT
    CALL    BLINKING
    CLRF    PORTD
    CALL    DELAY
    CALL    DATACOPY
    CALL    AVERAGE
    MOVFF   AVERAGE, WREG
    CALL    BCD
    CALL    DELAY
    CALL    MINIMUM
    MOVFF   MIN, WREG
    CALL    BCD
    CALL    DELAY
    CALL    MAXIMUM
    CALL    BCD
    CALL    DELAY
    CALL    BLINKING
    CLRF    PORTD
    SLEEP
    END
 

Offline dannyf

  • Super Contributor
  • ***
  • Posts: 8221
  • Country: 00
Quote
to find the average min and max

What is "average min" and "average max"?
================================
https://dannyelectronics.wordpress.com/
 

Offline marsalTopic starter

  • Newbie
  • Posts: 8
average of the values, the min is the lowest value from the list and the max is the highest value of the list
 

Offline dannyf

  • Super Contributor
  • ***
  • Posts: 8221
  • Country: 00
Save yourself the pain and suffering and learn C.
================================
https://dannyelectronics.wordpress.com/
 

jucole

  • Guest
Hi,  where are your config settings?   why did you chose to write it in assembler?
 

Offline David_AVD

  • Super Contributor
  • ***
  • Posts: 2806
  • Country: au
Have you tried some simple blinking LED code to make sure the config is correct and the hardware is good?
 

Offline marsalTopic starter

  • Newbie
  • Posts: 8
i would use c but assembly lang was a requirement for this project

my congif settings are:
;//** C O N F I G U R A T I O N B I T S ***********/
 CONFIG FOSC = INTIO67    ; INTIO67 Note that if it is HS it will not work!
 CONFIG   LVP = OFF
 CONFIG   PWRT = ON

 CONFIG FCMEN = OFF
 CONFIG IESO = OFF ;// CONFIG1H

 CONFIG BOREN = SBORDIS
 CONFIG BORV = 30 ;// CONFIG2L
 CONFIG WDTEN = OFF
 CONFIG WDTPS = 32768 ;// CONFIG2H
 CONFIG MCLRE = OFF
 CONFIG LPT1OSC = OFF
 CONFIG PBADEN = ON
 CONFIG CCP2MX = PORTC ;// CONFIG3H
 CONFIG STVREN = ON
;
 CONFIG XINST = OFF ;// CONFIG4L
 CONFIG CP0 = OFF
 CONFIG CP1 = OFF
 CONFIG CP2 = OFF
 CONFIG CP3 = OFF ;// CONFIG5L
 CONFIG CPB = OFF
 CONFIG CPD = OFF ;// CONFIG5H
 CONFIG WRT0 = OFF
 CONFIG WRT1 = OFF
 CONFIG WRT2 = OFF
 CONFIG WRT3 = OFF ;// CONFIG6L
 CONFIG WRTB = OFF
 CONFIG  WRTC = OFF
 CONFIG WRTD = OFF ;// CONFIG6H
 CONFIG EBTR0 = OFF
 CONFIG EBTR1 = OFF
 CONFIG EBTR2 = OFF
 CONFIG EBTR3 = OFF ;// CONFIG7L
 CONFIG EBTRB = OFF
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4199
  • Country: us
No RETURN in Blinking?

 

Offline JTR

  • Regular Contributor
  • *
  • Posts: 107
  • Country: au
As above Plus

Since when has the reset vector for a PIC18F45K20 been at 0x20?

LOOP:   TBLRD*+
        MOVFF   TABLAT, WREG
        MOVWF   POSTINC0
        CPFSEQ  0XFF           <- Are you kidding? Read the data sheet.
 

Offline marsalTopic starter

  • Newbie
  • Posts: 8
The last value will be 0xFF, indicating the end of the data (0xFF is not counted in the summation calculation).
 

Offline JTR

  • Regular Contributor
  • *
  • Posts: 107
  • Country: au
        CPFSEQ  0XFF

Please, please, please... READ THE DATA SHEET!
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4199
  • Country: us
CPFSEQ compares W against a file register's contents, not against a constant.
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf