Hallo! Ich möchte mit meinem µC (MSP430) meinen ADC (AD7793mit UART) auswertem. Dafür würde ich gerne einige Beispiele sehen wie das in C umgesetzt worden ist. Ich habe schon mal gesucht aber noch nix gefunden. Vieleicht habt ihr ja nen BeispeilCode für einen AD7793 oder einem vergleichbarem Gerät wo ich noch ein paar Tricks abschauen kann, Bzw. ihr wisst wo ich sowas finden kann. LG
sorry, aber der hat kein uart-interface? das ist eine art SPI mit total miesem timing :) falls du dazu was in C brauchst, kannst gerne meine softspi haben.
Natürlich ist es eine SPI. Sorry das ich das durcheinander geworfen habe. Da ich mit einem MSP430F248 arbeite habe ich die Komunikation Hardware mäßig gelöst. Ich habe auch eine Komunikation mit dem AD aufgebau, doch dieser macht leider nicht immer das was ich von ihm erwarte. Ich habe nun gehoft das irgendwer evt. Beispiel Codes für diesen AD hat. Ich kann leider nicht sagen in wie weit ein soclhe komunikation auf andere Chips übertragbar ist. Mein Hauzbtproblem ist zZ das ich nicht weis wie ich festelegen kann auf welchem Kanel der AD messen soll, und wie ich ihm sage das er mit der Messung starten soll. LG Bergie
Na. Der ADC hat einen Befehlssatz, dh diverse Register muessen geschrieben werden, steht aber alles im datenblatt.
Bergie B. schrieb: > Natürlich ist es eine SPI. > > Sorry das ich das durcheinander geworfen habe. > > Da ich mit einem MSP430F248 arbeite habe ich die Komunikation Hardware > mäßig gelöst. > > Ich habe auch eine Komunikation mit dem AD aufgebau, doch dieser macht > leider nicht immer das was ich von ihm erwarte. > > Ich habe nun gehoft das irgendwer evt. Beispiel Codes für diesen AD hat. > Ich kann leider nicht sagen in wie weit ein soclhe komunikation auf > andere Chips übertragbar ist. > > Mein Hauzbtproblem ist zZ das ich nicht weis wie ich festelegen kann auf > welchem Kanel der AD messen soll, und wie ich ihm sage das er mit der > Messung starten soll. > > > LG Bergie Nur ein paar grobe Anhaltspunkte für einen AD7794, der bis auf einige Details gleich angesteuert wird:
1 | // defines
|
2 | #define AD_IDREG_READ 0b01100000
|
3 | #define AD_STATUSREG_READ 0b01000000
|
4 | #define AD_CONFREG_WRITE 0b00010000
|
5 | #define AD_MODEREG_WRITE 0b00001000
|
6 | #define AD_DATAREG_READ 0b01011000
|
7 | #define AD_STATUSREG_7792 0x80
|
8 | #define AD_STATUSREG_7793 0x88
|
9 | #define AD_STATUSREG_7794 0x80
|
10 | #define AD_STATUSREG_7795 0x88
|
11 | #define AD_IDREG_7792 0x0a
|
12 | #define AD_IDREG_7793 0x0b
|
13 | #define AD_IDREG_7794 0x0f
|
14 | #define AD_IDREG_7795 0x0f
|
15 | #define AD_MODEREGH_IDLE 0b01000000
|
16 | #define AD_MODEREGL_IDLE 0b00000000
|
17 | #define AD_MODEREGH_CONT 0b00000000
|
18 | #define AD_MODEREGL_CONT 0b00000000
|
19 | #define AD_MODEREGH_SINGLE 0b00100000
|
20 | #define AD_MODEREGL_SINGLE 0b00000000
|
21 | #define AD_MODEREGH_INTZSC 0b10000000
|
22 | #define AD_MODEREGL_INTZSC 0b00000000
|
23 | #define AD_MODEREGH_INTFSC 0b10100000
|
24 | #define AD_MODEREGL_INTFSC 0b00000000
|
25 | #define AD_MODEREGH_PWRDWN 0b01100000
|
26 | #define AD_MODEREGL_PWRDWN 0b00000000
|
27 | // initialization
|
28 | |
29 | // presence detect, read id and status register
|
30 | ADCSelect(); |
31 | SPITransceive(AD_IDREG_READ); |
32 | id = SPITransceive(0x00) & 0x0f; |
33 | SPITransceive(AD_STATUSREG_READ); |
34 | stat = SPITransceive(0x00); |
35 | ADCDeselect(); |
36 | |
37 | if (res1 != ...) return ...; |
38 | ...
|
39 | |
40 | // write configuration
|
41 | ADCSelect(); |
42 | SPITransceive(AD_CONFREG_WRITE); |
43 | // set bias, uni/bipolar and gain
|
44 | SPITransceive(channelConfHigh); |
45 | // set reference, buffer and channel
|
46 | SPITransceive(channelConfLow); |
47 | |
48 | // start conversion, single shot
|
49 | SPITransceive(AD_MODEREG_WRITE); |
50 | // amp only on AD7794/95
|
51 | SPITransceive(AD_MODEREGH_SINGLE | amp); |
52 | SPITransceive(AD_MODEREGL_SINGLE | speed | clock); |
53 | ADCDeselect(); |
54 | |
55 | // get result, byte order!
|
56 | uint32_t v = 0; |
57 | uint8_t* resP = &v; |
58 | ADCSelect(); |
59 | SPITransceive(AD_DATAREG_READ); |
60 | resP[2] = SPITransceive(0x00); |
61 | resP[1] = SPITransceive(0x00); |
62 | resP[0] = SPITransceive(0x00); |
63 | ADCDeselect(); |
Irgendwo muss man dann noch warten bis die Mesung beendet ist. Da kann man mit einem timer oder mit einem Signal machen. Das signal bekommt man indem man das SPICommand nicht abschliesst, sondern offen laesst, soweit ich mich erinnere. Das Timing dazu ist etwas vermurkst, heisst mit Hardware SPI nicht machbar.
Aehh schrieb: > Das signal bekommt man indem man das SPICommand nicht abschliesst, > sondern offen laesst, was bedeutet offen lassen ? Kann das meine Hardware SPI auch oder ist das eine Software SPI only Geschichte? ich habe das waren nun so gelöst: while (!(P2IN & 0x80)); // warten bis Flanke auf 1 geht while (P2IN & 0x80); // warten bis Flanke auf 0 geht MessdatenHolen(); wobei an P2.7 auf Dout und MiSo geht. LG
Man kann die SPI Hardware ueblicherweise auf Normal zurueckschalten. Ja moeglicherweise wie angegeben. Nur natuerlich nicht blockierend. Man kann den Controller ja nicht fuer hunderte von millisekunden lahmlegen.
Hi! Ich habe meinen AD7793 so zum laufen bekommen wir ich mir das vorstelle. Ich suche nun nach einer Möglichkeit den Code sehr sauber zu struckturieren damit ich genau weis was ich nun gemacht habe. Gibt es dazu einen Leidfaden Lehrbuch Goldeneregeln die sich auf die Komunitkation mit externen Bauteilen beziehen und die einbindung in den Code? LG Bergie
Hi! Nach dem ich mich ja nun ein wenig mit dem AD7793 befasst habe, und dieser lange nicht das gemacht hat was er sollte, läuft er nun. Schilderung meines Problems. Der AD7793 hat sich nach dem ersten holen der Messergebnisse "Verlaufen". Dieses geschah nicht jedes Mal sondern mit einer Wahrscheinlichkeit die bei 60% lag. Die Lösung. Der ADC 7793 verlangt zwingend ein "0x00" Zeichen am Eingang wenn er Daten rausgeben soll. Ich bin nach dem durchlesen der Anleitung der Meinung gewesen das ein (0x80) nötig sei, da das Comunikations Register sämtliche Anweisungen ignoriert welche mit 1Starten (Bit7 High). Darüber hinaus war ich der Meinung dass es über SPI möglich ist gleichzeitig zu senden und zu empfangen (Vollduplex), dieses ist leider nicht so. Damit ist es dann auch nachvollziehbar das 0x00 richtige Ergebnisse Erzeugt. Wieso hingegen [0x80 + (0x0 bis 0x7F)] | ohne 0xFF da dieses einen Rest auslöst kann ich nicht beantworten Zusammen fassung: AD7793: Halbduplex! Tackt zum endfangen mit "0x00" erzeugen! Spaß haben.
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.