|
|
View previous topic :: View next topic |
Author |
Message |
restman Guest
|
The variables after the 0x60 RAM address. |
Posted: Tue Nov 27, 2007 6:44 am |
|
|
Hi.
I can not use the variables after the 0x60 RAM address on 18f4620. I have a lot of variables above 0x60 number. How can i fix this situation?
Thanks for your helps. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Tue Nov 27, 2007 8:59 am |
|
|
I can.
Code: | #include <18F4620.h>
#fuses hs,wdt32,noprotect,nolvp,put
#use delay(clock=18432000,RESTART_WDT)
#use rs232(baud=19200,xmit=PIN_B3,invert,stream=debug)
#use rs232(xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,baud=1200,bits=8,parity=e,errors,stream=CIM)
#case
#zero_ram
int8 var;
#byte var=0x61 //note no semicolin
//====prototype=====//
void init(void);
//========================= Main ====================================//
void main(void)
{
init();
while(1)
{
fprintf(DEBUG,"var=%u\n\r",var);
restart_wdt();
}
}
//========================= Functions ==============================//
//=== init ===// setup the initial settings
void init(void){
int8 tmp;
setup_wdt(WDT_ON);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
set_tris_a(0);set_tris_e(0);set_tris_c(0xFF);
set_tris_b(0xFF);
port_b_pullups(TRUE);
enable_interrupts(GLOBAL);
fprintf(DEBUG,"START\n\r");
restart_wdt();
}
|
Perhaps showing us your code, or giving more info can help us solve your problem. You have a TON of ram on the 18F4620 (??64K flash) If you could only use 0-0x60 we would be in very deep trouble.
Did you mean flash, or sram, or EEPROM? |
|
|
restman Guest
|
|
Posted: Tue Nov 27, 2007 9:42 am |
|
|
I tried this solution but it didn't work.
The compiler allocates the 0x60 data Memory address for the variable but when i use it in my program, the program doesn't work properly. But when i use the variable before the 0x60 adress, it works. i don't know if i miss smth. I suspect indirect addressing mode but i can't figure what the real problem is.
Thanks for your helps. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Tue Nov 27, 2007 10:24 am |
|
|
Show your program. |
|
|
restman Guest
|
|
Posted: Tue Nov 27, 2007 12:06 pm |
|
|
The program's size is approximately 8kb (program memory) and it's a commercial program. Here is an example:
...
...
int8 var1; ---> Data Memory address is 0x59
int8 var2; ---> Data Memory address is 0x60
int8 var3; ---> Data Memory address is 0x61
...
...
the program segment is something like:
if(var2 == 5)
{
...
}
else
{
...
}
When i use var1, the program works properly, but when using var2 or var3 it always skips the if statement and jumps to the else statement. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Tue Nov 27, 2007 12:28 pm |
|
|
So this is just a guess..
I searched the spec for 0x60. I noted that it is used for indexed literal offset addressing mode. Could it be something like that??
tho CCS compiler isn't using the extended instructions as far as I know. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 27, 2007 12:36 pm |
|
|
As Treitmey says, make sure you don't have 'XINST' in your #fuses
statement. The code will behave in strange ways if you have that fuse. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Tue Nov 27, 2007 12:42 pm |
|
|
Even better, make sure to set NOXINST on the fuses list. Some compiler versions default to enabling the extended instruction set when the fuse is not specified. |
|
|
restman Guest
|
|
Posted: Tue Nov 27, 2007 3:59 pm |
|
|
It is not important whether i write NOXINST or XINST. The compiler always writes NOXINST in lst file. It doesn't change anything. Thanks everyone for helps. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 27, 2007 4:05 pm |
|
|
1. Post your compiler version.
2. Can you write a small test program that shows the problem ?
Or does it only occur with a large program ? |
|
|
restman Guest
|
|
Posted: Wed Nov 28, 2007 4:42 am |
|
|
1. CCS PCH C Compiler, Version 4.023
2. This is a very simple example:
Code: |
#include <18f4620.h>
#fuses NOXINST, HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#byte var1 = 0x60
#byte var2 = 0x5F
main()
{
set_tris_b(0xFF);
set_tris_d(0x00);
var1 = 0xF1;
var2 = 0x12;
while(true)
{
output_d(var1);
delay_ms(1000);
output_d(var2);
delay_ms(1000);
}
}
|
In this example var1 appears at portd but var2 doesn't. |
|
|
restman Guest
|
|
Posted: Wed Nov 28, 2007 4:43 am |
|
|
Very sorry. var2 appears at portd but var1 doesn't. |
|
|
Ttelmah Guest
|
|
Posted: Wed Nov 28, 2007 5:23 am |
|
|
Without looking any further, keyword in the post, Version number 4.023.
Look at the "Version 4 comments" thread at the top of the forum.
I'd not bother trying anything else, before getting a latter version than this. The .02x versions, have major problems.
The oldest version I have kept (I threw away the versions before this), is 4.027, and it runs fine on this.
Best Wishes |
|
|
restman Guest
|
|
Posted: Wed Nov 28, 2007 6:15 am |
|
|
I tried with CCS PCH C Compiler, Version 4.057. But the result is the same. Would you please write here the lst file. I want to compare with mine. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Wed Nov 28, 2007 10:11 am |
|
|
Is there a reason to #byte the variables to a location 60,61,...
This is usually only done to access a special function register,... ie portD
I still think it has got to be about the indirect addressing mode and extended instruction set.
Can you show the list file from sample program?
Code: | CCS PCH C Compiler, Version 3.249, 30995 28-Nov-07 09:23
Filename: C:\ccs\Projects\CRI\jnk.lst
ROM used: 122 bytes (0%)
Largest free fragment is 65414
RAM used: 6 (0%) at main() level
7 (0%) worst case
Stack: 1 locations
*
00000: GOTO 002A
.................... #include <18f4620.h>
.................... //////// Standard Header file for the PIC18F4620 device ////////////////
.................... #device PIC18F4620
.................... #list
....................
.................... #fuses NOXINST, HS,NOWDT,NOPROTECT,NOLVP
.................... #use delay(clock=20000000)
00004: CLRF FEA
00006: MOVLW 07
00008: MOVWF FE9
0000A: MOVF FEF,W
0000C: BZ 0028
0000E: MOVLW 06
00010: MOVWF 01
00012: CLRF 00
00014: DECFSZ 00,F
00016: BRA 0014
00018: DECFSZ 01,F
0001A: BRA 0012
0001C: MOVLW 7B
0001E: MOVWF 00
00020: DECFSZ 00,F
00022: BRA 0020
00024: DECFSZ FEF,F
00026: BRA 000E
00028: RETLW 00
....................
.................... #byte var1 = 0x60
.................... #byte var2 = 0x5F
....................
.................... main()
.................... {
0002A: CLRF FF8
0002C: BCF FD0.7
0002E: CLRF FEA
00030: CLRF FE9
00032: MOVF FC1,W
00034: ANDLW C0
00036: IORLW 0F
00038: MOVWF FC1
0003A: MOVLW 07
0003C: MOVWF FB4
.................... set_tris_b(0xFF);
0003E: MOVLW FF
00040: MOVWF F93
.................... set_tris_d(0x00);
00042: MOVLW 00
00044: MOVWF F95
....................
.................... var1 = 0xF1;
00046: MOVLW F1
00048: MOVWF 60
.................... var2 = 0x12;
0004A: MOVLW 12
0004C: MOVWF 5F
....................
.................... while(true)
.................... {
.................... output_d(var1);
0004E: CLRF F95
00050: MOVFF 60,F8C
.................... delay_ms(1000);
00054: MOVLW 04
00056: MOVWF 06
00058: MOVLW FA
0005A: MOVWF 07
0005C: RCALL 0004
0005E: DECFSZ 06,F
00060: BRA 0058
.................... output_d(var2);
00062: CLRF F95
00064: MOVFF 5F,F8C
.................... delay_ms(1000);
00068: MOVLW 04
0006A: MOVWF 06
0006C: MOVLW FA
0006E: MOVWF 07
00070: RCALL 0004
00072: DECFSZ 06,F
00074: BRA 006C
.................... }
00076: BRA 004E
.................... }
00078: SLEEP
Configuration Fuses:
Word 1: 0200 HS NOIESO NOFCMEN RESERVED
Word 2: 1E1F BROWNOUT NOWDT BORV21 NOPUT WDT32768
Word 3: 8300 CCP2C1 PBADEN NOLPT1OSC MCLR RESERVED
Word 4: 0081 STVREN NODEBUG NOLVP NOXINST RESERVED
Word 5: C00F NOPROTECT NOCPD NOCPB
Word 6: E00F NOWRT NOWRTD NOWRTC NOWRTB
Word 7: 400F NOEBTR NOEBTRB
|
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|