Hallo Leute,
nach einer längeren Auszeit von meinem Hobby wollte ich mal wieder was versuchen.
Für mein nächstes "Projekt" benötige ich jedoch auf jeden Fall ein Sensorboard, welches mir per Funk(Rfm12b) Daten zu einem anderen Arduino sendet.
Doch habe ich hier auch schon das "Problem"... Ich habe zwar den Rest schon fertig programmiert, doch bekomme ich keine Funkverbindung zwischen 2 Arduino Uno Boards mit angeschlossenen RFM12b Funkmodulen hin, obwohl das ja eigentlich selbst für "Einsteiger" kein großes Problem darstellen sollte.
Auf fertige Libs möchte ich aber möglichst verzichten !

Da ich mit diesen Funkmodulen noch keine Erfahrung gesammelt habe, hatte ich mir gedacht, dass ich erst mal ein funktionierendes Beispiel für die Kommunikation verwende und dann nach Bedarf das Beispiel erweitere.

Deshalb habe ich mir das Rfm12b-Beispiel für Bascom aus dem Robotikhardware-Shop für den Mikrofunk angeschaut und in Arduino-Software umgeschrieben...
Doch bekomme ich leider nur "Kein Datenempfang" angezeigt
Aber eigentlich müsste das Programm doch funktionieren, da ich es nur auf Arduino umgeschrieben habe und es laut PDF in Bascom funktioniert...

Es wäre echt nett von euch, wenn sich mal einer meine Programme anschauen könnte, weil ich nun schon seit Stunden davor sitze und einfach keinen Fehler finden kann.


Ich habe die Programme in Senden und Empfangen aufgeteilt, da es so noch weniger Probleme bei der Übertragung geben müsste. Also nur ein Uno kann senden und der Andere nur empfangen.


Programm zum senden:
Code:
int Pin_Miso = 7;
int Pin_Mosi = 6;
int Pin_Sck = 5;
int Pin_Ss = 4;


int Datenbytes;
long d;
int Eingangsdaten[21];
int Ausgabedaten[21];
int n;
long Timeout;
long T;
long Tt;


void setup() {
  Serial.begin(9600);
  pinMode(Pin_Ss, OUTPUT);
  pinMode(Pin_Sck, OUTPUT);
  pinMode(Pin_Mosi, OUTPUT);
  pinMode(Pin_Miso, INPUT);
  
  digitalWrite(Pin_Ss, HIGH);
  digitalWrite(Pin_Sck, LOW);
  digitalWrite(Pin_Mosi, LOW);
  Rfm12b_init();
}

void loop() {
  for(n = 1; n < 11; n++) {
    Ausgabedaten[n] = n;
  }
  Rfm12b_senden();
  delay(2000);
}


void Rfm12b_init() {
  d = Spitransfer(0x80d7);
  d = Spitransfer(0x82d9);
  d = Spitransfer(0xa67c);
  d = Spitransfer(0xc647);
  d = Spitransfer(0x94a4);
  d = Spitransfer(0xc2ac);
  d = Spitransfer(0xca81);
  d = Spitransfer(0xc483);
  d = Spitransfer(0x9850);
  d = Spitransfer(0xe000);
  d = Spitransfer(0xc800);
  d = Spitransfer(0xc000);

  d = Spitransfer(0x0000);
  Serial.println(d);
  delay(200);
}


void Rfm12b_empfange() {
  Tt = Timeout * 10;
  d = Spitransfer(0x82c8);
  d = Spitransfer(0xca83);
  Datenbytes = 0;
  for(n = 1; n < 11; n++) {
    digitalWrite(Pin_Ss, LOW);
    T = 0;
    do {
      T = T + 1;
      delayMicroseconds(100);
      if(T > Tt) {
        goto Nosignal;
      }
    }while(digitalRead(Pin_Miso) == 0);
    d = Spitransfer(0xb000);
    Eingangsdaten[n] = d;
    Datenbytes = Datenbytes + 1;
  }
  Nosignal:
  d = Spitransfer(0x8208);
}


void Rfm12b_senden() {
  d = Spitransfer(0x8238);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb82d);
  Rfm12b_warte();
  d = Spitransfer(0xb8d4);
  for(n = 1; n < 11; n++) {
    Rfm12b_warte();
    d = 0xb800 + Ausgabedaten[n];
    d = Spitransfer(d);
  }
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0x8208);
}


void Rfm12b_warte() {
  digitalWrite(Pin_Ss, LOW);
  do {
    
  }while(digitalRead(Pin_Miso) == 0);
}


long Spitransfer(long Dout) {
  int Nspi;
  int Dspi;
  long Dmiso;
  Dmiso = 0;
  
  //Slave-Select aktiv !
  digitalWrite(Pin_Ss, LOW);
  delayMicroseconds(10);
  for(Nspi=15; Nspi > -1; Nspi--) {
    Dspi = bitRead(Dout,Nspi);
    //Serial.print(Dspi);
    if(Dspi == 0) {
      digitalWrite(Pin_Mosi, LOW);
      Serial.print("0");
    }
    if(Dspi >= 1) {
      digitalWrite(Pin_Mosi, HIGH);
      Serial.print("1");
    }
    delayMicroseconds(5);
    digitalWrite(Pin_Sck, HIGH);
    delayMicroseconds(5);
    digitalWrite(Pin_Sck, LOW);
    delayMicroseconds(5);

    Dmiso = Dmiso * 2;
    Dmiso = Dmiso + digitalRead(Pin_Miso);
  }
  delayMicroseconds(5);
  digitalWrite(Pin_Ss, HIGH);
  Serial.println(" ");
  return Dmiso;
}
Programm zum Empfangen:
Code:
int Pin_Miso = 7;
int Pin_Mosi = 6;
int Pin_Sck = 5;
int Pin_Ss = 4;


int Datenbytes;
long d;
int Eingangsdaten[21];
int Ausgabedaten[21];
int n;
long Timeout;
long T;
long Tt;


void setup() {
  Serial.begin(9600);
  pinMode(Pin_Ss, OUTPUT);
  pinMode(Pin_Sck, OUTPUT);
  pinMode(Pin_Mosi, OUTPUT);
  pinMode(Pin_Miso, INPUT);
  
  digitalWrite(Pin_Ss, HIGH);
  digitalWrite(Pin_Sck, LOW);
  digitalWrite(Pin_Mosi, LOW);
  Rfm12b_init();
}

void loop() {
  Timeout = 900;
  Rfm12b_empfange();

  if(Datenbytes == 0) {
    Serial.println("Kein Datenempfang");
  }
  if(Datenbytes != 0) {
    Serial.print("Datenbytes: ");
    Serial.println(Datenbytes);
    for(n = 1; n < Datenbytes; n++) {
      Serial.print(Eingangsdaten[n]);
    }
    Serial.println(" ");
  }
  delay(700);
}


void Rfm12b_init() {
  d = Spitransfer(0x80d7);
  d = Spitransfer(0x82d9);
  d = Spitransfer(0xa67c);
  d = Spitransfer(0xc647);
  d = Spitransfer(0x94a4);
  d = Spitransfer(0xc2ac);
  d = Spitransfer(0xca81);
  d = Spitransfer(0xc483);
  d = Spitransfer(0x9850);
  d = Spitransfer(0xe000);
  d = Spitransfer(0xc800);
  d = Spitransfer(0xc000);

  d = Spitransfer(0x0000);
  Serial.println(d);
  delay(200);
}


void Rfm12b_empfange() {
  Tt = Timeout * 10;
  d = Spitransfer(0x82c8); //Empfänger eischalten
  d = Spitransfer(0xca83); //warten auf 2dd4; dann sdo = 1
  Datenbytes = 0;
  for(n = 1; n < 11; n++) {
    digitalWrite(Pin_Ss, LOW);
    T = 0;
    do {
      T = T + 1;
      delayMicroseconds(100);
      if(T > Tt) {
        goto Nosignal;
      }
    }while(digitalRead(Pin_Miso) == 0);
    d = Spitransfer(0xb000);
    Eingangsdaten[n] = d;
    Datenbytes = Datenbytes + 1;
  }
  Nosignal:
  d = Spitransfer(0x8208); //Empfänger abschalten
}


void Rfm12b_senden() {
  d = Spitransfer(0x8238);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb82d);
  Rfm12b_warte();
  d = Spitransfer(0xb8d4);
  for(n = 1; n < 11; n++) {
    Rfm12b_warte();
    d = 0xb800 + Ausgabedaten[n];
    d = Spitransfer(d);
  }
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0xb8aa);
  Rfm12b_warte();
  d = Spitransfer(0x8208);
}


void Rfm12b_warte() {
  digitalWrite(Pin_Ss, LOW);
  do {
    
  }while(digitalRead(Pin_Miso) == 0);
}


long Spitransfer(long Dout) {
  int Nspi;
  int Dspi;
  long Dmiso;
  Dmiso = 0;
  
  //Slave-Select aktiv !
  digitalWrite(Pin_Ss, LOW);
  delayMicroseconds(10);
  for(Nspi=15; Nspi > -1; Nspi--) {
    Dspi = bitRead(Dout,Nspi);
    //Serial.print(Dspi);
    if(Dspi == 0) {
      digitalWrite(Pin_Mosi, LOW);
    }
    if(Dspi >= 1) {
      digitalWrite(Pin_Mosi, HIGH);
    }
    delayMicroseconds(5);
    digitalWrite(Pin_Sck, HIGH);
    delayMicroseconds(5);
    digitalWrite(Pin_Sck, LOW);
    delayMicroseconds(5);

    Dmiso = Dmiso * 2;
    Dmiso = Dmiso + digitalRead(Pin_Miso);
  }
  delayMicroseconds(5);
  digitalWrite(Pin_Ss, HIGH);
  return Dmiso;
}