PDA

View Full Version : Port Variables act like Constants



MOUNTAIN747
- 6th March 2011, 16:53
My project has both USB and RS485 com ports. I would like to switch between active com ports by using a hardware dip switch. This would save a lot of code and time.



DS1 VAR PortA.1 ;dip switch
TX_USB VAR PortC.6
TX_RS485 VAR PortC.5
ComVar VAR BYTE
If DS1=1 then
ComVar=TX_USB
Else
ComVar=TX_RS485
EndIF
Serout1 ComVar, 84 [“Transmitting “]

OK, so we know this will not work. Melanie explained why in this post http://www.picbasic.co.uk/forum/showthread.php?t=11801 but stopped short of a solution to the problem, if there is one. I’ve found several posts on this subject, none of which find solutions.
So how do I set a Port Variable within a Serout statement to switch between two ports?


If DS1=1 then
ComVar=6
Else
ComVar=5
EndIF
If ComVar=7 then
Serout2 PortC.0[ComVar], 84, [“ Com is USB”]
Else
Serout2 PortC.0[ComVar], 84, [“ Com is RS485”]
EndIF
This compiles but it doesn’t work either, Is it for the same reasons the first example failed? There must be some way to solve this problem ??? There must be a different approach that I just haven’t found. Comments please.

master_olan
- 7th March 2011, 04:45
Hi MOUNTAIN747.. why not just use GOTO statements? I think it's easier to do...

DS1 VAR PortA.1 ;dip switch

start:
If DS1=1 then
goto tx_usb
Else
goto tx_rs485
EndIF

tx_usb:
Serout portc.6, 84 ["Transmitting USB"]
goto start

tx_rs485:
Serout2 portc.5, 84 ["Transmitting RS485"]
goto start


Adding PAUSE's can help...

MOUNTAIN747
- 7th March 2011, 14:15
Thank you for your reply Olan,
The program has to print out 12 or more different messages when it uploads 30 days of stored data. I’ve run out of EEprom so the messages are at a high cost in code space. If I can use only one message for both USB, which is the primary port, and RS485, which is used only occasionally, it will save 1800 words of code space.

Darrel Taylor
- 7th March 2011, 14:30
Look in the .bas file for the chip you are using.
If it's a 16F877A then open c:\pbp\16f877a.bas

The PORTL and PORTH aliases are used for the PIN numbers (0-15)
PORTL is 0-7 and PORTH is 8-15.

PORTL VAR PORTB
PORTH VAR PORTC
TRISL VAR TRISB
TRISH VAR TRISC

If PORTH is aliased to PORTC then you don't need to do anything.
If it's not, change it to PORTC, and change TRISH to alias TRISC.

Then you can use the PIN numbers to access the pins with a variable.

If DS1=1 then
ComVar=14 ; PORTC.6
Else
ComVar=13 ; PORTC.5
EndIF

Serout2 ComVar, 84, [“ Com is PIN - ”, DEC ComVar,13,10]

MOUNTAIN747
- 7th March 2011, 17:29
Darrel,
Thanks again, you make it look so easy! After two days of working with this I now know I was searching for the wrong topics. I haven’t found anything about the .bas file in the manual. I think this subject deserves a WiKi along side your other documents.

By the way, to those who had a hand in creating the Wiki and those who maintain it, ITS GREAT!