mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was bedeutet dieser Code in C?


Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe folgenden Code vorliegen:
unsigned int getADC(unsigned short Kanal) 
{ 
 unsigned int result;
 ADC_CS = 0;       // select MCP3204  (ADC)
 SPI_Write(0x06);  
 
 Kanal = Kanal << 6;                 
 result = SPI_Read(Kanal) & 0x0F;   
 result = result << 8;  
      
 result |= SPI_Read(0); 
 ADC_CS = 1;      // deselect MCP3204  (ADC)
 return result;
}
Meine Frage ist nun, was dieser Code in den einzelnen Zeilen genau 
macht!?
aufgerufen wird diese Methode mit getADC(Kanalnummer), wobei die 
Kanalnummer 0 bis 3 sein kann. Dann dürfte der ADC mit ADC_CS=0 
ausgewählt werden... dann habe ich ein großes Verständnisproblem und am 
Ende wird der ADC mit ADC_CS=1 wieder freigegeben und der Wert 
zurückgegeben.

Kann mir bitte jemand den teil dazwischen erklären? danke!
Mfg Hans

: Verschoben durch Moderator
Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wichtige Regeln - erst lesen, dann posten!
•Aussagekräftigen Betreff wählen
•Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans schrieb:

> Kann mir bitte jemand den teil dazwischen erklären? danke!
> Mfg Hans

Die hauptsächliche Erklärung, warum zb die Kanalnummer an einer ganz 
bestimmten Position im gesendeten Byte stehen muss, findest du im 
Datenblatt des verwendeten ADC-Chips.

Der Code orientiert sich einfach nur an diesem unbekannten Datenblatt 
und schiebt die Kanalnummer in den Bits so zurecht, wie es der Baustein 
haben möchte, bzw. bereitet das Ergebnis vom Baustein so auf, wie im 
Datenblatt steht, dass es sinnvoll ist.

Zentrales Element ist die Funktion SPI_Read
Ihre Aufgabe wird wohl sein, ein 'Kommandobyte' an den ADC Baustein zu 
schicken und das Ergebnis abzuholen.

2 Aufrufe deshalb, weil wohl der ADC 2 Bytes als Ergebnis schickt: Ein 
High-Byte und ein Low-Byte.
Diese werden mit << in den 16 Bits zurechtgeschoben, bzw mit dem |= zu 
einem Gesamtergebnis verknüpft.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So etwas fragt man am einfachsten denjenigen, der den Code geschrieben 
hat.


> ADC_CS = 0;       // select MCP3204  (ADC)

Das scheint ein per SPI angebundener ADC zu sein, wobei da noch mehr 
Teilnehmer am Bus hängen, und daher per Chip Select der richtige 
ausgewählt wird.

> SPI_Write(0x06);
Der ADC bekommt eine 6 gesendet.
> Kanal = Kanal << 6;
> result = SPI_Read(Kanal) & 0x0F;
Die übergebene ADC-Kanalnummer wird um 6 nach links geschiftet, mit 0x0f 
ver-undet. Warum, steht in dessen Datenblatt.
Das Ergebnis wird an den ADC geschickt. Warum, steht in dessen 
Datenblatt. SPI-read liefert dann anscheinend den Wert des ADC zurück. 
Warum, steht in der Doku zu dieser Funktion.

> result = result << 8;
Das zurückgelieferte Ergenis wird um 8 Stellen nach links verschoben. 
Vermutlich ist das ein ADC mit mehr als 8 bit, und das ist das 
high-byte.

>result |= SPI_Read(0);
Jetzt kommt noch das low-byte dazu.

> ADC_CS = 1;      // deselect MCP3204  (ADC)
Chip select des ADC wird deaktiviert.

Oliver

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.