Wire.RequestFrom und Wire.onReceive


hallo,

ich habe eine i2c "netzwerk" mit 2 arduino's und einem kompassmodul. ich habe eine funktion geschrieben die den kompass ausliest. dabei sende ich mit wire.write() einen befehl und mit wire.requestfrom() erhalte ich dann meine daten(insgesamt 6 pakete die dann zu 3 variablen zusammengefügt werden). von dem 2 arduino empfange ich auch daten, dort aber jeweils nur 1 paket. deshalb hab ich mir eine wire.onreceive() funktion geschrieben. in dieser befindet sich eine switch - case anweisung die die daten auswertet. meine frage lautet nun wenn ich beginne vom kompassmodul  daten zu empfangen, springe ich dann automatisch in die onreceive schleife oder wird das mit requestfrom abgearbeitet?

onreceive() und onrequest() sind dazu da callback funktionen zu registrieren. das funktioniert im prinzip wie attachinterrupt() und ist auch in der tat ein interrupt. die funktion die man als parameter übergibt wird automatisch aufgerufen wenn daten ankommen, bzw. wenn daten angefordert werden.

eine schleife ist allerdings anderes :)

edit:
diese funktionen laufen allerdings nur auf slaves! auf dem master werden die daten mit read() per hand ausgelesen. in dem fall mit dem kompass ist der arduino ein master. du forderst daher daten mit requestfrom() und machst danach sofort entsprechend oft read(). schau dir mal rtc libs als anhaltspunkt an.

hier ist z.b. eine vereinfachte funktion um eine ds1307 real time clock auszulesen:
code: [select]

void ds1307rtc::read(tmelements_t &tm)
{
 wire.begintransmission(ds1307_ctrl_id);
 wire.write((uint8_t)0x00);
 wire.endtransmission();

 wire.requestfrom(ds1307_ctrl_id, tmnbrfields);

 tm.second = bcd2dec(wire.read() & 0x7f);  
 tm.minute = bcd2dec(wire.read() );
 tm.hour =  bcd2dec(wire.read() & 0x3f);  // mask assumes 24hr clock
 tm.wday = bcd2dec(wire.read() + 1);
 tm.day = bcd2dec(wire.read() );
 tm.month = bcd2dec(wire.read() );
 tm.year = y2kyeartotm((bcd2dec(wire.read())));
}


erst wird die adresse mit begintransmission() geschickt. dann wird das register mit write() adressiert und die Übertragung mit endtransmission() abgeschlossen. dann fordert man die daten mit requestfrom() und macht sofort danach entsprechend oft read()


hier ist code für die kommunikation zwischen arduinos:
http://arduino.cc/en/tutorial/masterwriter
http://arduino.cc/en/tutorial/masterreader

da wird einmal gezeigt wie der slave nur mit onrequest() reagiert, aber auch wie er daten mit onreceive() empfängt


Arduino Forum > International > Deutsch (Moderator: uwefed) > Wire.RequestFrom und Wire.onReceive


arduino

Comments

Popular posts from this blog

VIDIOC_S_FMT error 16, Device or resource busy - Raspberry Pi Forums

using a laptop skeleton to build a pi laptop - Raspberry Pi Forums

Forum for Joomla? - Joomla! Forum - community, help and support