Go Down

Topic: Arduino und der Sparkfun Transceiver nRF2401A ??? (Read 7 times) previous topic - next topic

kimmi

Hallo,

weiß jemand wie man diesen Transceiver an einen Arduino anschließt?
http://
http://www.sparkfun.com/commerce/product_info.php?products_id=152


Hat da schon mal jemand einen Beispiel Code für geschrieben?

Hat überhaput schon mal jemand versucht diesen Transceiver mit Arduinos zu verwenden?

Nachtwind

irgendwie kann ich sparkfun gerade nicht aufrufen deshalb versuche ich es mal mit dem Datasheet...



So.. http://www.nordicsemi.com/index.cfm?obj=product&act=display&pro=64#


Im unteren Teil des Sheets wird beschrieben in welche Pinzustaende du alles stellen musst um damit zu senden/empfangen etc. Das ganze sieht einiges komplizierter aus als das, was ich bisher genutzt habe, obwohl es vom Arbeitsablauf ein wenig an LCD Controller erinnert (also dieses Pins HIGH und LOW schalten)...
In meinen Augen wirst du da nicht drum herum kommen eine entsprechende Library zu schreiben - schwierig duerfte das nicht nicht wirklich sein, aber Fingerspitzengefuehl brauchst du schon (siehe Timingcharts).
Unmoeglich ist es nicht das Ding zum laufen zu bringen, aber auch nicht wirklich einfach - am besten du machst eine klasse in der du die einzelnen Zustaende genau wie in dem Sheet nachbaust.. das sollte der beste weg sein. Danach kannst du das ja verfeinern indem du immer weider gleiche Teile zusammenlegst und so weiter..
Wuerd dir gerne dabei helfen, da das ungefaehr nach dem aussieht, was mir fuer mein kleines Projekt gefallen koennte, aber mir gefaellt an dem Chip das Format nicht - oder hast du das Teil irgendwo als DIP gefunden? Ich hab bisher nur QFN gesehen...

Viel Glueck damit!
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

kimmi

Oha das hört sich für mich echt grausam schweirig an, ist wohl nicht die plug-and-play Lösung...

Da scheint auch die zweite Funklösung zu scheitern, die einfachen Sende/Empfängermodule von Sparkfun haben leider auch nicht funktioniert.

Vielleicht hat doch schon mal jemand die Transceiver um laufen gebracht?

Gibt´s noch eine andere Alternative zu den Xbee-Shields die funktioniert?

Nachtwind

Also ich hab von Seeedstudio die 315Mhz Receiver/Transmitter Module im Einsatz, die mittels VirtualWire ganz ordentlich laufen. Was genau willst du denn bewerkstelligen?
Was deine Transceiver angeht - schwierig ist das mit sicherheit nicht, wuerd idr ja sogar helfen, aber bei mir scheiterts schonmal allein an der Bauform... kann sowas ueberhaupt nicht loeten...
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

kimmi

Ich will eigentlich nur so einfach wie möglich Funken, hab erst die Sparkfun 433mhz Module verwendet aber sie haben auch mit Virtual WIre nicht funktioniert.

http://www.sparkfun.com/commerce/product_info.php?products_id=8949



Ich würde auch andere Module verwenden, die Seeedstudio Module gibts ja auch in 433mhz und die gleichen den von dir verwendeten im Aufbau denke ich. Vielleicht probiere ich die mal. Wo hast du die denn in Deutschland gekauft? Diese hier meine ich.

http://www.seeedstudio.com/depot/433mhz-rf-link-kit-p-127.html


(Übrigens sind die 315mhz in Deutschland  soviel ich weiß nicht erlaubt, das ist hier keine freie Frequenz.)

Die Transveiver Module gibts doch fertig, da muss man nur noch Pins dranlöten, da sind keine besonderen Fähigkeiten nötig.

Aber ich hab mittlerweile echt respekt vor Funk, das hat bis jetzt noch nie geklappt und ich brauche unebedingt Funkende Arduinos für meine Diss. und ich kann die Xbees nicht verwenden, da ich ohne Adresierung funken will.


Nachtwind

#5
May 01, 2009, 08:31 am Last Edit: May 01, 2009, 08:35 am by Nachtwind Reason: 1
Hm, hab das Teil nur in QFN Form bisher gefunden... mit Pins dran waere das wirklich SEHR interessant (Die Sparkfun Seite laesst sich einfach nicht oeffnen ><)

Meine 315Mhz Dinger hab ich direkt bei Seeedstudio bestellt, ich such da nie lange wenn ich sowas sehe - idR dauert der Versandt eh nicht lange und ist meist guenstiger als wenn ich den Kram in De kaufe.


*edit*
Nachtrag: Konnte die Sparkfun Seite tatsaechlich einmal oeffnen - da gibt es einen Code fuer PIC.. das ganze sieht doch ordentlich aus.. das kann man doch ganz gut auf Arduino umwandeln?
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

bohne

Mir ist nicht bekannt, dass schonmal jemand Code für das Board veröffentlicht hätte. Wäre also super, wenn jemand die Vorlage vom PIC einfach zum Arduino porten könnte.

Und meist reicht es, wenn man Pins auf die Boards von Sparkfun lötet und diese dann in den Arduino steckt, meistens auf der Seite wo die analogen Pins sind... denn die bei Sparkfun denken oft mit. Aber kann man bei dem Board natürlich nicht wissen und ohne funktionstüchtigen Sketch kann man Board oder Arduino zerstören, aber das ist ja klar.

Versuch also mal den Code zu portieren und ich denke, dass wir Dir helfen werden soweit das hier im Forum möglich ist. Ohne Board kann man aber den Code schlecht testen...
http://www.dorkbot.de
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236434254
http://www.luminet.cc

kimmi

Also ich bin leider ein ziehmlicher Prgrammier Anfänger, zehre gerade noch so von meinen C64 basic Kenntnissen, ich kann also den Pic Code nicht in Arduino übersetzen.

Die Funkmodule sind nicht direkt für die Arduinos gedacht, man kann sie nicht direkt auf die Arduino Pins aufstecken.

Eigentlich sind die Module für SPI Schnittstellen gedacht, die gibts auch am Arduino aber ich kann keine Vollständige SPI-Pin-Belegung des Arduinos finden.

Ich würde meine Module ja jemandem zur Verfügung stellen, der eine Library dafür schreiben möchte.

Sobald es die SEEDSTUDIO 433mhz Funkmodule wider gibts werde ich diese probiren, die sind aber viel größer und uneleganter als die Transceiver von Sparkfun. Ich würde schon lieber die Transceiver benutzen.

bohne

Du kannst die SPI Lib aus dem Playground mal testen:
http://www.arduino.cc/playground/Code/Spi

wichtig ist, dass die Pins so benutzt werden wie auf der Seite angegeben, also:
Quote

pin 13      SCK      SPI clock      
pin 12      MISO      SPI master in, slave out
pin 11      MOSI      SPI master out, slave in
pin 10      SS      SPI slave select


ich kann dazu noch als Tipp sagen, dass man auch die Pins vom ICSP benutzen kann und zwar:
ISCP pin 3: SCK
ISCP pin 4:MOSI
ISCP pin 1:MISO
SS findest Du allerdings wirklich nur auf pin 10 vom Arduino, nicht auf dem ICSP header.

Zu beachten ist auch, das SCK einen Pull-Down Widerstand mit 1kOhm fest verdrahtet hat.

Ich sehe allerdings nicht, dass diese Module SPI unterstützen. Ich weiss allerdings nicht, was dieses ShockBurst ist, das ein 3-wire Protokoll zu sein scheint. Vielleicht ist das irgendwie SPI kompatibel?

Man kann die Module aber auch im direct mode benutzen, dann benötigt man sogar nur 6 Pins, da der DR1 Pin nicht unterstützt wird in diesem Fall. Daten werden dann 1:1 so raus geschickt wie sie am Chip ankommen. Allerdings muss man sich um alle Details kümmern, wie Preamble, Checksum und bei mehreren Teilnehmern auch Adressen...

Ich glaube, der PIC Beispielcode verwendet diesen ShockBurst Modus, habe mir das aber nur grob angeguckt.


Das Board benötigt 7 Pins um den Kanal1 zu benutzen, die kann man sicht natürlich auf den Arduino legen. Wie man möchte. Nur die 3.3V stellen ein echtes Problem dar.
http://www.dorkbot.de
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236434254
http://www.luminet.cc

Nachtwind

Falls ich Zeit finde - arbeite gerade an einigen Protokollen - werde ich versuchen den PIC Code mal so brauchbar wie moeglich zu uebersetzen, so, dass du hoffentlich nur  noch debuggen brauchst.
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

Nachtwind

Ok.. das ist nun quick&dirty und so wahrscheinlich so falsch, wie etwas nur falsch sein kann - aber ich hab es mal versucht hier neben dem Steinegucken umzuschreiben.
Die PinModes, speziell bei RX duerften ein wenig herumzicken, da musst du mal schauen inwiefern es da noch editierbedarf gibt.. auch die Umrechnungen von Byte nach Bit waren so ein kleineres Problem - WIE ging das noch gleich? Stehe da total auf dem Schlauch.
Ansonsten habe ich so viel im Originalzustand belassen, wie moeglich war.. Nur der Kram mit dem auf 8Mhz takten.. das verstehe ich nicht und da muesstest du entsprechend schauen, wie du das mit dem Arduino hinbekommst.. evtl einen externen Quarz einbauen oder so...
Achja.. und da ich keine AHnung vom PIC habe kommt mir '0b.0010.0011' spanisch vor. Ich tippe darauf, dass das bytes sind - aber wie sie genau gelesen werden weis ich nicht, vielleicht kann da jemand anderes was dazu sagen..  ich hab mal von rechts nach links gezaehlt...

Hoffe dir hilft das ein wenig weiter:
Code: [Select]

/*
     Quick and dirty translation of the Sparkfun 24G-256bit example.
     Not tested! Nachtwind (martin@shalmirane.de)
*/

#define Clock_8MHz
#define Baud_9600


/* Ports */

///would be nice to have some Port expander for this...
#define TX_CE      12
#define TX_CS      11
#define TX_CLK1    10
#define TX_DATA    9

#define RX_CE       7
#define RX_CS       6
#define RX_CLK1     5
#define RX_DATA     4
#define RX_DR       3

int data_array[29];
int counter;
int packet_number;





void setup()
{
//Pinmodes
     pinMode(TX_CE, OUTPUT);
     pinMode(TX_CS, OUTPUT);
     pinMode(TX_CLK1, OUTPUT);
     pinMode(TX_DATA, OUTPUT);

     pinMode(RX_CE, INPUT);    
     pinMode(RX_CS, INPUT);    
     pinMode(RX_CLK1, INPUT);          
     pinMode(RX_DATA, INPUT);    
     pinMode(RX_DR, INPUT);    
     
//    printf("\n\rRF-24G Testing:\n\r", 0);
   
   delay(1000); ///Debug: can be removed.

     configure_transmitter();
   configure_receiver();
}

void loop()
{
           int i;
           long elapsed_time;

       packet_number++;
       
       //Put some data in the ougoing array
       data_array[0] = packet_number;
       for(i = 1 ; i < 29 ; i++)
           data_array[i] = ++counter;

       transmit_data();
   
       
       if(digitalRead(RX_DR) == 1) //We have data!
           receive_data();
       
       delay(10); //Have a second between transmissions just for evaluation
   
       
}


//This will clock out the current payload into the data_array
void receive_data(void)
{
     int i, j, temp;

   digitalWrite(RX_CE,LOW);//Power down RF Front end

   //Erase the current data array so that we know we are looking at actual received data
   for(i = 0 ; i < 29 ; i++)
       data_array[i] = 0x00;

   //Clock out the data
   for(i = 0 ; i < 29 ; i++) //29 bytes
   {
       for(j = 0 ; j < 8 ; j++) //8 bits each
       {
           temp <<= 1;
           temp = digitalRead(RX_DATA);
                 digitalWrite(RX_CLK1,HIGH);
                 digitalWrite(RX_CLK1,LOW);          
       }

       data_array[i] = temp; //Store this byte
   }
   
   //if(RX_DR == 0) //Once the data is clocked completely, the receiver should make DR go low
   //    printf("DR went low\n\r", 0);
   
//      printf("Received packet %d\n\r", data_array[0]);
   //This prints out the entire array - very large!
   /*
   printf("\n\rData Received:\n\r", 0);
   for(i = 0 ; i < 29 ; i++)
   {
       printf("[%d]", i);
       printf(" : %h - ", data_array[i]);
   }
   */
   

     digitalWrite(RX_CE,HIGH);      //Power up RF Front end
}

//This sends out the data stored in the data_array
//data_array must be setup before calling this function
void transmit_data(void)
{
   int i, j, temp, rf_address;

   digitalWrite(TX_CE,HIGH);

   //Clock in address
   rf_address = 17;
     ///Umrechnung von Byte auf Bit.. keine Idee wie das noch ging... Kann das auch grad dummerweise nicht testen...
   for(i = 0 ; i < 8 ; i++)
   {
       digitalWrite(TX_DATA,!!VALUE!!);
       digitalWrite(TX_CLK1,HIGH);
       digitalWrite(TX_CLK1,LOW);  
       
       rf_address <<= 1;
   }
   
   //Clock in the data_array
   for(i = 0 ; i < 29 ; i++) //29 bytes
   {
       temp = data_array[i];
       
       for(j = 0 ; j < 8 ; j++) //One bit at a time
       {
           digitalWrite(TX_DATA,!!VALUE!!);
           digitalWrite(TX_CLK1,HIGH);
           digitalWrite(TX_CLK1,LOW);  
           
           temp <<= 1;
       }
   }
     digitalWrite(TX_CE,LOW);      //Start transmission  

}

//2.4G Configuration - Receiver
//This setups up a RF-24G for receiving at 1mbps
void configure_receiver(void)
{
   int i, j, temp;
   byte config_setup[14];

   //During configuration of the receiver, we need RX_DATA as an output
     pinMode(RX_DATA, OUTPUT);    

   //Config Mode
     digitalWrite(RX_CE, LOW);
     digitalWrite(RX_CS, HIGH);
   
   //Setup configuration array
   //===================================================================
   //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
   config_setup[0] = 232;

   //Data bits 103-64 Channel 2 address - we don't care, set it to 200
   config_setup[1] = 0;
   config_setup[2] = 0;
   config_setup[3] = 0;
   config_setup[4] = 0;
   config_setup[5] = 200;

   //Data bits 63-24 Channel 1 address - set it to 17
   config_setup[6] = 0;
   config_setup[7] = 0;
   config_setup[8] = 0;
   config_setup[9] = 0;
   config_setup[10] = 17;
   
   //Data bits 23-16 Address width and CRC
   config_setup[11] = 49; //0b.0010.0011; ???
   
   //Data bits 15-8
   config_setup[12] = 89; //0b.0100.1101; ???
   
   //Data bits 7-0
   config_setup[13] = 13; //0b.0000.1101; ???
   //===================================================================

     
     
     
   //Clock in configuration data
     
     ///I am somewhat clueless here. Its something simple. You iterate through the 14 values of the configuration and end up setting the RX_DATA port according to the Bit you read.
     ///unfortunately i dont remember how to convert from byte to bit - shame on me ;0)
   for(i = 0 ; i < 14 ; i++)
   {
       temp = config_setup[i];
       
       for(j = 0 ; j < 8 ; j++)
       {  
           digitalWrite(RX_DATA,!!VALUE!!);
           digitalWrite(RX_CLK1,HIGH);
           digitalWrite(RX_CLK1,LOW);                    
       }
   }
   
   //Configuration is actived on falling edge of CS (page 10)
   digitalWrite(RX_CE,LOW);
     digitalWrite(RX_CS,LOW);

   //After configuration of the receiver, we need RX_DATA as an input
     pinMode(RX_DATA,input);


   //Start monitoring the air
   digitalWrite(RX_CE,HIGH);
     digitalWrite(RX_CS,LOW);

//    printf("RX Configuration finished...\n\r", 0);

}    

//2.4G Configuration - Transmitter
//This sets up one RF-24G for shockburst transmission
void configure_transmitter(void)
{
   int i, j, temp;
   int config_setup[14];

   //Config Mode
     digitalWrite(TX_CE, LOW);
     digitalWrite(TX_CS, HIGH);    
   //Setup configuration array
   //===================================================================
   //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
   config_setup[0] = 232;

   //Data bits 103-64 Channel 2 address - we don't care, set it to 200
   config_setup[1] = 0;
   config_setup[2] = 0;
   config_setup[3] = 0;
   config_setup[4] = 0;
   config_setup[5] = 200;

   //Data bits 63-24 Channel 1 address - set it to 17
   config_setup[6] = 0;
   config_setup[7] = 0;
   config_setup[8] = 0;
   config_setup[9] = 0;
   config_setup[10] = 17;
   
   //Data bits 23-16 Address width and CRC
   config_setup[11] = 49; //0b.0010.0011; ???
   
   //Data bits 15-8
   config_setup[12] = 89; //0b.0100.1101; ???
   
   //Data bits 7-0
   config_setup[13] = 12; //0b.0000.1100; ???
   //===================================================================

   //Clock in configuration data
     ///I am somewhat clueless here. Its something simple. You iterate through the 14 values of the configuration and end up setting the RX_DATA port according to the Bit you read.
     ///unfortunately i dont remember how to convert from byte to bit - shame on me ;0)       
   for(i = 0 ; i < 14 ; i++)
   {
       temp = config_setup[i];
       
       for(j = 0 ; j < 8 ; j++)
       {  
           digitalWrite(TX_DATA,!!VALUE!!);
           digitalWrite(TX_CLK1,HIGH);
           digitalWrite(TX_CLK1,LOW);    
       
//            temp <<= 1;
       }
   }
   
   //Configuration is actived on falling edge of CS (page 10)
   digitalWrite(TX_CE,LOW);
     digitalWrite(TX_CS,LOW);       

//    printf("TX Configuration finished...\n\r", 0);
}

Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

bohne

#11
May 05, 2009, 01:54 pm Last Edit: May 05, 2009, 02:02 pm by bohne Reason: 1
Quote

Achja.. und da ich keine AHnung vom PIC habe kommt mir '0b.0010.0011' spanisch vor. Ich tippe darauf, dass das bytes sind

das sind bits. Konkret wird damit das config word definiert. 0b ist das Praefix, das angibt, dass alles nach dem b nun binaer zu verstehen ist. Die Nibbles (4bits) werden dabei durch Kommata getrennt.

Von rechts nach links zaehlen ist korrekt und insgesamt hast Du das sehr richtig gemacht mit dem config word. Das MSB, also das bit ganz links in diesem Fall muss als erstes geschickt werden dann... die Umwandlung des confgi words in bits ist in der Tat etwas knifflig, da der avr compiler da keinen sinnvollen mechanismus fuer hat. Man koennte ein uint32 nehmen und dann die bits durch shiften schlage ich vor. Allerdings gibt es in der Tat auch viele 8 Bit Teilwoerter... der ganze Chip ist sehr abenteuerlich :)

Den Rest vom Code gucke ich mir mit und mit mal an...
http://www.dorkbot.de
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236434254
http://www.luminet.cc

bohne

Was ich noch gar nicht verstanden habe: wieso unterscheiden die eigentlich RX und TX Pins? Ich sehe immer nur ein DATA pin und ein CLOCK Pin, jeweils als RX oder als TX zu verstehen, je nach Mode... kann man da nicht die gleichen Pins verwenden fuer Senden und Empfangen?
http://www.dorkbot.de
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236434254
http://www.luminet.cc

bohne

Was noch nicht klappt ist das mit den Timern... die verhalten sich beim AVR natuerlich anders als beim PIC. Bedeutet: Pakete koennen noch nicht empfangen werden (siehe loop() )

Der Code muss also noch weiter bearbeitet werden, aber zusammen mit dem Code von Nachtwind kann man da vielleicht schon was basteln... Man sollte die Timer direkt mit 16MHz beruecksichtigen und ich denke auch, dass hier und da noch Pausen fehlen, da der PIC ja ne Ecke langsamer unterwegs ist bei gewissen Operationen...

Ansonsten mal hier mein Versuch:

Code: [Select]

void setup()
{
   packet_number = 0;
   counter = 0;
   
   //SETUP PINS FEHLT NOCH

   pinMode(RX_DR, INPUT);
   digitalWrite(RX_DR, LOW);

   delay(100);

   configure_transmitter();
   configure_receiver();
}

void loop()
{
   uint8_t i;
   uint16_t elapsed_time;
   packet_number++;
       
       //Put some data in the ougoing array
       data_array[0] = packet_number;
       for(i = 1 ; i < 29 ; i++)
       {
           data_array[i] = ++counter;
       }

       transmit_data();
       
       /*
       
       NOCH NICHT PORTIERT
   
       //Here we monitor how many clock cycles it takes for the receiver to register good data
       //elasped_time is in cycles - each cycles is 500ns at 8MHz so 541 cycles = 270.5us
       //==============================================
       TMR1IF = 0;
       TMR1L = 0 ; TMR1H = 0 ; TMR1ON = 1;
       while(RX_DR == 0)
           if (TMR1IF == 1) break; //If timer1 rolls over waiting for data, then break
       TMR1ON = 0;
       elapsed_time.high8 = TMR1H;
       elapsed_time.low8 = TMR1L;
       //==============================================
       
       */
       
       if(digitalRead(RX_DR) == HIGH) //We have data!
           {
         receive_data();
       }
       
       delay(10); //Have a second between transmissions just for evaluation
}

//This will clock out the current payload into the data_array
void receive_data(void)
{
   uint8_t i, j, temp;

           digitalWrite(RX_CE, LOW);//Power down RF Front end
   

   //Erase the current data array so that we know we are looking at actual received data
   for(i = 0 ; i < 29 ; i++)
       data_array[i] = 0x00;

   //Clock out the data
   for(i = 0 ; i < 29 ; i++) //29 bytes
   {
       for(j = 0 ; j < 8 ; j++) //8 bits each
       {
           temp <<= 1;
           if(digitalRead(RX_DATA) == HIGH)
                 {
                       temp |= (1 << 0);
                 }
                 {
                       temp &= ~(1 << 0);
                 }
           digitalWrite(RX_CLK1, HIGH);
                   digitalWrite(RX_CLK1, LOW);
       }

       data_array[i] = temp; //Store this byte
   }
   
 
   
           digitalWrite(RX_CE, HIGH);//Power up RF Front end
}

//This sends out the data stored in the data_array
//data_array must be setup before calling this function
void transmit_data(void)
{
   uint8_t i, j, temp, rf_address;

   digitalWrite(TX_CE, HIGH);

   //Clock in address
   rf_address = 17;
   for(i = 0 ; i < 8 ; i++)
   {
               if(rf_address & (1 << 7))
       {
             digitalWrite(TX_DATA, HIGH);
       }
       else
       {
             digitalWrite(TX_DATA, LOW);
       }
       
       
       digitalWrite(TX_CLK1, HIGH);
       digitalWrite(TX_CLK1, LOW);
       
       rf_address <<= 1;
   }
   
   //Clock in the data_array
   for(i = 0 ; i < 29 ; i++) //29 bytes
   {
       temp = data_array[i];
       
       for(j = 0 ; j < 8 ; j++) //One bit at a time
       {
             if(temp & (1 << 7))
                   {
                         digitalWrite(TX_DATA, HIGH);
                   }
                   else
                   {
                         digitalWrite(TX_DATA, LOW);
                   }
           
           digitalWrite(TX_CLK1, HIGH);
           digitalWrite(TX_CLK1, LOW);
           
           temp <<= 1;
       }
   }
   
   digitalWrite(TX_CE, LOW);//Start transmission      
}

//2.4G Configuration - Receiver
//This setups up a RF-24G for receiving at 1mbps
void configure_receiver(void)
{
   uint8_t i, j, temp;
   uint8_t config_setup[14];

   //During configuration of the receiver, we need RX_DATA as an output
   pinMode(RX_DATA, OUTPUT);
   digitalWrite(RX_DATA, LOW);
   
   pinMode(RX_DR, INPUT);
   digitalWrite(RX_DR, LOW);//not sure
 
 
   //Config Mode  
   digitalWrite(RX_CE, LOW);
   digitalWrite(RX_CS, HIGH);
   
   
   //Setup configuration array
   //===================================================================
   //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
   config_setup[0] = 232;

   //Data bits 103-64 Channel 2 address - we don't care, set it to 200
   config_setup[1] = 0;
   config_setup[2] = 0;
   config_setup[3] = 0;
   config_setup[4] = 0;
   config_setup[5] = 200;

   //Data bits 63-24 Channel 1 address - set it to 17
   config_setup[6] = 0;
   config_setup[7] = 0;
   config_setup[8] = 0;
   config_setup[9] = 0;
   config_setup[10] = 17;
   
   //Data bits 23-16 Address width and CRC
   config_setup[11] = 0b00100011;
   
   //Data bits 15-8
   config_setup[12] = 0b01001101;
   
   //Data bits 7-0
   config_setup[13] = 0b00001101;
   //===================================================================

   //Clock in configuration data
   for(i = 0 ; i < 14 ; i++)
   {
       temp = config_setup[i];
       
       for(j = 0 ; j < 8 ; j++)
       {  
                   if(temp & (1 << 7))
                   {
                         digitalWrite(RX_DATA, HIGH);
                   }
                   else
                   {
                         digitalWrite(RX_DATA, LOW);
                   }
             digitalWrite(RX_CLK1, HIGH);
             digitalWrite(RX_CLK1, LOW);
           
   
           temp <<= 1;
       }
   }
   
   //Configuration is actived on falling edge of CS (page 10)
   digitalWrite(RX_CE, LOW);
   digitalWrite(RX_CS, LOW);

   //After configuration of the receiver, we need RX_DATA as an input
   pinMode(RX_DR, INPUT);
   pinMode(RX_DATA, INPUT);
   
   //Start monitoring the air
   digitalWrite(RX_CE, HIGH);
   digitalWrite(RX_CS, LOW);
}    

//2.4G Configuration - Transmitter
//This sets up one RF-24G for shockburst transmission
void configure_transmitter(void)
{
   uint8_t i, j, temp;
   uint8_t config_setup[14];
   
   //Config Mode
   digitalWrite(TX_CE, LOW);
   digitalWrite(TX_CS, HIGH);

   
   //Setup configuration array
   //===================================================================
   //Data bits 111-104 Max data width on channel 1 (excluding CRC and adrs) is 232
   config_setup[0] = 232;

   //Data bits 103-64 Channel 2 address - we don't care, set it to 200
   config_setup[1] = 0;
   config_setup[2] = 0;
   config_setup[3] = 0;
   config_setup[4] = 0;
   config_setup[5] = 200;

   //Data bits 63-24 Channel 1 address - set it to 17
   config_setup[6] = 0;
   config_setup[7] = 0;
   config_setup[8] = 0;
   config_setup[9] = 0;
   config_setup[10] = 17;
   
   //Data bits 23-16 Address width and CRC
   config_setup[11] = 0b00100011;
   
   //Data bits 15-8
   config_setup[12] = 0b01001101;
   
   //Data bits 7-0
   config_setup[13] = 0b00001100;
   //===================================================================

   //Clock in configuration data
   for(i = 0 ; i < 14 ; i++)
   {
       temp = config_setup[i];
       
       for(j = 0 ; j < 8 ; j++)
       {  
                   if(temp & (1 << 7))
                   {
                         digitalWrite(TX_DATA, HIGH);
                   }
                   else
                   {
                         digitalWrite(TX_DATA, LOW);
                   }
           digitalWrite(TX_CLK1, HIGH);
           digitalWrite(TX_CLK1, LOW);
           
           temp <<= 1;
       }
   }
   
   //Configuration is actived on falling edge of CS (page 10)
   digitalWrite(TX_CE, LOW);
   digitalWrite(TX_CS, LOW);
}
http://www.dorkbot.de
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1236434254
http://www.luminet.cc

Nachtwind

Die ueberlegung mit den Pins ist mir auch gekommen..
Aber ich meine auf der Platine gesehen zu haben, dass da auch zwischen den TX und RX Sachen unterschieden wird - und wenn ich an das Datasheet denke, wuerde ich mich wundern, wenn ein 'zusammenlegen' wirklich funktionieren taete, da die dort ja fuer jeden Zustand schon fast einen Modus haben...
Was die Timergeschichte angeht wuerd ich sagen, dass man da einen Interrupt braucht, da das ja irgendwie Zeitkritisch ist.. also im Endeffekt so wie bei der Virtualwire Lib..

Code: [Select]

config_setup[13] = 0b00001101;

Wusste gar nicht, dass das so beim Arduino funktioniert, nette kleine Sache :0)

Auch waere es eine Ueberlegung wert die configure_ Funktionen zusammenzulegen. Beim 'uebersetzen' ist mir aufgefallen, dass die codes stellenweise redundant sind und man einiges auslagern koennte um evtl Sketchplatz zu sparen..
Believe me, Mike, I calculated the odds of this succeeding against the odds I was doing something incredibly stupid[ch8230] and I went ahead

Go Up