www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik AD7792/AD7793 Code gesucht


Autor: Bergie B. (Firma: HS-OWL) (bergie)
Datum:

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
Autor: Michael H. (morph1)
Datum:

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.
Autor: Bergie B. (Firma: HS-OWL) (bergie)
Datum:

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
Autor: Aehh (Gast)
Datum:

Na. Der ADC hat einen Befehlssatz, dh diverse Register muessen
geschrieben werden, steht aber alles im datenblatt.
Autor: Arc Net (arc)
Datum:

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:
// defines
#define AD_IDREG_READ    0b01100000
#define AD_STATUSREG_READ  0b01000000
#define AD_CONFREG_WRITE  0b00010000
#define AD_MODEREG_WRITE  0b00001000
#define AD_DATAREG_READ    0b01011000
#define AD_STATUSREG_7792       0x80
#define AD_STATUSREG_7793       0x88
#define AD_STATUSREG_7794       0x80 
#define AD_STATUSREG_7795       0x88
#define AD_IDREG_7792           0x0a
#define AD_IDREG_7793           0x0b
#define AD_IDREG_7794           0x0f
#define AD_IDREG_7795           0x0f
#define AD_MODEREGH_IDLE  0b01000000
#define AD_MODEREGL_IDLE  0b00000000
#define AD_MODEREGH_CONT  0b00000000
#define AD_MODEREGL_CONT  0b00000000
#define AD_MODEREGH_SINGLE  0b00100000
#define AD_MODEREGL_SINGLE  0b00000000
#define AD_MODEREGH_INTZSC  0b10000000
#define AD_MODEREGL_INTZSC  0b00000000
#define AD_MODEREGH_INTFSC  0b10100000
#define AD_MODEREGL_INTFSC  0b00000000
#define AD_MODEREGH_PWRDWN  0b01100000
#define AD_MODEREGL_PWRDWN  0b00000000
// initialization

// presence detect, read id and status register
ADCSelect();
SPITransceive(AD_IDREG_READ);
id = SPITransceive(0x00) & 0x0f;
SPITransceive(AD_STATUSREG_READ);
stat = SPITransceive(0x00);
ADCDeselect();

if (res1 != ...) return ...;
...

// write configuration
ADCSelect();
SPITransceive(AD_CONFREG_WRITE);
// set bias, uni/bipolar and gain
SPITransceive(channelConfHigh);
// set reference, buffer and channel
SPITransceive(channelConfLow);

// start conversion, single shot
SPITransceive(AD_MODEREG_WRITE);
// amp only on AD7794/95
SPITransceive(AD_MODEREGH_SINGLE | amp);
SPITransceive(AD_MODEREGL_SINGLE | speed | clock);
ADCDeselect();
  
// get result, byte order!
uint32_t v = 0;
uint8_t* resP = &v;
ADCSelect();
SPITransceive(AD_DATAREG_READ);
resP[2] = SPITransceive(0x00);
resP[1] = SPITransceive(0x00);
resP[0] = SPITransceive(0x00);
ADCDeselect();
Autor: Aehh (Gast)
Datum:

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.
Autor: Bergie B. (Firma: HS-OWL) (bergie)
Datum:

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
Autor: ah (Gast)
Datum:

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.
Autor: Bergie B. (Firma: HS-OWL) (bergie)
Datum:

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
Autor: Bergie B. (Firma: HS-OWL) (bergie)
Datum:

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.

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net