mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RFM12 Programm-code von c in Assembler übersetzen


Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);
}

Autor: Striebel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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);
}

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

>  Result=Result<<1; <<<--- was geschieht hier? das "<<1" ist mir nicht

LSL Result

Gruß aus Berlin
Michael

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mmh ok, danke

 was heisst LSL?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  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

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke an euch beide

nach der erklärung von Falk Brunner ist mir auch das mit LSL klar 
geworden...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.