error in variables handling

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

error in variables handling

848 次查看
GMVS
Contributor III

hi

processor expert is making fun of me

i'm trying to attach an st m41t94 rtc to the mc9s08dz128mll using the spi2, but since i've got other stuff in the same bus, i'm using a 74hc595 sipo register for the slave selects.

i'm trying to make an echo access to the clock to try out the spi. this is part of my main

///

RTCwrite(0x02, 0x15);                      // (1)

  spiError= RTCread(0x02,time);

  a=*time;

  SIPO1Tx(a, TRUE, TRUE);

///

i'm writting, then reading, then placing what i read on a second sipo driving leds

the following lines are in another file

///

void RTCwrite(char RTCaddress, char data)                       // (2)

{

  RTCaddress = RTCaddress | 0x80; //turn on first bit to write         // (3)

  SPI2SIPOTx(0xFD, TRUE);

  SPI2M_SendChar(RTCaddress);

  SPI2M_SendChar(data);

  SPI2SIPOTx(0xFF, TRUE);

}

///

(1)  you can see how i'm sending a hex 2 and 15 to the rtc, i'm trying to access address register 2 which contains the minutes of the rtc and i'm telling it in bcd that rigth now its been 15 minutes.

(2) but when i run the debugger, RTCaddress has a 0x41 while data has the 0x15 i was sending. ??

(3) to tell the rtc that i'm writting i need to turn on the first bit of the address. so ideally i'll get 0x02 | 0x80 = 0x82. in this case i'd expect to have 0x41 | 0x80 = 0xc1, but i still get RTCaddress = 0x41. ????

given how this is no way working, i havent even tried the rest so i dont know if it works, at this point i dont care. all i care is why this stuff is not working??

next i tried this

///

RTCwrite(0x0002, 0x15);                      // (1)

  spiError= RTCread(0x02,time);

  a=*time;

  SIPO1Tx(a, TRUE, TRUE);

/////////////////

void RTCwrite(int RTCaddress, char data)                  

{

  RTCaddress = RTCaddress | 0x80; //turn on first bit to write            // (2)

  data = data | 0x80;                                                                  // (3)

  SPI2SIPOTx(0xFD, TRUE);

  SPI2M_SendChar(RTCaddress);

  SPI2M_SendChar(data);

  SPI2SIPOTx(0xFF, TRUE);

}

///

(1) this way the number pass nicely

(2) the operation works, i got a 0x0082

(3) but here this operation is ignored

so all i can conclude is processor experts (or code warrior) doesn't knows how to handdle chars

but i need the number as a char, not int, i could make a cast and truncate the int, but i dont think thats correct

also, are the following assumption correct?

byte = signed byte = sign + 7 bits

char = unsigned byte = 8 bits

int = signed double byte = sign + 15 bits

word = unsigned int = 16 bits

are short and long also available? and what would be their counterparts?

please help me out

1 回复

699 次查看
Petr_H
NXP Employee
NXP Employee

Hi,

regarding the types:

- char - can be signed or unsigned depending on the compiler, it can usually be configured in the compiler settings.

- byte - is defined by Processor Expert as unsigned char (8 bits)

- int - is signed, on HCS08 16 bits

- word - unsigned int, on HCS08 16 bits

I'm not sure what component do you use for the communication. If you use SynchroMaster, then the type of the sent/received data (ComponentName_TComData),  is a byte if the number of information bits ( Width property) is less than or equal to 8. If the number of information bits is greater than 8, the type of the user type ComponentName_TComData is a word.

I recommend to not use char and int in you r functions like RTCwrite, if you want to do bit-wise operations.

Please check the width and spi bus settings with the manual of the part and please post some sample project if you'll keep having troubles.

best regards

Petr Hradsky

Processor Expert Support Team