Go Down

Topic: Serial print in I2C command (Read 654 times) previous topic - next topic

Bandofcs

hi guys,

I am trying to implement my UNO (slave) to access a EEPROM in 1 of its 12C command and print out the data in 3 addresses.

This is my code:
Quote
void requestEvent()
{
 switch (x){
   
 case 0x30://ASCII_0_Payload_Data
   digitalWrite(MUXS1, HIGH);
   digitalWrite(MUXS2, LOW);
   for(int k=0;k<3;k++){
   value[k] = EEPROM.read(k);}
   value[3]='0';
   Serial.println(value);

   digitalWrite(MUXS1, HIGH);
   digitalWrite(MUXS2, HIGH);
   for(int k=0;k<3;k++){
   value[k] = EEPROM.read(k);}

   value[3]='0';
   Serial.println(value);
   
 break;}


However, the code simply stopped at the 4th line of code. The LED turn hign and low respectively but nothing was printed out on serial lines. The LEDs did not turn high and high.

Can someone help?

thanks


lar3ry

#1
Oct 24, 2013, 05:36 am Last Edit: Oct 24, 2013, 05:39 am by lar3ry Reason: 1
If you'd like some help, please post your ENTIRE code in code tags, not quote tags. Use auto-format in the IDE, copy your code, paste it here, highlight it, and click on the # icon above the editor.

The reason I ask for your entire code is that we have no way of knowing how you declared variables, etc. For example, it seems, from the snippet you posted, that you are trying to Serial.print value. We can't tell what value is, can we?

Edit: Forgot to ask... Why do you say  "the code simply stopped at the 4th line of code". You have no way of knowing that.
There are 10 kinds of people in the world,
those who understand binary, and those who don't.

Bandofcs

#2
Oct 24, 2013, 05:40 am Last Edit: Oct 24, 2013, 05:43 am by Bandofcs Reason: 1
oh ... thanks for the advise ... i'm a newbie in the forum.

But here goes:
Code: [Select]
#include <Time.h>
#include <stdlib.h>
#include <Wire.h>
#include <String.h>
#include <wdt.h>
#include <avr/wdt.h>
#include <EEPROM.h>

char value[4];
int address=0,MUXS1=8,MUXS2=9,MUXU1=5,MUXU2=6,led=13,x=999,y=0,z=0,w=0,q=0;
char v[4],u[4],r[4],t[12];

void setup()
{
 Wire.begin(4);
 Wire.onRequest(requestEvent);  // join i2c bus with address #4
 Wire.onReceive(receiveEvent); // register event
 Serial.begin(115200);           // start serial for output
 pinMode(MUXU1, OUTPUT);
 digitalWrite(MUXU1,LOW);
 pinMode(MUXU2, OUTPUT);
 digitalWrite(MUXU2,LOW);
 pinMode(MUXS1, OUTPUT);
 digitalWrite(MUXS1,LOW);
 pinMode(MUXS2, OUTPUT);
 digitalWrite(MUXS2,LOW);
 watchdogStart();
}

void watchdogStart(void)
{
 cli();  // disable all interrupts
 wdt_reset(); // reset the WDT timer
 // Enter Watchdog Configuration mode:
 WDTCSR |= (1<<WDCE) | (1<<WDE); // Set Watchdog settings:
 WDTCSR = (0<<WDIE) | (1<<WDE) | (1<<WDP3) | (0<<WDP2) | (1<<WDP1) | (1<<WDP0); //8s WDT
 sei();
}

void loop()
{
 wdt_reset();
 watchdogStart();
}

void receiveEvent(int howMany)
{
 //int y=0,z=0,w=0,q=0;
 if(1 < Wire.available()) // loop through all but the last
 {
   while(0<Wire.available()){
     char c = Wire.read(); // receive byte as a character
     Serial.println(c);
   }         // print the character
 }
 else{
   x = Wire.read();
 }
 Serial.println(x);         // print the integer
}

void requestEvent()
{
 switch (x){

 case 0x30://ASCII_0
   digitalWrite(MUXS1, HIGH);
   digitalWrite(MUXS2, LOW);
   for(int k=0;k<3;k++){
     value[k] = EEPROM.read(k);
   }
   value[3]='0';
   Serial.println(value);
   digitalWrite(MUXS1, HIGH);
   digitalWrite(MUXS2, HIGH);
   for(int k=0;k<3;k++){
     value[k] = EEPROM.read(k);
   }
   value[3]='0';
   Serial.println(value);

   break;

 case 0x31://ASCII_1
   digitalWrite(MUXS1, LOW);
   digitalWrite(MUXS2, HIGH);
   z=analogRead(1);
   z=z>>2;
   Wire.write(z);
   break;

 case 0x32://ASCII_2
   itoa(analogRead(0),v,10);//Voltage
   itoa(analogRead(1),u,10); //Current
   itoa(analogRead(2),r,10);//Temperature
   strcat(t, v);
   strcat(t, u);
   strcat(t, r);
   Wire.write(t);
   break;

 case 0x33://ASCII_3
   digitalWrite(MUXS1, LOW);
   digitalWrite(MUXS2, HIGH);
   Serial.println("Shello");//uC_CMD_SEND_STRING
   break;

 case 0x34://ASCII_4_ADCS_Data
   digitalWrite(MUXS1, LOW);
   digitalWrite(MUXS2, HIGH);
   Serial.println("Shello");//uC_CMD_SEND_STRING
   break;

 case 0x35://ASCII_5
   Serial.println("Shello");//uC_CMD_SEND_STRING
   break;
 }
 x=999;
 delay(100);
}

Bandofcs

The LEDs turn High and low respectively, then timed out and both turned low. I was able to send another command to it soon after.

lar3ry

#4
Oct 24, 2013, 06:28 am Last Edit: Oct 24, 2013, 06:30 am by lar3ry Reason: 1
Could you add a few lines in  receivedEvent() , as follows? Let us know what it prints out.

Code: [Select]

void receiveEvent(int howMany)
{
 //int y=0,z=0,w=0,q=0;
 int count = 0;                                 //*** add this line
 if(1 < Wire.available()) // loop through all but the last
 {
   while(0<Wire.available()){
     char c = Wire.read(); // receive byte as a character
     Serial.println(c);
     count++;                                      // *** add this line
   }         // print the character
   Serial.println(count);                 // *** add this line
 }


Oh, and you can delete the lines as follows. There's no difference, but they are unneeded (put any back in if you find it necessary later, except for String.h, of course, it's a memory hog, and you already know about char arrays.

Code: [Select]

//#include <Time.h>
//#include <stdlib.h>
#include <Wire.h>
//#include <String.h>
//#include <wdt.h>
#include <avr/wdt.h>
#include <EEPROM.h>

There are 10 kinds of people in the world,
those who understand binary, and those who don't.

Bandofcs

#5
Oct 24, 2013, 07:02 am Last Edit: Oct 24, 2013, 07:04 am by Bandofcs Reason: 1
hi, thanks for your comment. I have added that 3 lines and it printed out "abc0" /n "abc0"
running other non-relavant commands on it and running command '0' again prints "abc0W" /n "abc0W"

Nick Gammon

Code: [Select]
void receiveEvent(int howMany)
{
...
  Serial.println(x);         // print the integer
}

void requestEvent()
{
...
    Serial.println(value);


Don't do serial prints inside an ISR (both of those are ISRs).

http://gammon.com.au/interrupts
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Bandofcs

#7
Oct 24, 2013, 08:49 am Last Edit: Oct 24, 2013, 09:06 am by Bandofcs Reason: 1
Hi Nick,

Thanks for the information. However, in that case, how do I achieve my aim to read and print EEPROM data via a I2C command? Any suggestions?

BTW ... the serial prints in receive event is for debugging purposes. while i really need to execute serial prints in request events

Nick Gammon

Quote
while i really need to execute serial prints in request events


That is certainly sad.

However your loop() function isn't doing much. Can't you set a flag, and then print stuff there?

Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Bandofcs

Hi Nick, I am quite a newbie at programming.

If i got what you meant correctly, I should insert a variable in my requestevent and change its value in request event.

Then I do a switch case for that variable in the main loop to do serial prints.

Is that what you mean?

Nick Gammon

There is no shame in being a newbie. We were all newbies once.

However you might want to consider doing a C tutorial, and working through some of the simpler examples.

Quote
Then I do a switch case for that variable in the main loop to do serial prints.


Broadly speaking, yes.
Please post technical questions on the forum, not by personal message. Thanks!

More info:
http://www.gammon.com.au/electronics

Bandofcs

well, i guess that's the only way to solve the problem for now. Thanks Nick, you're great.

Go Up