|
|
View previous topic :: View next topic |
Author |
Message |
murgui
Joined: 23 Dec 2015 Posts: 37
|
Multidimensional array RAM location |
Posted: Wed Jul 06, 2016 7:33 am |
|
|
Hi,
I'm using the PIC 18f2685 and my compiler version is 4.114.
I'm programming a system that monitors temperatures. The information is organized in a 3 dimensional array:
T[location][Part1/Part2][sensor]
Being location the place where it's read. Part1/Part2 each of the 2 bytes that conform the temperature and finally sensor the number of sensor of that location:
25,12ÂșC in the first location by the first sensor would be:
T[0][0][0]=12;
T[0][0][0]=25;
All this information is received from 7 Slave PCBs, finally all the information is organized as mentioned before in T[a][b][c].
My doubt comes when using the can_putd function for retransmitting this information to an external data acquisition system. I don't know how does the PIC internally organizes the information and so if my code is fine.
Code: | #include <Master.h>
#define LED PIN_B7
int8 temp[7][2][6];
int8 adr[7] = {0xA1,0xAB,0xB5,0xBF,0xC9,0xD3,0xDD};
int8 n,i,Dir,cont,subcontador,stack=0,s,;
int32 cid=0x320;//cobid base de temperatura
void lectura(int8 Dir);
void escritura();
void canrx0_int();
void main(){
if(1==1){//CAN ini
can_init();
disable_interrupts(GLOBAL);
can_set_mode(CAN_OP_CONFIG);
BRGCON1.brp=1;
BRGCON1.sjw=1;
BRGCON2.prseg=2;
BRGCON2.seg1ph=7;
BRGCON2.sam=FALSE;
BRGCON2.seg2phts=FALSE;
BRGCON3.seg2ph=6;
BRGCON3.wakfil=FALSE;
can_set_mode(CAN_OP_NORMAL);
enable_interrupts(int_canrx0);
enable_interrupts(int_canrx1);
enable_interrupts(int_cantx0);
enable_interrupts(int_cantx1);
enable_interrupts(int_cantx2);
enable_interrupts(GLOBAL);}
while(1){
for (n=0;n<7;n++){
lectura(adr[n]);}
if (cont=1){
cont=0;
escritura();}
delay_ms(5);//tiempo por ciclo, optimizar.
}
}
void lectura(int8 Dir){//I2C Enlace
i2c_start();
i2c_write(Dir);// direccion de slave & slave->Master(1)
for (i=0;i<6;i++){
temp[n][1][i]=i2c_read(1);
temp[n][2][i]=i2c_read(1);}
temp[n][1][6]=i2c_read(1);
temp[n][2][6]=i2c_read(0);
i2c_stop();
}
void escritura(){//envio de mensajes por CAN
if (stack==7){
stack=0;}
[b]can_putd(cid+stack*10,&temp[stack][0][0],8,FALSE,FALSE);
can_putd(cid+stack*10+1,&temp[stack][1][2],4,FALSE,FALSE);[/b]
stack++;
}
#int_canrx0
void canrx0_int ( ) {//Deteccion mensaje sincronismo
cobid=((unsigned int16)RXB0SIDH << 3)|((RXB0SIDL & 0xE0)>>5);
lengthCAN = (unsigned int8)RXB0DLC & 0xF;
if (cobid == 0x80){
subcontador++
if (subcontador==20){
cont=1;
subcontador=0;
}
}
}
|
Is the can_putd system correct? The information will be transmitted correctly?
I'm afraid the written code will send the information haphazardly. I want it to send
Thank you very much,
Murguizur.
Last edited by murgui on Wed Jul 06, 2016 8:42 am; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19539
|
|
Posted: Wed Jul 06, 2016 8:38 am |
|
|
This is actually a C question not CCS!....
C stores things in 'row major' order in memory.
So if you have an array [x][y][z]
Then in memory, you get [X0, Y0, Z0] , [X0, Y0, Z1], ...[X0, Y0, Zmax],
[X0, Y1, Z0] etc.
As you advance through memory, the right hand variable varies first, then the second etc.. |
|
|
murgui
Joined: 23 Dec 2015 Posts: 37
|
|
Posted: Wed Jul 06, 2016 8:48 am |
|
|
Thank you very much, you were really helpful. I didn't know how to look for this. |
|
|
|
|
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
|