PDA

View Full Version : Discovering PIC 16F18446 - TOGGLE "ASM WARNING - Invalid RAM location"



flotulopex
- 17th February 2024, 21:06
Hi there,

I'm playing around the 16F18446.

I just noticed the following:
9617

I have used 73 words.


Now I'm trying to go for TOGGLE so:
9618

I "spared" 4 words and the blinker still works.

Do I have to care about this warning?

richard
- 18th February 2024, 09:51
substituting LATx registers for PORTx registers in pbp high level command statements will not work as you might hope
it can introduce subtle and difficult to diagnose bugs, it also will never set the TRISx registers in the manner those statements expect


Do I have to care about this warning?
only if you want your code to work correctly

see this
https://www.picbasic.co.uk/forum/showthread.php/24581-OWOUT-Glitch

Ioannis
- 18th February 2024, 14:08
Since the introduction of LAT registers, I cannot remember where I read it, maybe it was in Melabs either help file or this forum, we had to use LAT instead of PORT registers.

Οn some PIC it will not work properly.

But I have not found an explanation on this matter.

Ioannis

flotulopex
- 18th February 2024, 15:41
...only if you want your code to work correctly

Who wouldn't? :D

At this point, it's just about blinking that LED.

But after that, how will I be able to avoid any such kind of "mistakes"?

Please, please don't answer "Easy! Just rfm!!!"

For week-ends hobbyist like me, is it better to stay with more "modest" PICs and/or always use workarounds like instead of:

TOGGLE LATB.6
PAUSE 500

...I should choose to stay with:

LATB.6 = 1
PAUSE 500
LATB.6 = 0
PAUSE 500

richard
- 18th February 2024, 21:12
For week-ends hobbyist like me, is it better to stay with more "modest" PICs and/or always use workarounds like instead

it has nothing to do with with the pic chip at all. its simply incorrect usage of the pbp high level commands


Please, please don't answer "Easy! Just rfm!!!
did you even look at the link i suggested ? i don't know why i bother



all pbp "high level" commands that set a pin direction use a fixed offset to get to the tris reg
it simply will not work correctly from a LATx offset [serout , serout2, toggle,high,low,i2cread........................... ....... ie all of them

PORTx + offset always equals the TRISx register, LATx + offset does not equal the TRISx register ever

if you don't believe my then look at the lst file generated by your code



TOGGLE LATB.6
PAUSE 500

is improper use


TOGGLE PORTB.6
PAUSE 500

is proper use



LATB.6 = 1
PAUSE 500
LATB.6 = 0
PAUSE 500
is proper use


latb.6=!latb.6
PAUSE 500
is proper use

richard
- 18th February 2024, 21:37
TRY THIS



' PIC 16F18446
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG


' ====== DEFINES ================================================== =================================
DEFINE OSC 4
ANSELB = $B0;
OSCCON1 = $60; // CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCEN = 0 ; // HFFRQ 4_MHz;
OSCFRQ = 2; // HFTUN 0;
OSCTUNE = 0


' ====== TEST PROGRAM ================================================== ============================
TEST:
TOGGLE PORTB.6
pause 500
GOTO TEST
END


THEN THIS




' PIC 16F18446
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG


' ====== DEFINES ================================================== =================================
DEFINE OSC 4
ANSELB = $B0;
OSCCON1 = $60; // CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCEN = 0 ; // HFFRQ 4_MHz;
OSCFRQ = 2; // HFTUN 0;
OSCTUNE = 0


' ====== TEST PROGRAM ================================================== ============================
TEST:
TOGGLE LATB.6
pause 500
GOTO TEST
END


WHICH ONE WORKS ?

flotulopex
- 24th February 2024, 18:11
Richard,

Sorry for my late reply.

First or upper code in your previous message dosen't work. The LED is steady ON and no warning message.

Lower or second code doesn't work either; no LED blinking AND I do have the warning message showing up again.

And "yes", I went to read the post you pointed me at.

Currently, this is the code that will make the LED blink and have no warnings after compiling:
' PIC 16F18446

#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG

' ====== REGISTERS SETTINGS ================================================== =====================
TRISB.6 = 0

' Oscillator Control Register1
OSCCON1 = %01100000 ' $60

' HFFRQ - Oscillator's Frequency Selection Register
OSCFRQ = %00000010 ' 4MHz

' ====== TEST PROGRAM ================================================== ===========================
TEST:
LATB.6 = 1
PAUSE 500
LATB.6 = 0
PAUSE 500
GOTO TEST
END

Ioannis
- 24th February 2024, 21:52
That is the proper way to do it.

Ioannis

richard
- 24th February 2024, 22:47
First or upper code in your previous message dosen't work

this works perfectly for me, i doubt you implemented it exactly as posted
i notice you don't set the pins used to digital mode

another correct way


' PIC 16F18426
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG


' ====== DEFINES ================================================== =================================
DEFINE OSC 4
ANSELC = $DF;
OSCCON1 = $60; // CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCEN = 0 ; // HFFRQ 4_MHz;
OSCFRQ = 2; // HFTUN 0;
OSCTUNE = 0


' ====== TEST PROGRAM ================================================== ============================
TEST:


TOGGLE PORTC.5
pause 500

GOTO TEST
END

flotulopex
- 25th February 2024, 14:39
Richard, this is your exact code (no changes at all) and it lights the LED steady ON:
' PIC 16F18446
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG


' ====== DEFINES ================================================== =================================
DEFINE OSC 4
ANSELB = $B0;
OSCCON1 = $60; // CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCEN = 0 ; // HFFRQ 4_MHz;
OSCFRQ = 2; // HFTUN 0;
OSCTUNE = 0


' ====== TEST PROGRAM ================================================== ============================
TEST:
TOGGLE PORTB.6
pause 500
GOTO TEST
END


Unfortunately, the third example dosen't work either, this one:
' PIC 16F18426
#CONFIG
__config _CONFIG1, _FEXTOSC_OFF & _RSTOSC_HFINT1 & _CLKOUTEN_OFF & _CSWEN_ON & _FCMEN_ON
__config _CONFIG2, _MCLRE_ON & _PWRTS_PWRT_64 & _LPBOREN_OFF & _BOREN_SBOREN & _BORV_LO & _ZCDDIS_OFF & _PPS1WAY_OFF & _STVREN_ON
__config _CONFIG3, _WDTCPS_WDTCPS_31 & _WDTE_SWDTEN & _WDTCWS_WDTCWS_7 & _WDTCCS_LFINTOSC
__config _CONFIG4, _BBSIZE_BB512 & _BBEN_OFF & _SAFEN_OFF & _WRTAPP_OFF & _WRTB_OFF & _WRTC_OFF & _WRTD_OFF & _WRTSAF_OFF & _LVP_OFF
__config _CONFIG5, _CP_OFF
#ENDCONFIG


' ====== DEFINES ================================================== =================================
DEFINE OSC 4
ANSELC = $DF;
OSCCON1 = $60; // CSWHOLD may proceed; SOSCPWR Low power;
OSCCON3 = 0; // MFOEN disabled; LFOEN disabled; ADOEN disabled; SOSCEN disabled; EXTOEN disabled; HFOEN disabled;
OSCEN = 0 ; // HFFRQ 4_MHz;
OSCFRQ = 2; // HFTUN 0;
OSCTUNE = 0


' ====== TEST PROGRAM ================================================== ============================
TEST:


TOGGLE PORTC.5
pause 500

GOTO TEST
END


Maybe this last code doesnt work because you seem to use a 16F8246 not a 16F18446 like I have.

Honestly, I can have a real good life with LATBs commands instead of TOGGLEs :wink:

Ioannis
- 25th February 2024, 20:35
TOGGLE will not work.

Richard did explain why at post #5.

So, you have to use either directly PORT or LAT commands. Personally, never liked the TOGGLE command and always preferred to use discrete commands. Bonus that you know the final state of the register. With TOGGLE you only know that it has changed. Not how.

Ioannis