View Full Version : Temp variables exceeding LastTvar "Increase the MaxTvars constant"
Demon
- 4th October 2024, 00:04
I get that error with this IF:
IF (UsartFlag = 1) and _
(RecvData[0] = UsartRight) and _
(RecvData[1] = UsartSlave) and _
(RecvData[2] = Usart0) and _
(RecvData[3] = UsartC) and _
(RecvData[4] = Usart2) then
GOSUB DisplayCOM1
UsartFlag = 0
endif
The error goes away if I bump up MaxTvars to 6 in ReEnterPBP.bas.
Was that the proper thing to do? Or will that cause more problems down the road?
(I would think not, but just making sure)
richard
- 4th October 2024, 00:51
try array read
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,ndisp,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart2)]
GOSUB DisplayCOM1
ndisp:
UsartFlag = 0
endif
Demon
- 4th October 2024, 01:54
try array read ...
Thanks, it works perfect with MaxTvars CON 4 now.
:cool:
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue1,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart2)]
GOSUB DisplayCOM1
UsartFlag = 0
MainloopContinue1:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue2,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart3)]
GOSUB DisplayCOM1_Standby
UsartFlag = 0
MainloopContinue2:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue3,[wait(UsartRight,UsartSlave,Usart0,UsartE,Usart2)]
GOSUB DisplayCOM2
UsartFlag = 0
MainloopContinue3:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue4,[wait(UsartRight,UsartSlave,Usart0,UsartE,Usart3)]
GOSUB DisplayCOM2_Standby
UsartFlag = 0
MainloopContinue4:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue5,[wait(UsartRight,UsartSlave,Usart0,UsartD,Usart2)]
GOSUB DisplayNAV1
UsartFlag = 0
MainloopContinue5:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue6,[wait(UsartRight,UsartSlave,Usart0,UsartD,Usart3)]
GOSUB DisplayNAV1_Standby
UsartFlag = 0
MainloopContinue6:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue7,[wait(UsartRight,UsartSlave,Usart0,UsartF,Usart2)]
GOSUB DisplayNAV2
UsartFlag = 0
MainloopContinue7:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue8,[wait(UsartRight,UsartSlave,Usart0,UsartF,Usart3)]
GOSUB DisplayNAV2_Standby
UsartFlag = 0
MainloopContinue8:
endif
(add another PBP command to the list of stuff I never tried before).
richard
- 4th October 2024, 03:54
it could simplify further
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,itsadud,[wait(UsartRight,UsartSlave,Usart0)]
select case RecvData[3]
case UsartC
IF RecvData[4] == Usart2 THEN
GOSUB GOSUB DisplayCOM1
else
GOSUB GOSUB DisplayCOM1_Standby
endif
case UsartD
IF RecvData[4] == Usart2 THEN
GOSUB GOSUB DisplayCOM2
else
GOSUB GOSUB DisplayCOM2_Standby
endif
case UsartE
IF RecvData[4] == Usart2 THEN
GOSUB GOSUB DisplayNAV1
else
GOSUB GOSUB DisplayNAV1_Standby
endif
case UsartF
IF RecvData[4] == Usart2 THEN
GOSUB GOSUB DisplayNAV2
else
GOSUB GOSUB DisplayNAV2_Standby
endif
end select
itsadud:
UsartFlag = 0
endif
Demon
- 4th October 2024, 05:20
it could simplify further...
Definitely, but I'm not finished adding conditions.
I really like your original ArrayRead suggestion; it'll be easy to keep expanding new record layouts (sorry, old mainframe habits :) ).
Ioannis
- 4th October 2024, 15:10
try array read
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,ndisp,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart2)]
GOSUB DisplayCOM1
ndisp:
UsartFlag = 0
endif
Can't help it. Very clever programming!
Ioannis
richard
- 5th October 2024, 04:23
I really like your original ArrayRead suggestion; it'll be easy to keep expanding new record layouts (sorry, old mainframe habits ).
i did a little test , your way is 4 times bigger code and executes upto 10 times slower
#CONFIG __config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT32 & _CLKOUTEN_OFF & _CSWEN_OFF & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTE_OFF & _LPBOREN_OFF & _BOREN_ON & _BORV_LO & _ZCD_OFF & _PPS1WAY_OFF & _STVREN_ON & _DEBUG_OFF
__config _CONFIG3, _WDTCPS_WDTCPS_11 & _WDTE_ON & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _WRT_OFF & _SCANE_available & _LVP_ON
__config _CONFIG5, _CP_OFF & _CPD_OFF
#ENDCONFIG
DEFINE OSC 32
include "codesize.pbp"
define Measure 1
DEFINE DEBUG_REG PORTB
DEFINE DEBUG_BIT 7
DEFINE DEBUG_BAUD 9600
DEFINE DEBUG_MODE 0
PORTB.7 = 1
trisb=%01100111
anselb=0
UsartFlag var byte
RecvData var byte[5]
CNTr VAR BYTE
UsartRight con 1
UsartSlave con 2
Usart0 con 3
UsartC con 1
UsartE con 2
UsartD con 3
UsartF con 4
Usart2 con 0
Usart3 con 5
cntr=10
RecvData[0]=UsartRight
RecvData[1]=UsartSlave
RecvData[2]=Usart0
DEBUG 13,10,"go"
LOOOP:
pause 500
UsartFlag = 1
RecvData[3]= cntr dig 1
RecvData[4]= cntr dig 0
cntr=cntr+5
if cntr = 50 then cntr=10
DEBUG 13,10, #cntr
latb.4=1
@ StartSize(rc)
' IF (UsartFlag = 1) then
' ARRAYREAD RecvData,5,itsadud,[wait(UsartRight,UsartSlave,Usart0)]
' select case RecvData[3]
' case UsartC
' IF RecvData[4] == Usart2 THEN
' GOSUB DisplayCOM1
' else
' GOSUB DisplayCOM1_Standby
' endif
' case UsartD
' IF RecvData[4] == Usart2 THEN
' GOSUB DisplayCOM2
' else
' GOSUB DisplayCOM2_Standby
' endif
' case UsartE
' IF RecvData[4] == Usart2 THEN
' GOSUB DisplayNAV1
' else
' GOSUB DisplayNAV1_Standby
' endif
' case UsartF
' IF RecvData[4] == Usart2 THEN
' GOSUB DisplayNAV2
' else
' GOSUB DisplayNAV2_Standby
' endif
' end select
' itsadud:
' UsartFlag = 0
' endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue1,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart2)]
GOSUB DisplayCOM1
UsartFlag = 0
MainloopContinue1:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue2,[wait(UsartRight,UsartSlave,Usart0,UsartC,Usart3)]
GOSUB DisplayCOM1_Standby
UsartFlag = 0
MainloopContinue2:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue3,[wait(UsartRight,UsartSlave,Usart0,UsartE,Usart2)]
GOSUB DisplayCOM2
UsartFlag = 0
MainloopContinue3:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue4,[wait(UsartRight,UsartSlave,Usart0,UsartE,Usart3)]
GOSUB DisplayCOM2_Standby
UsartFlag = 0
MainloopContinue4:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue5,[wait(UsartRight,UsartSlave,Usart0,UsartD,Usart2)]
GOSUB DisplayNAV1
UsartFlag = 0
MainloopContinue5:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue6,[wait(UsartRight,UsartSlave,Usart0,UsartD,Usart3)]
GOSUB DisplayNAV1_Standby
UsartFlag = 0
MainloopContinue6:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue7,[wait(UsartRight,UsartSlave,Usart0,UsartF,Usart2)]
GOSUB DisplayNAV2
UsartFlag = 0
MainloopContinue7:
endif
IF (UsartFlag = 1) then
ARRAYREAD RecvData,5,MainloopContinue8,[wait(UsartRight,UsartSlave,Usart0,UsartF,Usart3)]
GOSUB DisplayNAV2_Standby
UsartFlag = 0
MainloopContinue8:
endif
@ EndSize(rc)
latb.4=0
GOTO LOOOP
DisplayCOM1:
DisplayCOM1_Standby:
DisplayCOM2:
DisplayCOM2_Standby:
DisplayNAV1:
DisplayNAV1_Standby:
DisplayNAV2:
DisplayNAV2_Standby:
DEBUG " ",#RecvData[3]," ",#RecvData[4]
RETURN
Demon
- 5th October 2024, 04:49
i did a little test , your way is 4 times bigger code and executes upto 10 times slower...
Note to self, revisit this thread later.
richard
- 5th October 2024, 05:47
timestamps as used on mainframes/unix etc are imho the simplest,easiest and most efficient way to measure time periods accurately. they work marvelously on pic micros too, i have tried to demonstrate their usage on this and the other forum many times. the amount of interest generated was approximately nil.
see this [read through to end]
https://support.melabs.com/forum/picbasic-pro-compiler-3-0-and-later/asm-assembly-language-in-picbasic-pro/972-asm-error-address-label-duplicated-ot-different-in-second-pass/page2
timestamps can take whatever form required to suit your needs and are infinitely adaptable
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.