kann mir jemand das Folgende den folgenden Auszug aus dem RFM12_Transmitter_demo in assemblerische übersetzen oder zumindest die einzelnen schritte erläutern? ich kaue schon seit stunden daran rum das zu verstehen: } unsigned int RFXX_WRT_CMD(unsigned int aCmd){ unsigned char i; unsigned int temp; LOW_SCK(); LOW_SEL(); for(i=0;i<16;i++){ temp<<=1; if(SDO_HI()){ temp|=0x0001; } LOW_SCK(); if(aCmd&0x8000){ HI_SDI(); }else{ LOW_SDI(); } HI_SCK(); aCmd<<=1; }; LOW_SCK(); HI_SEL(); return(temp); }
Hallo... Also der Code schreibt seriell 16bit (aCmd) auf eine Datenleitung (SDI) und liest gleichzeitig, was auf der eingehenden Leitung entsprechend des Taktes (SCK) reinkommt. Schritt für Schritt heißt das: 0. Lokale Variablen werden deklariert. ( Zeile 1 und 2) 1. Die ChipSelect Leitung und die Clock-Leitung werden auf LOW gezogen. (Zeile 3 und 4). 2. Eintritt in die for-Schleife, welche 16 mal durchlaufen wird. Dabei wird im ersten Schritt eine Null von rechts in die Variable temp gezogen. Liegt jetzt auf der eingehenden Leitung eine 1, also HIGH an, wird dieser Wert in die Variable temp geschrieben, bzw. nur das entsprechende Bit gesetzt. 3. Die Clock-Leitung wird auf LOW gezogen ( im ersten Schritt noch unsinnig, nachher aber schon wichtig. ) Mit der folgenden if-Abfrage wird dann entsprechend was im "aCmd" steht, genauer an der letzten (linken) Bitposition, auf die SDI Leitung angelegt. 4. Mit HI_SCK(); wird jetzt der Clock auf HIGH gezogen, um dem Empfänger ein anliegendes Datenbit zu signalisieren. Zum Schluss wird noch das zu schreibende Kommando nach links gezogen. Jetzt liegt also das ehemals vorletzte Bit an der ganz linken Stelle für die weitere Verarbeitung im nächsten Schritt. Das alles wird 16 mal gemacht und anschließend der ChipSelect wieder aufgehoben und der gelesene Wert, welcher in der Variable temp steht zurückgegeben. Gruß, Striebel
jo danke für die schnelle antwort ich hab hier noch ne kleine for-schleife die ich nicht ganz verstehe: Result=0; for(i=0;1<8;i++) { Result=Result<<1; <<<--- was geschieht hier? das "<<1" ist mir nicht klar if(SDO) { Result|=1; } SCK=1; NOP(); NOP(); SCK=0; NOP(); NOP(); return(Result); }
Hallo,
> Result=Result<<1; <<<--- was geschieht hier? das "<<1" ist mir nicht
LSL Result
Gruß aus Berlin
Michael
@ hans (Gast) >ich hab hier noch ne kleine for-schleife die ich nicht ganz verstehe: Die Schleife taktet 8 Bit in den AVR und legt sie in der Variabel Result ab. Siehe AVR-Tutorial: Schieberegister. >Result=0; >for(i=0;1<8;i++) >{ > Result=Result<<1; <<<--- was geschieht hier? das "<<1" ist mir nicht >klar Die Variabel Result wird um eine Stelle binär nach links geschoben, um Platz für das nächste Datenbit zu machen. > if(SDO) > { > Result|=1; > } Niederwertigstes Bit in Result auf 1 setzen, wenn SDO=1 ist. > SCK=1; takt auf HIGH > NOP(); > NOP(); > SCK=0; Takt auf LOW. MFG Falk
ok danke an euch beide nach der erklärung von Falk Brunner ist mir auch das mit LSL klar geworden...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.