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


von Hans (Gast)


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

: Verschoben durch User
von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

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
Noch kein Account? Hier anmelden.