Forum: Mikrocontroller und Digitale Elektronik MCP 3421 - wer kennt sich aus


von Suchender (Gast)


Lesenswert?

Hallo
Möchte in einem Prolekt mit dem MCP 3421 arbeiten. Er ist relativ klein. 
So was mit SOT23/6. Habe das Datenblatt aus dem Netz geladen und 
versucht zu verstehen. So was mit Auflösung von 16 bis 18 bit. Leider 
habe ich noch nicht verstanden wie man das setzen kann bzw. wie die 
Daten ausgelesen werden.
Könnte mir da jemand weiterhelfen?
Danke
LG Gastl...

von Crazy Harry (crazy_h)


Lesenswert?

DiemKonfiguration (Auflösung) wird per I2C in den MCP geschrieben und 
auf dem gleichen Weg werden die Daten gelesen. Der hat aber eine interne 
Referenzspannung, so daß der ursprüngliche Messbereich (und damit die 
volle Auflösung) nur im Bereich +/-2.048V gilt. D.h. wenn du jetzt z.B. 
18 Bit eingestellt hast aber nur im positiven Bereich misst, hast du 
schon nur noch 17 Bit.

von Pete K. (pete77)


Lesenswert?

Schau Dir mal im DB die Figures 5.2-5.4 an und lerne diese zu verstehen.
Das ist eine I2C Kommunikation.
Im ersten Schritt sendest Du die Adresse und das Konfigurationsregister.
Zum Einlesen die Adresse (mit Read-bit=0) senden und dann 5x 
hintereinander jeweils ein Byte einlesen.

Du kennst den Umgang mit I2C?

von Suchender (Gast)


Lesenswert?

Danke für eure Antworten. Die Bereiche 5.2 - 5.4 habe ich mir gezogen 
und sie über google Übersetzer laufen lassen. Mit dem Sinn von solchen 
Beschreibungen hat er aber noch Probleme und damit ich auch. Mit I2C 
kenn eich mich aus.
Als Adresse von dem IC habe ich die 0xD2 ermittelt. Der MCP wird damit 
auch vom Prozessor gefunden. Wenn ich das richtig gelesen habe, muss 
zuerst etwas an das Konfigurationsregister geschickt werden. Danach die 
Werte auslesen.
In diesen 2 Sachen fangen meine Probleme an. Einstellung der 16-18 Bit 
usw. Habe eine kurze Erklärung gefunden, in der 3 Register ausgelesen 
werden und nur bestimmte Bits geschoben werden in Abhängigkeit der 
eingestellten Bits.
Verstehe die Belegung der Bits nicht. Werde mal versuchen die 
übersetzung zu verstehen. Komme bestimmt mit Fragen wieder zu euch.
LG Gastl

von Crazy Harry (crazy_h)


Lesenswert?

So sieht das in etwa aus:
TWIOut($68,%00011000);      // MCP3421, 16Bit, continuous Read

und zerbrich dir nicht den Kopf wegen der Adresse. Mein Compiler handelt 
das anders. %01101000 entspricht %11010000=$D0 .... ich muß das ohne 
RW-Bit also eins rechts geshiftet angeben und deiner wurde halt mit $D2 
ausgeliefert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


von Suchender (Gast)


Lesenswert?

Hallo Rufus
danke für die Info. Werde es genau lesen. Stehen ja einiges drin.
Mit der Adresse mache ich mir keinen Kopf. Habe einen Scanner drüber 
gejagt und der hat die Adresse genau ermittelt. Dann noch mit den 
Angaben im Datenblatt verglichen, ob der Bereich stimmt und gut ist es.
Habe etwas gefunden was ich als Grundlage für das Verständnis nehmen 
will. Vielleicht kann es ja mal jemand anschauen ob es stimmt.
1
void main(void)
2
  {
3
     osccon = 0x41;
4
     //first, configure ADC
5
      i2c_start();  
6
      i2c_write(0xD0); //write mode
7
      //16bit, continuous conversion, PGA = 1V/V
8
      i2c_write(0x1C);
9
      i2c_stop();
10
   while(1)
11
    {
12
      i2c_start();
13
      i2c_write(0xD1);//Read mode
14
      high_buffer = i2c_read();
15
      low_buffer = i2c_read();
16
      i2c_stop();
17
      high_buffer&=0x7F;
18
      adc_in = high_buffer;
19
      adc_in <<= 8;
20
      adc_in += low_buffer;   
21
      }
22
   }
Ist nur der erste Versuch eines Programmes und muss noch stark 
verbessert werden.
LG Gastl

von Pete K. (pete77)


Lesenswert?

Du könntest auch die Rückgabewerte der aufgerufenen Funktionen prüfen, 
falls diese welche haben.

Und ein i2c_init() fehlt evtl. auch noch.

von Suchender (Gast)


Lesenswert?

Hallo Pete
in dem gezeigten Code fehlt noch einiges. Möchte aber zu erst begreifen 
was ich setzen muss. Verstehe das Datenblatt an der Stelle nicht so 
richtig. Wahrscheinlich ist eine Sinngemässe übersetzung mit google doch 
nicht so gut bei technischen Sachen

von Suchender (Gast)


Lesenswert?

Habe weiter im Datenblatt gelesen:

1. Byte - Adress Byte
2. Byte - (Upper) Oberstes Byte
3. Byte - mittleres Byte
4. Byte - unterstes Byte
5. Byte - Configurations Byte

Wenn ich das richtig verstanden habe, ist das 1. Byte für die Adresse 
und das 5. Byte für Einstellungen. In den Bytes 2,3,4 steht der Wert. Je 
nach der Einstellung erfolgt die Wandlung mit 12 oder 14 oder 16 oder 18 
Bit.
Sehe ich das richtig?

von viribus unitis (Gast)


Lesenswert?

Suchender schrieb:
> Sehe ich das richtig?

Falsch geraten.
Im Microchip-Datenblatt wird das Konfigurationsregister doch als erstes 
beschrieben. Darin sind Bit 2 und 3 für die Samplingrate und damit für 
die Auflösung zuständig.
Nebenbei, das Datenblatt verschweigt die mäßige Driftqualität der 
eingebauten Referenz nicht, die man zwangsweise benutzen muss. Bereits 
bei 14 Bit Auflösung sollte man besser die Schaltung nicht schief 
angucken, es sei denn die Freude über eine Pseudogenauigkeit ist das 
Ziel.

von Suchender (Gast)


Lesenswert?

Habe nicht geraten. Diese Info entsstammt dem Datenblatt auf Seite 
14/15.
Dort sind die einzelnen Bytes angegeben. Da ich da von ausgegangen bin 
das die Register in dieser Reihenfolge auch beschrieben und gelesen 
werden. Also falsch gelesen oder verstanden. Zurück zum Datenblatt und 
neu anfangen zu lesen.
Danke für deine Info

von Suchender (Gast)


Lesenswert?

Kennt sich weraus?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Suchender schrieb:
> weraus?

Auch wenn es in einem recht primitiven BASIC-Dialekt geschrieben ist, 
das von mir verlinkte Beispiel sollte auch für einen C-Programmierer 
hinreichend verständlich sein, um daraus Erkenntnisse gewinnen zu 
können.

Vergleiche doch mal den Basic-Code mit dem, was Du Dir so ausgedacht 
hast, und mit dem, was Du dem Datenblatt entnehmen kannst.

von Suchender (Gast)


Lesenswert?

Danke Rufus. Habe den Basic Code auseinander genommen. Sieht schon weit 
aus besser aus. Zusammen mit dem Datenblatt könnte es klappen.
Danke

von Suchender (Gast)


Lesenswert?

Hallo
Muss noch mal fragen. Den Code habe ich soweit verstanden und zum laufen 
gebracht. Die Adresse geht, bekomme eine Anzeige, Zeige die Werte an.
Wie berechne ich das? Habe die folgende Sache gefunden:
1
/**********************conversion into voltage***************************/
2
  /*           vref                                               */
3
  /*  U(eingelesen)=  ----------- * adresult                */
4
  /*           2^bitzahl                      */
5
  /*                                    */
6
  /*   vref     4,096V     4,096V                      */
7
  /* --------= --------= ----------=  0,000015625V            */
8
  /*  2^bits     2^18      262144                      */
9
  /************************************************************************/
Folgendes habe ich gefunden:
vref 2,048V  (4,096V ?)
Auflösung bei 18 Bit 0,000015625V
Gibt es eine kleine Anleitung zur Hilfe dazu? Im Datenblatt des 
Herstellers (User) steht auch was dazu. Leider auch unklar.
Könnte mir jemand dabei helfen?

LG

von Suchender (Gast)


Lesenswert?

Kann mir jemand helfen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was verstehst Du an dem nicht, was Du da hingeschrieben hast?

Du hast einen ADC mit n Bit Auflösung. Du hast eine Referenzspannung.

(Beide stehen im Datenblatt)

Und mit der Formel kannst Du ausrechnen, mit welchem Faktor Du den vom 
ADC gelieferten Wert multiplizieren musst, um die Spannung zu 
berechnen, die am ADC-Eingang anliegt.


Beispiel:

Gegeben sei ein 8-Bit-ADC mit einer Referenzspannung von 2.56 Volt.

Also ist der Faktor

vref / 2^Bits = 2.56 Volt / 2^8 = 2.56 Volt / 256 = 0.01 Volt

Liefert Dein ADC den Wert 100, wird an seinem Eingang eine Spannung von 
1 V angelegen haben.

von MWS (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Vielleicht hilft ja das hier:
> http://dl6gl.de/software/externer-adc-mcp3421-mit-bascom

> Auch wenn es in einem recht primitiven BASIC-Dialekt geschrieben ist,

Lustig, wenn C-Fans herablassend von "primitiv" sprechen, gleichzeitig 
sich genötigt fühlen, solcherlei "primitiven" Code zu verlinken, um 
anderen Zauberlehrlingen in C den Start überhaupt erst zu ermöglichen.

Ansonsten, den "Primitiv"-Code würde man auch nicht viel anders in C 
programmieren. Verwunderlich ist nur, woraus diese Hochnäsigkeit 
entsteht.

Möglicherweise liegt's daran, dass man sich selbst so lange mit C 
gegeißelt hat, um sich der Sprache anzupassen und sie irgendwie zu 
verstehen und nun zur Belohnung wenigstens ein wenig arrogant auf 
Anderes herabblicken möchte.

von Suchender (Gast)


Lesenswert?

Hallo Rufus
bin noch dem auslesen der Daten. Die Werte werden mir angezeigt.
Fangen wir aber noch mal von vorn an.
Es wird als erstes dem NCP die Adresse und die Sample und PGA 
mitgeteilt. Das könnte so aussehen:
1
void Config_MCP3421()
2
  {
3
  //first, configure ADC auf PGA/Sample  8/18 = 1f
4
  i2c_start(MCP_w);
5
  i2c_write(0x1f);   //18 bit, continuous conversion, PGA = 8V/V
6
  i2c_stop();
7
  }
Das bedeutet: Sample 18 Bit und Verstärkung von 8
Als nächstes werden die 3 register gelesen mit:
1
i2c_start(MCP_r);
2
    i2c_readAck();            // first data is old
3
    for (i=0; i<3; i++)   // besser mit i=4???
4
      {
5
      data[i]=i2c_readAck();
6
      }
7
    i2c_readNak();
8
    i2c_stop();
zur Kontrolle laase ich mir das Anzeigen:
1
data_com = data[0]+ data[1] + data[2]; //setting together
2
    
3
    
4
    itoa(data[0],Buffer, 10 );        // Variable umwandeln...
5
    lcd_printlc(1,2,Buffer);      // ...und anzeigen
6
    
7
    itoa(data[1],Buffer, 10 );        // Variable umwandeln...
8
    lcd_printlc(2,2,Buffer);      // ...und anzeigen
9
    
10
    itoa(data[2],Buffer, 10 );        // Variable umwandeln...
11
    lcd_printlc(3,2,Buffer);      // ...und anzeigen
12
    
13
    
14
    itoa(data_com,Buffer, 10 );        // Variable umwandeln...
15
    lcd_printlc(4,2,Buffer);      // ...und anzeigen
Nach dem Datenblatt ist im
1. Byte die Adresse
2. Byte Upper Date mit D17 und D16
3. Byte Middle Byte mit D15 - D8
4. Byte Lower Date mit D7 - D0
Bei 18 Bit Auflösung muss ich alle verwenden.
Das auslesen mach ich mit
1
for (i=0; i<3; i++)
2
      {
3
      data[i]=i2c_readAck();
4
      }
In data[0] steht dann das 1. Byte mit D17 und D16 bis zu 3. Byte mit D7 
- D0. Wenn ich nur 16 Bit nutze brauch D17 und D16 nicht.
Was ich nicht verstehe ist, im 3.Byte mit D15 - D8 erfolgt die 
schnellste Änderung bei berühren des Thermoelementes. Im 4. Byte erfolgt 
die Änderung langsamer.
An dem Streit oder Diskussion mit Basic oder C möchte ich mich nicht 
beteiligen. Jede Sprache hat sein Vor- und Nachteil. Habe den Code von 
Basic genutzt um mich rein zu finden. Teilweise mühsam um die andere 
Ausdruckweise zu verstehen.
Hänge nur noch in der Berechnung und der damit verbundenen Einstellung 
von Sample und PGA.
Erst mal die Frage klären was angezeigt wird und i besser mit 3 oder 4 
geht.
 LG Su

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MWS schrieb:
> Lustig, wenn C-Fans herablassend von "primitiv" sprechen, gleichzeitig
> sich genötigt fühlen, solcherlei "primitiven" Code zu verlinken, um
> anderen Zauberlehrlingen in C den Start überhaupt erst zu ermöglichen.

Ach ja, die alte Leier. Bascom ist ein primitiver Basic-Dialekt, weil 
Bascom keine so komplexen Ausdrücke wie "a = b * Funktion(d + 
Funktion2(e)) / c" erlaubt, nicht weil Basic an sich primitiv sein 
müsste.

Verlinkt habe ich das Beispiel, um die Ansteuerung des ADC zu 
erläutern.

Der Threadstarter hat das --im Gegensatz zu Dir-- auch intellektuell 
erfassen können.

Suchender schrieb:
> data_com = data[0]+ data[1] + data[2]; //setting together

Das addiert die Werte, ohne sich über deren Wertigkeit Gedanken zu 
machen.

Stell Dir vor, Du willst die Zahl "123" erhalten, hast als Ausgangswerte 
aber nur die drei Ziffern "1", "2" und "3".

Was Du da gemacht hast, ist

Wert = 1 + 2 + 3;

Daß das nicht 123 ist, sondern 6, dürfte klar sein. Du musst die 
einzelnen Ziffern mit ihrem jeweiligen Stellenwert multiplizieren, bevor 
Du sie addierst, hier also mit 100, 10 und 1.

Jetzt blasen wir das ganze ein bisschen auf:

Du hast die Eingangswerte "12", "34" und "56" und möchtest 123456 
erhalten.

Wert = 12 + 34 + 56 funktioniert aus genau dem gleichen Grund nicht wie 
oben, Du musst jeden der Eingangswerte mit seinem jeweiligen Stellenwert 
multiplizieren - das sind 10000, 100 und 1.


Und genau dieses Prinzip musst Du jetzt auf Deine drei Register 
anwenden. Der einzige Unterschied ist der, daß die Stellenwerte hier 
nicht dezimal sind, sondern Zweierpotenzen - 2^16, 2^8, und 2^0.

Betrachtest Du Dir Deine Register mal genau, wirst Du sehen, daß das 
jeweils unterste Bit in diesen Registern genau diese Wertigkeit (65536, 
256 und 1) hat.



Wird's klarer?

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Ach ja, die alte Leier. Bascom ist ein primitiver Basic-Dialekt, weil
> Bascom keine so komplexen Ausdrücke wie "a = b * Funktion(d +
> Funktion2(e)) / c" erlaubt, nicht weil Basic an sich primitiv sein
> müsste.

> Verlinkt habe ich das Beispiel, um die Ansteuerung des ADC zu
> erläutern.

Du konntest dem TE kein vernünftiges Beispiel in seiner Mundart 
präsentieren, also musst Du so etwas Dir unangenehmes "primitives" 
verlinken. Um dafür und das eigene Ego ein wenig zu kompensieren, kannst 
Du das nicht ohne gleichzeitige Herabwertung des verlinkten Inhalts 
machen. Dabei wendest Du Deine Definition von primitiv an, die nicht 
maßgeblich ist.

Ergo: das hat weniger mit Primitivität zu tun, als mit Psychologie.

Um's zu zeigen, kannst Du's einfach nur verlinken, es bestand keine 
Notwendigkeit einer Bewertung. Außer Du fühlst Dich dadurch besser LOL.

von Suchender (Gast)


Lesenswert?

Es wird klarer. Das mit der Addition der Werte habe ich übersehen, 
sorry. Habe es so jetzt drin:
1
data[0] <<=16;      // oben
2
data[1] <<=8;      // mitte
3
data_com = data[0]+ data[1] + data[2];
Das müsste die Bits um jeweols 8 Bit nach schieben. data[2] lasse ich 
so, da es der toifste Wert ist. Muss jetzt nur drauf achten, das data 
gross genug ist.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MWS schrieb:
> Um dafür und das eigene Ego ein wenig zu kompensieren, kannst Du das
> nicht ohne gleichzeitige Herabwertung des verlinkten Inhalts machen.

Du willst es nicht kapieren, wie? Ich habe mitnichten den verlinken 
Inhalt herabgewertet, sondern nur den BASIC-Dialekt, der da genutzt 
wird.

Mehr nicht. Den restlichen pseudopsychologischen Oberbau schiebst Du in 
erster Linie als Dein eigenes Problem vor Dir her. Versuch' mal, daran 
zu arbeiten.

Suchender schrieb:
> data[2] lasse ich so, da es der toifste Wert ist. Muss jetzt nur drauf
> achten, das data gross genug ist.

Ja, "data" muss hier mindestens ein 24-Bit-Datentyp sein. Da so etwas 
nur in Ausnahmefällen von C-Compilern unterstützt wird, bietet sich hier 
der Gebrauch eines 32-Bit-Datentyps an.

Seit der Jahrtausendwende kann man dafür uint32_t verwenden, davor 
musste man ins Compilerhandbuch sehen, um zu wissen, ob unsigned int 
dafür genügt.

von MWS (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Du willst es nicht kapieren, wie? Ich habe mitnichten den verlinken
> Inhalt herabgewertet, sondern nur den BASIC-Dialekt, der da genutzt
> wird.

Doch ich habe kapiert wie Du tickst, Du nimmst Dir etwas zu leihen, z.B. 
weil es Dir zu viel Arbeit ist, es aus eigener Kraft zu erklären, oder 
weil Du es in diesem Fall mangels Erfahrung nicht kannst.

Bei dieser Gelegenheit der Leihe erklärst Du, dass das Werkzeug, mit dem 
das Geliehene gemacht wurde, Mist ist.

Fand ich merkwürdig. Deine Meinung kannst Du ja gerne haben, aber es ist 
eine Frechheit, sich einer fremden Arbeit zu bedienen und gleichzeitig 
zu erklären, das Werkzeug mit dem die Arbeit gemacht wurde, sei 
primitiv.

Was wäre dann auch primitiv? Richtig - Assembler. Nur hätte der TE das 
wahrscheinlich nicht mehr nach C übersetzen können. Du darfst doch froh 
sein, ein leicht übersetzbares Beispiel in Bascom gefunden zu haben und 
dennoch äußerst Du Dich abwertend.

> Mehr nicht. Den restlichen pseudopsychologischen Oberbau schiebst Du
> in erster Linie als Dein eigenes Problem vor Dir her. Versuch' mal,
> daran zu arbeiten.

Jeder weniger hochnäsige Mensch hätte geschrieben: "schau', da gibt's 
ein funktionierendes Beispiel in Basic". Ein Hinweis auf "primitiv" war 
völlig unnötig.

Du kannst mir gerne den Grund nennen, was für einen Nutzen der TE daraus 
ziehen konnte, dass Du die benutzte Programmiersprache eines Beispiels, 
dass ihm ja offenbar mehr half als Du, als "primitiv" bezeichnest.

Ich konnte keinen Grund außer Deinem Ego erkennen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

MWS schrieb:
> Jeder weniger hochnäsige Mensch hätte geschrieben: "schau', da gibt's
> ein funktionierendes Beispiel in Basic". Ein Hinweis auf "primitiv" war
> völlig unnötig.

Anscheinend muss ich mit meiner Kritik an Bascom irgendwas ganz 
grundlegendes in Deinem Gemüt verletzt haben.

Hast Du mal darüber nachgedacht, ob Deine Reaktion in irgendeiner Weise 
gerechtfertigt ist?

> Doch ich habe kapiert wie Du tickst, Du nimmst Dir etwas zu leihen, z.B.
> weil es Dir zu viel Arbeit ist, es aus eigener Kraft zu erklären, oder
> weil Du es in diesem Fall mangels Erfahrung nicht kannst.

Aha. Ich denke, daß ich das nicht weiter kommentieren muss.

Ich habe dem Threadstarter helfen können; Du hast hingegen nur Dein 
empfindsames und merkwürdiges Gemüt zur Schau gestellt.

von Suchender (Gast)


Lesenswert?

Schlage einen Kompromiss für beider vor. Errichte einen virtuellen Platz 
in der Grösse von 5m x 5m oder wenn es besser ist von 32 Bit x 32 Bit 
hier im Netz. Dort könnt ihr euch die Argumente um die PC-Tastatur oder 
sogar die Ohren hauen. So richtig mit Argument und Gegenrede, so richtig 
mit Freude am gedruckten Wort und voller Leidenschaft. Soll mir alles 
egal sein, hauptsache ich bekomme nichts ab und meine Prbleme werden 
gelöst.

Stelle euch den Kampfplatz bereit:

   ======================================
   |                                    |
   |                                    |
   |                                    |
   |                                    |
   |                                    |
   ======================================

An der einen Seite               an der anderen Seite

Bitte die entsprechenden Seiten wählen, in Position gehen und die 
Schlacht kann beginnen
Wünsche viel Spass dabei

von MWS (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Anscheinend muss ich mit meiner Kritik an Bascom irgendwas ganz
> grundlegendes in Deinem Gemüt verletzt haben.

Nö, nicht wirklich, das mc.net ist durchaus bekannt dafür von 
C-Fanatikern durchsetzt zu sein, ein abfälliger Seitenhieb auf andere 
Sprachen ist da so ungewöhnlich nicht. Zartbesaitet bin ich im übrigen 
auch nicht.

Aber Du musstest einen unnötigen Seitenhieb austeilen, ist doch nur 
gerecht, wenn Du ihn wieder zurückbekommst, nicht wahr?

> Hast Du mal darüber nachgedacht, ob Deine Reaktion in irgendeiner Weise
> gerechtfertigt ist?

Ja, hab' ich, siehe einen Textblock vorher.

> Aha. Ich denke, daß ich das nicht weiter kommentieren muss.

Nein, musst es nur so lesen, wie's da steht, dass Du das könntest würde 
ich nicht bezweifeln.

> Ich habe dem Threadstarter helfen können; Du hast hingegen nur Dein
> empfindsames und merkwürdiges Gemüt zur Schau gestellt.

Ich habe auf Deine merkwürdige Art reagiert und tatsächlich hat ihm 
hauptsächlich fremder Code geholfen. Du natürlich auch ein wenig.

von Crazy Harry (crazy_h)


Lesenswert?

Sag mal Rufus ich dachte ihr Mods hättet es als erste gelernt diese 
anonymen M&M-Affen zu ignorieren? ;) :D

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.