Jump to content

maximlee

Members
  • Content Count

    3
  • Joined

  • Last visited

About maximlee

  • Rank
    Noob Class

Recent Profile Visitors

349 profile views
  1. I am trying (for quite long time) to write to EEPROM 64 bytes of data in 4 chunks (as EEPROM's page size is 16 bytes). Unfortunately, the MCU sends few extra bytes every time it transmits. For example, if I send 16 bytes, it transmits 22, with 6 last bytes being of unknown origin to me. For example, I send 15 text bytes within for(...) cycle xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx but see on the scope xx xx xx xx xx xx xx xx xx xx xx xx xx xx xx BF F6 FD D7 3A C0 I tried another approach: send 15 bytes + 00. My program stops at 00, then I try to replace 00 with whatever has to be there using yet another write (1 byte only). However, I see 3 extra bytes: xx 2F 9A C9 00 I tried to write this 4 times at consequent addresses: 50 00 xx 00 50 01 xx 00 50 02 xx 00 50 03 xx 00 but every times I have the same extra bytes, like 50 01 xx 2F 9A C9 00 which result in (when reading 4 bytes) 50 00 xx xx xx xx 2F (5 bytes are read). Due to size of my project vs ROM size and also the need to learn C, I create all functions by myself, without using standard libraries. Below is I2C_write function, other ones regulating initialization, address selection or reading do not seem to be a problem. DCO is running at 16 MHz, with no division. void I2Ctext_write(unsigned int MemoryAddress, char * text, int length) { short int i = 0; UCB0I2CSA = addressSelect(MemoryAddress).three_bits_offset; while (UCB0STAT & UCBBUSY); //wait for USCI B0 bus to be inactive UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition while (!(IFG2&UCB0TXIFG)); UCB0TXBUF = addressSelect(MemoryAddress).seven_bits_address; if(length) { for (i = 0; i < length; i++) { while(*text) { while (!(IFG2&UCB0TXIFG)); if(!(*text)) { break; } UCB0TXBUF = *text; *text++; } } } else { while(*text) { while (!(IFG2&UCB0TXIFG)); if(!(*text)) { break; } UCB0TXBUF = *text; *text++; } } while (!(IFG2&UCB0TXIFG)); UCB0TXBUF = 0; while (!(IFG2&UCB0TXIFG)); // data transmission has begun and the UCTXSTP bit may be set. UCB0CTL1 |= UCTXSTP; // Stop condition enabled; while (UCB0CTL1 & UCTXSTP); } Why do I see those extra bytes and what to do to get rid of them?
  2. Thank you. I am sorry for my late answer - I tried to change the code and compile it, but due to other errors couldn't do that. Anyway, I think that my problem was also related to code writing rather then enum mistakes: I was able today to compile the code. My lcd_send_string(* char) function was declared in a functions.h file as following: char *enum2str(enum IOchannel); #ifdef LCD void lcd_init(void); void lcd_send_string(char *s); #endif while LCD was defined in another definitions.h file: #define LCD LCD4 I had to comment #ifdef and #endif, and then everything compiled succesfully, including that function with enums: lcd_send_string(enum2str(haltIn)).
  3. Hi. Got stuck. I have a project with a line in variables.h: enum IOchannel {V1 = 11, I1 = 101, V2 = 12, I2 = 102}; Then I have an input.c, where I initialize all variables declared in variables.h(as extern), however, I don't use it for my enum, because I would get an error that my variables are already defined (due to include). Finally, I have another file which sends on LCD my enum variables, i.e. if it was V1 received, then you'll see "V1 = xxx" on the LCD. lcd_send_string(enum2str(haltIn)); where the function is void lcd_send_string(char *s); and so there's a function char *enum2str(enum IOchannel enumVariable) { // convert ENUM to CHAR switch (enumVariable) {case V1: return "V1"; case V2: return "V2"; case I1: return "I1"; case I2: return "I2";} } When I am trying to compile my code (GCC 4.2.4) I receive a message "argument of type "enum IOchannel" is incompatible with parameter of type "enum IOchannel"" every time I am trying to use my function. What is the correct way to declare, initialize and use my enum variable? Thanks.
×
×
  • Create New...