This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TMS570LC4357: HET assembler undefined symbol issue

Part Number: TMS570LC4357
Other Parts Discussed in Thread: HALCOGEN

Tool/software:

Hello experts,

I'm using the HET IDE to compile a .het file -- I essentially copy-pasted the "black-box" HALCoGen HET code from spna225. When I try to compile the code, I'm seeing the following error:

NHET Assembler Release 1.7
Texas Instruments Incorporated.
PASS 1
PASS 2
*** ERROR! line 187: E9999: [Syntax Error]
DPWM_2 PWCNT { next=PPWM_2, hr_lr=LOW, cond_addr=PPWM_2, pin=PIN_PWM2, action=POL_PWM2, reg=NONE, irq=OFF, data=DUTY_CNT2, hr_data=0};

*** ERROR! EOF: E0300: The following symbols are undefined:
DLOAD_0
DLOAD_1
PPWM_2

2 Errors, No Warnings

Errors in Source - Assembler Aborted

It is not clear to my why this error is occurring.  I am attaching the file that I am trying to compile.  

A related question: is the blackbox HET code used for the TMS570LC43xx in HALCoGen the same as the provided example for TMS570LS31xx?

;/**********************************************************************************************/
; This HET program corresponds to the HALCoGen generated HET code for TMS570LS31xx in default /
; configuration                                                                               /
;/**********************************************************************************************/
;/----------------------------------------------------------------------------------------------/
;/ GUI CONFIGURATION                                                                          /
;/----------------------------------------------------------------------------------------------/

; PWM Configuration Parameters
PIN_PWM0     .equ 8
DUTY_LOAD0   .equ 353
PERD_LOAD0   .equ 703
 .asg "PULSEHI", POL_PWM0
 .asg "OFF", ENABLE_PWM0
PIN_PWM1     .equ 10
DUTY_LOAD1   .equ 353
PERD_LOAD1   .equ 703
 .asg "PULSEHI", POL_PWM1
 .asg "OFF", ENABLE_PWM1
PIN_PWM2     .equ 12
DUTY_LOAD2   .equ 353
PERD_LOAD2   .equ 703
 .asg "PULSEHI", POL_PWM2
 .asg "OFF", ENABLE_PWM2
PIN_PWM3     .equ 14
DUTY_LOAD3   .equ 353
PERD_LOAD3   .equ 703
 .asg "PULSEHI", POL_PWM3
 .asg "OFF", ENABLE_PWM3
PIN_PWM4     .equ 16
DUTY_LOAD4   .equ 353
PERD_LOAD4   .equ 703
 .asg "PULSEHI", POL_PWM4
 .asg "OFF", ENABLE_PWM4
PIN_PWM5     .equ 17
DUTY_LOAD5   .equ 353
PERD_LOAD5   .equ 703
 .asg "PULSEHI", POL_PWM5
 .asg "OFF", ENABLE_PWM5
PIN_PWM6     .equ 18
DUTY_LOAD6   .equ 353
PERD_LOAD6   .equ 703
 .asg "PULSEHI", POL_PWM6
 .asg "OFF", ENABLE_PWM6
PIN_PWM7     .equ 19
DUTY_LOAD7   .equ 353
PERD_LOAD7   .equ 703
 .asg "PULSEHI", POL_PWM7
 .asg "OFF", ENABLE_PWM7

; EDGE Configuration Parameters
PIN_EDGE0    .equ 9
 .asg "FALL", POL_EDGE0
PIN_EDGE1    .equ 11
 .asg "FALL", POL_EDGE1
PIN_EDGE2    .equ 13
 .asg "FALL", POL_EDGE2
PIN_EDGE3    .equ 15
 .asg "FALL", POL_EDGE3
PIN_EDGE4    .equ 20
 .asg "FALL", POL_EDGE4
PIN_EDGE5    .equ 21
 .asg "FALL", POL_EDGE5
PIN_EDGE6    .equ 22
 .asg "FALL", POL_EDGE6
PIN_EDGE7    .equ 23
 .asg "FALL", POL_EDGE7

; CAPTURE Configuration Parameters
PIN_DUTYCAP0     .equ 0
PIN_PERDCAP0     .equ (PIN_DUTYCAP0+1)
 .asg "FALL2RISE", POL_DCAP0
 .if $symcmp( POL_DCAP0, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP0
 .else
 .asg "FALL2FALL", POL_PCAP0
 .endif
PIN_DUTYCAP1     .equ 2
PIN_PERDCAP1     .equ (PIN_DUTYCAP1+1)
 .asg "FALL2RISE", POL_DCAP1
 .if $symcmp( POL_DCAP1, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP1
 .else
 .asg "FALL2FALL", POL_PCAP1
 .endif
PIN_DUTYCAP2     .equ 4
PIN_PERDCAP2     .equ (PIN_DUTYCAP2+1)
 .asg "FALL2RISE", POL_DCAP2
 .if $symcmp( POL_DCAP2, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP2
 .else
 .asg "FALL2FALL", POL_PCAP2
 .endif
PIN_DUTYCAP3     .equ 6
PIN_PERDCAP3     .equ (PIN_DUTYCAP3+1)
 .asg "FALL2RISE", POL_DCAP3
 .if $symcmp( POL_DCAP3, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP3
 .else
 .asg "FALL2FALL", POL_PCAP3
 .endif
PIN_DUTYCAP4     .equ 24
PIN_PERDCAP4     .equ (PIN_DUTYCAP4+1)
 .asg "FALL2RISE", POL_DCAP4
 .if $symcmp( POL_DCAP4, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP4
 .else
 .asg "FALL2FALL", POL_PCAP4
 .endif
PIN_DUTYCAP5     .equ 26
PIN_PERDCAP5     .equ (PIN_DUTYCAP5+1)
 .asg "FALL2RISE", POL_DCAP5
 .if $symcmp( POL_DCAP5, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP5
 .else
 .asg "FALL2FALL", POL_PCAP5
 .endif
PIN_DUTYCAP6     .equ 28
PIN_PERDCAP6     .equ (PIN_DUTYCAP6+1)
 .asg "FALL2RISE", POL_DCAP6
 .if $symcmp( POL_DCAP6, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP6
 .else
 .asg "FALL2FALL", POL_PCAP6
 .endif
PIN_DUTYCAP7     .equ 30
PIN_PERDCAP7     .equ (PIN_DUTYCAP7+1)
 .asg "FALL2RISE", POL_DCAP7
 .if $symcmp( POL_DCAP7, "FALL2RISE" )
 .asg "RISE2RISE", POL_PCAP7
 .else
 .asg "FALL2FALL", POL_PCAP7
 .endif

;/----------------------------------------------------------------------------------------------/
;/ ADDITIONAL CONFIGURATION                                                                   /
;/----------------------------------------------------------------------------------------------/
; The following configuration options are not available in the HALCoGen GUI. The default values
; here are hard-coded in the actual HALCoGen black-box driver.

PERD_CNT0 .equ 0
DUTY_CNT0 .equ 0
 .asg "ON", EOD_IRQ0
 .asg "ON", EOP_IRQ0
PERD_CNT1 .equ 0
DUTY_CNT1 .equ 0
 .asg "ON", EOD_IRQ1
 .asg "ON", EOP_IRQ1
PERD_CNT2 .equ 0
DUTY_CNT .equ 0
 .asg "ON", EOD_IRQ2
 .asg "ON", EOP_IRQ2
PERD_CNT3 .equ 0
DUTY_CNT .equ 0
 .asg "ON", EOD_IRQ3
 .asg "ON", EOP_IRQ3
PERD_CNT4 .equ 0
DUTY_CNT4 .equ 0
 .asg "ON", EOD_IRQ4
 .asg "ON", EOP_IRQ4
PERD_CNT5 .equ 0
DUTY_CNT5 .equ 0
 .asg "ON", EOD_IRQ5
 .asg "ON", EOP_IRQ5
PERD_CNT6 .equ 0
DUTY_CNT6 .equ 0
 .asg "ON", EOD_IRQ6
 .asg "ON", EOP_IRQ6
PERD_CNT7 .equ 0
DUTY_CNT7 .equ 0
 .asg "ON", EOD_IRQ7
 .asg "ON", EOP_IRQ7

;/----------------------------------------------------------------------------------------------/
;/ INSTRUCTIONS                                                                                /
;/----------------------------------------------------------------------------------------------/

; The N2HET loop starts at FIRST_INS instruction
; Global CNT instruction
FIRST_INS CNT { next=DPWM_0,reg=T,comp=EQ,irq=OFF,max=33554431,data=33554431};

; DPWM_0 to PPWM_7 are instructions to produce PWM signals
DPWM_0 PWCNT { next=PPWM_0,hr_lr=LOW,cond_addr=PPWM_0,pin=PIN_PWM0,action=POL_PWM0,reg=NONE, irq=OFF, data=DUTY_CNT0, hr_data=0};
PPWM_0 DJZ { next=DPWM_1, cond_addr=DLOAD_0, reg=NONE, irq=OFF, data=PERD_CNT0};
DPWM_1 PWCNT { next=PPWM_1, hr_lr=LOW, cond_addr=PPWM_1, pin=PIN_PWM1, action=POL_PWM1, reg=NONE, irq=OFF, data=DUTY_CNT1, hr_data=0};
PPWM_1 DJZ { next=DPWM_2, cond_addr=DLOAD_1, reg=NONE, irq=OFF, data=PERD_CNT1};
DPWM_2 PWCNT { next=PPWM_2, hr_lr=LOW, cond_addr=PPWM_2, pin=PIN_PWM2, action=POL_PWM2, reg=NONE, irq=OFF, data=DUTY_CNT2, hr_data=0};
PPWM_2 DJZ { next=DPWM_3, cond_addr=DLOAD_2, reg=NONE, irq=OFF, data=PERD_CNT2};
DPWM_3 PWCNT { next=PPWM_3, hr_lr=LOW, cond_addr=PPWM_3, pin=PIN_PWM3, action=POL_PWM3, reg=NONE, irq=OFF, data=DUTY_CNT3, hr_data=0};
PPWM_3 DJZ { next=DPWM_4, cond_addr=DLOAD_3, reg=NONE, irq=OFF, data=PERD_CNT3};
DPWM_4 PWCNT { next=PPWM_4, hr_lr=LOW, cond_addr=PPWM_4, pin=PIN_PWM4, action=POL_PWM4, reg=NONE, irq=OFF, data=DUTY_CNT4, hr_data=0};
PPWM_4 DJZ { next=DPWM_5, cond_addr=DLOAD_4, reg=NONE, irq=OFF, data=PERD_CNT4};
DPWM_5 PWCNT { next=PPWM_5, hr_lr=LOW, cond_addr=PPWM_5, pin=PIN_PWM5, action=POL_PWM5, reg=NONE, irq=OFF, data=DUTY_CNT5, hr_data=0};
PPWM_5 DJZ { next=DPWM_6, cond_addr=DLOAD_5, reg=NONE, irq=OFF, data=PERD_CNT5};
DPWM_6 PWCNT { next=PPWM_6, hr_lr=LOW, cond_addr=PPWM_6, pin=PIN_PWM6, action=POL_PWM6, reg=NONE, irq=OFF, data=DUTY_CNT6, hr_data=0};
PPWM_6 DJZ { next=DPWM_7, cond_addr=DLOAD_6, reg=NONE, irq=OFF, data=PERD_CNT6};
DPWM_7 PWCNT { next=PPWM_7, hr_lr=LOW, cond_addr=PPWM_7, pin=PIN_PWM7, action=POL_PWM7, reg=NONE, irq=OFF, data=DUTY_CNT7, hr_data=0};
PPWM_7 DJZ { next=EDGE_0, cond_addr=DLOAD_7, reg=NONE, irq=OFF, data=PERD_CNT7};

; EDGE0 to EDGE7 are for Edge capturing and counting
EDGE_0 ECNT { next=EDGE_1, cond_addr=EDGE_1, pin=PIN_EDGE0, event=POL_EDGE0, reg=NONE, irq=ON, data=0};
EDGE_1 ECNT { next=EDGE_2, cond_addr=EDGE_2, pin=PIN_EDGE1, event=POL_EDGE1, reg=NONE, irq=ON, data=0};
EDGE_2 ECNT { next=EDGE_3, cond_addr=EDGE_3, pin=PIN_EDGE2, event=POL_EDGE2, reg=NONE, irq=ON, data=0};
EDGE_3 ECNT { next=EDGE_4, cond_addr=EDGE_4, pin=PIN_EDGE3, event=POL_EDGE3, reg=NONE, irq=ON, data=0};
EDGE_4 ECNT { next=EDGE_5, cond_addr=EDGE_5, pin=PIN_EDGE4, event=POL_EDGE4, reg=NONE, irq=ON, data=0};
EDGE_5 ECNT { next=EDGE_6, cond_addr=EDGE_6, pin=PIN_EDGE5, event=POL_EDGE5, reg=NONE, irq=ON, data=0};
EDGE_6 ECNT { next=EDGE_7, cond_addr=EDGE_7, pin=PIN_EDGE6, event=POL_EDGE6, reg=NONE, irq=ON, data=0};
EDGE_7 ECNT { next=DUTYCAP_0, cond_addr=DUTYCAP_0, pin=PIN_EDGE7, event=POL_EDGE7, reg=NONE, irq=ON, data=0};

; DUTYCAP_0 to PERDCAP_7 are for Signal Capture and Measurement
DUTYCAP_0 PCNT { next=PERDCAP_0, irq=OFF, type=POL_DCAP0, pin=PIN_DUTYCAP0, period=0, data=0};
PERDCAP_0 PCNT { next=DUTYCAP_1, irq=OFF, type=POL_PCAP0, pin=PIN_PERDCAP0, period=0, data=0};
DUTYCAP_1 PCNT { next=PERDCAP_1, irq=OFF, type=POL_DCAP1, pin=PIN_DUTYCAP1, period=0, data=0};
PERDCAP_1 PCNT { next=DUTYCAP_2, irq=OFF, type=POL_PCAP1, pin=PIN_PERDCAP1, period=0, data=0};
DUTYCAP_2 PCNT { next=PERDCAP_2, irq=OFF, type=POL_DCAP2, pin=PIN_DUTYCAP2, period=0, data=0};
PERDCAP_2 PCNT { next=DUTYCAP_3, irq=OFF, type=POL_PCAP2, pin=PIN_PERDCAP2, period=0, data=0};
DUTYCAP_3 PCNT { next=PERDCAP_3, irq=OFF, type=POL_DCAP3, pin=PIN_DUTYCAP3, period=0, data=0};
PERDCAP_3 PCNT { next=DUTYCAP_4, irq=OFF, type=POL_PCAP3, pin=PIN_PERDCAP3, period=0, data=0};
DUTYCAP_4 PCNT { next=PERDCAP_4, irq=OFF, type=POL_DCAP4, pin=PIN_DUTYCAP4, period=0, data=0};
PERDCAP_4 PCNT { next=DUTYCAP_5, irq=OFF, type=POL_PCAP4, pin=PIN_PERDCAP4, period=0, data=0};
DUTYCAP_5 PCNT { next=PERDCAP_5, irq=OFF, type=POL_DCAP5, pin=PIN_DUTYCAP5, period=0, data=0};
PERDCAP_5 PCNT { next=DUTYCAP_6, irq=OFF, type=POL_PCAP5, pin=PIN_PERDCAP5, period=0, data=0};
DUTYCAP_6 PCNT { next=PERDCAP_6, irq=OFF, type=POL_DCAP6, pin=PIN_DUTYCAP6, period=0, data=0};
PERDCAP_6 PCNT { next=DUTYCAP_7, irq=OFF, type=POL_PCAP6, pin=PIN_PERDCAP6, period=0, data=0};
DUTYCAP_7 PCNT { next=PERDCAP_7, irq=OFF, type=POL_DCAP7, pin=PIN_DUTYCAP7, period=0, data=0};
PERDCAP_7 PCNT { next=TSTMP, irq=OFF, type=POL_PCAP7, pin=PIN_PERDCAP7, period=0, data=0};

; DLOAD_0 to PLOAD_7 are for updating the instructions DPWM_0 to PPWM_7 when the DJZ counts reach zero(i.e. one time period ends)
DLOAD_0 MOV64 { next=PLOAD_0, remote=DPWM_0, en_pin_action=ENABLE_PWM0, cond_addr=PPWM_0, pin=PIN_PWM0, comp_mode=ECMP, action=POL_PWM0, reg=NONE, irq=EOD_IRQ0, data=DUTY_LOAD0};
PLOAD_0 MOV64 { next=DPWM_1, remote=PPWM_0, cond_addr=DLOAD_0, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ0, data=PERD_LOAD0};
DLOAD_1 MOV64 { next=PLOAD_1, remote=DPWM_1, en_pin_action=ENABLE_PWM1, cond_addr=PPWM_1, pin=PIN_PWM1, comp_mode=ECMP, action=POL_PWM1, reg=NONE, irq=EOD_IRQ1, data=DUTY_LOAD1};
PLOAD_1 MOV64 { next=DPWM_2, remote=PPWM_1, cond_addr=DLOAD_1, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ1, data=PERD_LOAD1};
DLOAD_2 MOV64 { next=PLOAD_2, remote=DPWM_2, en_pin_action=ENABLE_PWM2, cond_addr=PPWM_2, pin=PIN_PWM2, comp_mode=ECMP, action=POL_PWM2, reg=NONE, irq=EOD_IRQ2, data=DUTY_LOAD2};
PLOAD_2 MOV64 { next=DPWM_3, remote=PPWM_2, cond_addr=DLOAD_2, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ2, data=PERD_LOAD2};
DLOAD_3 MOV64 { next=PLOAD_3, remote=DPWM_3, en_pin_action=ENABLE_PWM3, cond_addr=PPWM_3, pin=PIN_PWM3, comp_mode=ECMP, action=POL_PWM3, reg=NONE, irq=EOD_IRQ3, data=DUTY_LOAD3};
PLOAD_3 MOV64 { next=DPWM_4, remote=PPWM_3, cond_addr=DLOAD_3, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ3, data=PERD_LOAD3};
DLOAD_4 MOV64 { next=PLOAD_4, remote=DPWM_4, en_pin_action=ENABLE_PWM4, cond_addr=PPWM_4, pin=PIN_PWM4, comp_mode=ECMP, action=POL_PWM4, reg=NONE, irq=EOD_IRQ4, data=DUTY_LOAD4};
PLOAD_4 MOV64 { next=DPWM_5, remote=PPWM_4, cond_addr=DLOAD_4, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ4, data=PERD_LOAD4};
DLOAD_5 MOV64 { next=PLOAD_5, remote=DPWM_5, en_pin_action=ENABLE_PWM5, cond_addr=PPWM_5, pin=PIN_PWM5, comp_mode=ECMP, action=POL_PWM5, reg=NONE, irq=EOD_IRQ5, data=DUTY_LOAD5};
PLOAD_5 MOV64 { next=DPWM_6, remote=PPWM_5, cond_addr=DLOAD_5, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ5, data=PERD_LOAD5};
DLOAD_6 MOV64 { next=PLOAD_6, remote=DPWM_6, en_pin_action=ENABLE_PWM6, cond_addr=PPWM_6, pin=PIN_PWM6, comp_mode=ECMP, action=POL_PWM6, reg=NONE, irq=EOD_IRQ6, data=DUTY_LOAD6};
PLOAD_6 MOV64 { next=DPWM_7, remote=PPWM_6, cond_addr=DLOAD_6, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ6, data=PERD_LOAD6};
DLOAD_7 MOV64 { next=PLOAD_7, remote=DPWM_7, en_pin_action=ENABLE_PWM7, cond_addr=PPWM_7, pin=PIN_PWM7, comp_mode=ECMP, action=POL_PWM7, reg=NONE, irq=EOD_IRQ7, data=DUTY_LOAD7};
PLOAD_7 MOV64 { next=EDGE_0, remote=PPWM_7, cond_addr=DLOAD_7, comp_mode=ECMP, reg=NONE, irq=EOP_IRQ7, data=PERD_LOAD7};

; TSTMP is for time-stamping
TSTMP WCAP { next=FIRST_INS, cond_addr=FIRST_INS, pin=0, event=NOCOND, reg=T, data=0};
; Instruction TSTMP points back to instruction FIRST_INS and the loop restarts
 
;/***********************************************************************************************/
;/ END OF FILE                                                                                 /
;/***********************************************************************************************/

Thanks!

  • For reference, spna225 contains an error in Appendix A.  Lines 150 and 154 in the code snippet (replicated in original post above) are missing the numbers at the end of the DUTY_CNT labels.  They should read DUTY_CNT3 and DUTY_CNT4, respectively, which fixes all build issues.