Forum: Mikrocontroller und Digitale Elektronik AD7792/AD7793 Code gesucht


von Bergie B. (bergie)


Lesenswert?

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

von Michael H. (morph1)


Lesenswert?

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.

von Bergie B. (bergie)


Lesenswert?

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

von Aehh (Gast)


Lesenswert?

Na. Der ADC hat einen Befehlssatz, dh diverse Register muessen 
geschrieben werden, steht aber alles im datenblatt.

von Arc N. (arc)


Lesenswert?

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();

von Aehh (Gast)


Lesenswert?

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.

von Bergie B. (bergie)


Lesenswert?

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

von ah (Gast)


Lesenswert?

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.

von Bergie B. (bergie)


Lesenswert?

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

von Bergie B. (bergie)


Lesenswert?

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