PDA

View Full Version : Calling Macro After Cross Page Boundry



MikeWinston
- 24th September 2012, 19:11
Hello,
Writing a small application to write to Nokia 5110 LCD. I am using code found in the wiki section with some small changes. I am not using the PrintStr macro.
It is the PrintVar macro i am using. I don't do much macro work and need some help.

I seem to be having trouble when i use a macro and i get cross page boundry warnings when compiling. That is to say, when i don't get the boundry
warnings, (i reduce my code size), everything is o.k. Otherwise screen gets full of characters. I suspects chip has lost its way.

PBP3
MPLab 8.83
PicKit 3 (programmer and powering circuit 3.3V)
PIC16F1825
Nokia 5110 LCD

thanks,
Mike


#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__config _CONFIG2, _PLLEN_OFF & _LVP_OFF & _WRT_ALL & _STVREN_OFF & _BORV_19
#ENDCONFIG


DEFINE OSC 4
DEFINE NO_CLRWDT 1

'don't display page boundry error
'@ ERRORLEVEL -306



'--- Inputs ---



'--- Outputs ---
lcd_DC var PORTA.2
lcd_RES var PORTC.0
lcd_CLK var PORTC.1
lcd_SDO var PORTC.2
lcd_SCE var PORTC.3



'--- Variables ---
posX var byte
posY var byte
FC var byte[5] '5 bytes = 1 character
lcd_Data var byte 'LCD command or data
columnNum var byte
charNum var byte
temp var word

'for PrintVar macro
varData var word 'variable to print to lcd
n var byte 'for/next variable
digits var bit 'number of digits in varData




'=== Initialize Chip ================================================== ========
InitChip:
'set internal clock to 4MHz
OSCCON = %01101000

PORTA = 0
LATA = 0
PORTC = 0
LATC = 0

'setup port i/o
TRISA = %001011
TRISC = %000000

'turn off all a/d inputs
ANSELA = 0
ANSELC = 0

'power on delay
pause 20

gosub LcdInit
gosub LcdClear
goto Main




'===[ Subroutines ]================================================== ==============
'PrintVar Macro
'Example: @ PrintVar x,y, _variableName
asm
PrintVar macro x, y, Variable
local OverVar
goto OverVar
OverVar
MOVE?CB x, _posX ;move x from above statement to PosX
MOVE?CB y, _posY ;move y from above statement to PosY
MOVE?WW Variable, _varData ;move variable to VarData
L?CALL _VariableOut
endm
endasm
VariableOut:
@ bcf _digits
for n = 4 to 0 step -1 'cycles through all possible digts of number
gosub LcdGotoXY 'place character at position PosX and PosY
lcd_Data = (varData dig n) + 48 'digit number n to character str format
if lcd_data = 48 and digits = 0 then SkipChar 'skip if first char is 0
@ bsf _digits 'show that one character has been printed
gosub LcdSendChar 'print char to screen
posX = posX + 6 'next x position for character
SkipChar:
next
return



LcdInit:
lcd_RES = 0 'reset LCD (HW reset)
pause 1
lcd_RES = 1 'release reset
lcd_SCE = 0 'chip select
lcd_DC = 0 'command mode

lcd_Data = $21 : gosub LcdSendByte 'LCD EXTENDED COMMANDS
lcd_Data = $c8 : gosub LcdSendByte 'SET LCD Vop (CONTRAST)
lcd_Data = $06 : gosub LcdSendByte 'SET TEMP COEFFICENT
lcd_Data = $13 : gosub LcdSendByte 'LCD BIAS MODE
lcd_Data = $20 : gosub LcdSendByte 'LCD STANDARD COMMANDS
lcd_data = $08 : gosub LcdSendByte 'LCD Blank
lcd_Data = $0c : gosub LcdSendByte 'LCD NORMAL MODE
return



LcdSendByte:
shiftout lcd_SDO,lcd_CLK,1,[lcd_Data]
return



LcdClear:
gosub LcdHome
lcd_DC = 1
for columnNum = 1 to 84 'Send empty character
shiftout lcd_SDO,lcd_CLK,1,[0,0,0,0,0,0] '14 per page
next '6 rows
return '14 * 6 = 84



LcdHome:
posX = 0
posY = 0
gosub LcdGotoXY
return



LcdGotoXY:
lcd_DC = 0
lcd_Data = %01000000 | posY : gosub LcdSendByte
lcd_Data = %10000000 | posX : gosub LcdSendByte
return



LcdContrast:
lcd_DC = 0
lcd_Data = %11010001
gosub LcdSendByte
return



ScrNormal:
lcd_DC = 0
lcd_Data = %00001100
gosub LcdSendByte
return



ScrInvert:
lcd_DC = 0
lcd_Data = %00001101
gosub LcdSendByte
return



LcdSendChar:
lookdown lcd_data,[" !\#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"],charNum

lcd_data = charNum + 32

select case lcd_data
case 32
FC(0)=$00 : FC(1)=$00 : FC(2)=$00 : FC(3)=$00 : FC(4)=$00 ' sp
case 33
FC(0)=$00 : FC(1)=$00 : FC(2)=$2f : FC(3)=$00 : FC(4)=$00 ' !
case 34
FC(0)=$00 : FC(1)=$07 : FC(2)=$00 : FC(3)=$07 : FC(4)=$00 ' " (use \ to display " )
case 35
FC(0)=$14 : FC(1)=$7f : FC(2)=$14 : FC(3)=$7f : FC(4)=$14 ' #
case 36
FC(0)=$24 : FC(1)=$2a : FC(2)=$7f : FC(3)=$2a : FC(4)=$12 ' $
case 37
FC(0)=$c4 : FC(1)=$c8 : FC(2)=$10 : FC(3)=$26 : FC(4)=$46 ' %
case 38
FC(0)=$36 : FC(1)=$49 : FC(2)=$55 : FC(3)=$22 : FC(4)=$50 ' &
case 39
FC(0)=$00 : FC(1)=$05 : FC(2)=$03 : FC(3)=$00 : FC(4)=$00 ' '
case 40
FC(0)=$00 : FC(1)=$1c : FC(2)=$22 : FC(3)=$41 : FC(4)=$00 ' (
case 41
FC(0)=$00 : FC(1)=$41 : FC(2)=$22 : FC(3)=$1c : FC(4)=$00 ' )
case 42
FC(0)=$14 : FC(1)=$08 : FC(2)=$3E : FC(3)=$08 : FC(4)=$14 ' *
case 43
FC(0)=$08 : FC(1)=$08 : FC(2)=$3E : FC(3)=$08 : FC(4)=$08 ' +
case 44
FC(0)=$00 : FC(1)=$00 : FC(2)=$50 : FC(3)=$30 : FC(4)=$00 ' ,
case 45
FC(0)=$10 : FC(1)=$10 : FC(2)=$10 : FC(3)=$10 : FC(4)=$10 ' -
case 46
FC(0)=$00 : FC(1)=$60 : FC(2)=$60 : FC(3)=$00 : FC(4)=$00 ' .
case 47
FC(0)=$20 : FC(1)=$10 : FC(2)=$08 : FC(3)=$04 : FC(4)=$02 ' /
case 48
FC(0)=$3E : FC(1)=$51 : FC(2)=$49 : FC(3)=$45 : FC(4)=$3E ' 0
case 49
FC(0)=$00 : FC(1)=$42 : FC(2)=$7F : FC(3)=$40 : FC(4)=$00 ' 1
case 50
FC(0)=$42 : FC(1)=$61 : FC(2)=$51 : FC(3)=$49 : FC(4)=$46 ' 2
case 51
FC(0)=$21 : FC(1)=$41 : FC(2)=$45 : FC(3)=$4B : FC(4)=$31 ' 3
case 52
FC(0)=$18 : FC(1)=$14 : FC(2)=$12 : FC(3)=$7F : FC(4)=$10 ' 4
case 53
FC(0)=$27 : FC(1)=$45 : FC(2)=$45 : FC(3)=$45 : FC(4)=$39 ' 5
case 54
FC(0)=$3C : FC(1)=$4A : FC(2)=$49 : FC(3)=$49 : FC(4)=$30 ' 6
case 55
FC(0)=$01 : FC(1)=$71 : FC(2)=$09 : FC(3)=$05 : FC(4)=$03 ' 7
case 56
FC(0)=$36 : FC(1)=$49 : FC(2)=$49 : FC(3)=$49 : FC(4)=$36 ' 8
case 57
FC(0)=$06 : FC(1)=$49 : FC(2)=$49 : FC(3)=$29 : FC(4)=$1E ' 9
case 58
FC(0)=$00 : FC(1)=$36 : FC(2)=$36 : FC(3)=$00 : FC(4)=$00 ' :
case 59
FC(0)=$00 : FC(1)=$56 : FC(2)=$36 : FC(3)=$00 : FC(4)=$00 ' ;
case 60
FC(0)=$08 : FC(1)=$14 : FC(2)=$22 : FC(3)=$41 : FC(4)=$00 ' <
case 61
FC(0)=$14 : FC(1)=$14 : FC(2)=$14 : FC(3)=$14 : FC(4)=$14 ' =
case 62
FC(0)=$00 : FC(1)=$41 : FC(2)=$22 : FC(3)=$14 : FC(4)=$08 ' >
case 63
FC(0)=$02 : FC(1)=$01 : FC(2)=$51 : FC(3)=$09 : FC(4)=$06 ' ?
case 64
FC(0)=$32 : FC(1)=$49 : FC(2)=$59 : FC(3)=$51 : FC(4)=$3E ' @
case 65
FC(0)=$7E : FC(1)=$11 : FC(2)=$11 : FC(3)=$11 : FC(4)=$7E ' A
case 66
FC(0)=$7F : FC(1)=$49 : FC(2)=$49 : FC(3)=$49 : FC(4)=$36 ' B
case 67
FC(0)=$3E : FC(1)=$41 : FC(2)=$41 : FC(3)=$41 : FC(4)=$22 ' C
case 68
FC(0)=$7F : FC(1)=$41 : FC(2)=$41 : FC(3)=$22 : FC(4)=$1C ' D
case 69
FC(0)=$7F : FC(1)=$49 : FC(2)=$49 : FC(3)=$49 : FC(4)=$41 ' E
case 70
FC(0)=$7F : FC(1)=$09 : FC(2)=$09 : FC(3)=$09 : FC(4)=$01 ' F
case 71
FC(0)=$3E : FC(1)=$41 : FC(2)=$49 : FC(3)=$49 : FC(4)=$7A ' G
case 72
FC(0)=$7F : FC(1)=$08 : FC(2)=$08 : FC(3)=$08 : FC(4)=$7F ' H
case 73
FC(0)=$00 : FC(1)=$41 : FC(2)=$7F : FC(3)=$41 : FC(4)=$00 ' I
case 74
FC(0)=$20 : FC(1)=$40 : FC(2)=$41 : FC(3)=$3F : FC(4)=$01 ' J
case 75
FC(0)=$7F : FC(1)=$08 : FC(2)=$14 : FC(3)=$22 : FC(4)=$41 ' K
case 76
FC(0)=$7F : FC(1)=$40 : FC(2)=$40 : FC(3)=$40 : FC(4)=$40 ' L
case 77
FC(0)=$7F : FC(1)=$02 : FC(2)=$0C : FC(3)=$02 : FC(4)=$7F ' M
case 78
FC(0)=$7F : FC(1)=$04 : FC(2)=$08 : FC(3)=$10 : FC(4)=$7F ' N
case 79
FC(0)=$3E : FC(1)=$41 : FC(2)=$41 : FC(3)=$41 : FC(4)=$3E ' O
case 80
FC(0)=$7F : FC(1)=$09 : FC(2)=$09 : FC(3)=$09 : FC(4)=$06 ' P
case 81
FC(0)=$3E : FC(1)=$41 : FC(2)=$51 : FC(3)=$21 : FC(4)=$5E ' Q
case 82
FC(0)=$7F : FC(1)=$09 : FC(2)=$19 : FC(3)=$29 : FC(4)=$46 ' R
case 83
FC(0)=$46 : FC(1)=$49 : FC(2)=$49 : FC(3)=$49 : FC(4)=$31 ' S
case 84
FC(0)=$01 : FC(1)=$01 : FC(2)=$7F : FC(3)=$01 : FC(4)=$01 ' T
case 85
FC(0)=$3F : FC(1)=$40 : FC(2)=$40 : FC(3)=$40 : FC(4)=$3F ' U
case 86
FC(0)=$1F : FC(1)=$20 : FC(2)=$40 : FC(3)=$20 : FC(4)=$1F ' V
case 87
FC(0)=$3F : FC(1)=$40 : FC(2)=$38 : FC(3)=$40 : FC(4)=$3F ' W
case 88
FC(0)=$63 : FC(1)=$14 : FC(2)=$08 : FC(3)=$14 : FC(4)=$63 ' X
case 89
FC(0)=$07 : FC(1)=$08 : FC(2)=$70 : FC(3)=$08 : FC(4)=$07 ' Y
case 90
FC(0)=$61 : FC(1)=$51 : FC(2)=$49 : FC(3)=$45 : FC(4)=$43 ' Z
case 91
FC(0)=$00 : FC(1)=$7F : FC(2)=$41 : FC(3)=$41 : FC(4)=$00 ' [
case 92
'to display this character, copy this line and then
'follow with gosub WriteLCD
FC(0)=$02 : FC(1)=$04 : FC(2)=$08 : FC(3)=$10 : FC(4)=$20 ' \
case 93
FC(0)=$00 : FC(1)=$41 : FC(2)=$41 : FC(3)=$7F : FC(4)=$00 ' ]
case 94
FC(0)=$04 : FC(1)=$02 : FC(2)=$01 : FC(3)=$02 : FC(4)=$04 ' ^
case 95
FC(0)=$40 : FC(1)=$40 : FC(2)=$40 : FC(3)=$40 : FC(4)=$40 ' _
case 96
FC(0)=$00 : FC(1)=$01 : FC(2)=$02 : FC(3)=$04 : FC(4)=$00 ' '
case 97
FC(0)=$20 : FC(1)=$54 : FC(2)=$54 : FC(3)=$54 : FC(4)=$78 ' a
case 98
FC(0)=$7F : FC(1)=$48 : FC(2)=$44 : FC(3)=$44 : FC(4)=$38 ' b
case 99
FC(0)=$38 : FC(1)=$44 : FC(2)=$44 : FC(3)=$44 : FC(4)=$20 ' c
case 100
FC(0)=$38 : FC(1)=$44 : FC(2)=$44 : FC(3)=$48 : FC(4)=$7F ' d
case 101
FC(0)=$38 : FC(1)=$54 : FC(2)=$54 : FC(3)=$54 : FC(4)=$18 ' e
case 102
FC(0)=$08 : FC(1)=$7E : FC(2)=$09 : FC(3)=$01 : FC(4)=$02 ' f
case 103
FC(0)=$0C : FC(1)=$52 : FC(2)=$52 : FC(3)=$52 : FC(4)=$3E ' g
case 104
FC(0)=$7F : FC(1)=$08 : FC(2)=$04 : FC(3)=$04 : FC(4)=$78 ' h
case 105
FC(0)=$00 : FC(1)=$44 : FC(2)=$7D : FC(3)=$40 : FC(4)=$00 ' i
case 106
FC(0)=$20 : FC(1)=$40 : FC(2)=$44 : FC(3)=$3D : FC(4)=$00 ' j
case 107
FC(0)=$7F : FC(1)=$10 : FC(2)=$28 : FC(3)=$44 : FC(4)=$00 ' k
case 108
FC(0)=$00 : FC(1)=$41 : FC(2)=$7F : FC(3)=$40 : FC(4)=$00 ' l
case 109
FC(0)=$7C : FC(1)=$04 : FC(2)=$18 : FC(3)=$04 : FC(4)=$78 ' m
case 110
FC(0)=$7C : FC(1)=$08 : FC(2)=$04 : FC(3)=$04 : FC(4)=$78 ' n
case 111
FC(0)=$38 : FC(1)=$44 : FC(2)=$44 : FC(3)=$44 : FC(4)=$38 ' o
case 112
FC(0)=$7C : FC(1)=$14 : FC(2)=$14 : FC(3)=$14 : FC(4)=$08 ' p
case 113
FC(0)=$08 : FC(1)=$14 : FC(2)=$14 : FC(3)=$18 : FC(4)=$7C ' q
case 114
FC(0)=$7C : FC(1)=$08 : FC(2)=$04 : FC(3)=$04 : FC(4)=$08 ' r
case 115
FC(0)=$48 : FC(1)=$54 : FC(2)=$54 : FC(3)=$54 : FC(4)=$20 ' s
case 116
FC(0)=$04 : FC(1)=$3F : FC(2)=$44 : FC(3)=$40 : FC(4)=$20 ' t
case 117
FC(0)=$3C : FC(1)=$40 : FC(2)=$40 : FC(3)=$20 : FC(4)=$7C ' u
case 118
FC(0)=$1C : FC(1)=$20 : FC(2)=$40 : FC(3)=$20 : FC(4)=$1C ' v
case 119
FC(0)=$3C : FC(1)=$40 : FC(2)=$30 : FC(3)=$40 : FC(4)=$3C ' w
case 120
FC(0)=$44 : FC(1)=$28 : FC(2)=$10 : FC(3)=$28 : FC(4)=$44 ' x
case 121
FC(0)=$0C : FC(1)=$50 : FC(2)=$50 : FC(3)=$50 : FC(4)=$3C ' y
case 122
FC(0)=$44 : FC(1)=$64 : FC(2)=$54 : FC(3)=$4C : FC(4)=$44 ' z
case 123
FC(0)=$00 : FC(1)=$08 : FC(2)=$36 : FC(3)=$41 : FC(4)=$00' {
case 124
FC(0)=$00 : FC(1)=$00 : FC(2)=$7F : FC(3)=$00 : FC(4)=$00 ' |
case 125
FC(0)=$00 : FC(1)=$41 : FC(2)=$36 : FC(3)=$08 : FC(4)=$00' }
case 126
FC(0)=$10 : FC(1)=$08 : FC(2)=$08 : FC(3)=$10 : FC(4)=$08' ~
case 127
FC(0)=$10 : FC(1)=$08 : FC(2)=$08 : FC(3)=$10 : FC(4)=$08' DEL
case 128
FC(0)=$55 : FC(1)=$2A : FC(2)=$55 : FC(3)=$2A : FC(4)=$55 ' (shaded)
end select
WriteLCD:
lcd_DC = 1
shiftout lcd_SDO,lcd_CLK,1,[ FC(0),FC(1),FC(2),FC(3),FC(4),$00 ]
return

'=== End Subroutines ================================================== ==========

Main:
'Print some text on first line
lcd_Data = "A"
gosub LcdSendChar
lcd_Data = "B"
gosub LcdSendChar
lcd_Data = "C"
gosub LcdSendChar


'print some variables
temp = 24
'@ PrintVar 0,4, _temp
temp = 621
'@ PrintVar 0,5, _temp

'Print some text on second line
posX = 0
posY = 1
gosub LcdGotoXY
lcd_Data = "a"
gosub LcdSendChar
lcd_Data = "b"
gosub LcdSendChar
lcd_Data = "c"
gosub LcdSendChar


end

MikeWinston
- 25th September 2012, 02:52
This is what i'm thinking i have to do to solve this. Or please tell me if i'm way off.........

If i call the macro from another page, do i need to account for page bits?
'psuedo code for macro'
begin macro -
check if page bits are set to 0 page - (0 page is where macro resides)
if not, save page bits in temp variables and set page bits to 0 -
macro code here -
restore page bits from temp variables -
end macro -

I fall down a well, my eyes go crossed. I get kicked by a mule, they go back. I don't know.

longpole001
- 25th September 2012, 12:56
just not sure if the boundary warning are the problem , i use a macro DT_int14.bas for instant interrupts , and since including the macro code i see this warning msg ( 306) x 3 when doing a compile but the code is working fine , removing some code when compiling does reduce the warning msg down to 2 but thats about it , removing the macro removes the msgs completely

I am also using the same chip as you for my prog

Not sure if this aids you or just confuses , but perhaps the problem may be else where not the msg it creates , just a thought

MikeWinston
- 25th September 2012, 14:43
You may be right longpole. But this is what it's pointing to at this time.
Sometimes i guess we wish for more problems so we have more information to troubleshoot.

Well DT_interrupts handles page crossing. I'm pretty sure. So I don't think this is good enough proof of being not the problem.

Archangel
- 1st October 2012, 19:19
Have you tried putting your vars all in bank 0 ?

MikeWinston
- 2nd October 2012, 00:47
O.K. I'll try that tomorrow. (I don't have chip with me now)
thanks,
Mike

MikeWinston
- 3rd October 2012, 00:06
Archangel,
No luck there. I just got a blank screen. I put all all my vars in Bank 0 like following example:
posX var byte BANK0 SYSTEM

I can get it to work if i manually do everything. But the macro would sure be nice.
Mike -

MikeWinston
- 6th October 2012, 21:40
Got it working.
Changed code in Macro. Removed the local label called OverVar. Not sure why it was there anyway. Also took the gosub LcdGotoXY out of for/next loop since it only needed to be executed once.
Also put in provision in case the variable number = 0.

here's updated macro:

'PrintVar Macro
'Example: @ PrintVar x,y, _variableName
'
asm
PrintVar macro x, y, variable
MOVE?CB x, _posX
MOVE?CB y, _posY
MOVE?WW variable, _varData
L?CALL _VariableOut
endm
endasm
VariableOut:
zeroFlag = 0
gosub LcdGotoXY

'cycle through all possible digts of word sized number
for n = 4 to 0 step -1
lcdData = (varData dig n) + 48
if lcdData = 48 AND zeroFlag = 0 then SkipNum
zeroFlag = 1
gosub LcdSendChar
posX = posX + 6
SkipNum:
'if varData = 0 then print "0"
if n = 0 AND zeroFlag = 0 then
gosub LcdSendChar
endif
next
return