Was bedeutet dieser Code in C?

Gast #1781400
Lesenswert?

Hallo!

Ich habe folgenden Code vorliegen:
1
unsigned int getADC(unsigned short Kanal) 
2
{ 
3
 unsigned int result;
4
 ADC_CS = 0;       // select MCP3204  (ADC)
5
 SPI_Write(0x06);  
6
 
7
 Kanal = Kanal << 6;                 
8
 result = SPI_Read(Kanal) & 0x0F;   
9
 result = result << 8;  
10
      
11
 result |= SPI_Read(0); 
12
 ADC_CS = 1;      // deselect MCP3204  (ADC)
13
 return result;
14
}
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
#1781415
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.
Gast #1781426
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren