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...
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.
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?
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
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.
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
voidmain(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
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
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?
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.
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
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.
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***************************/
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
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.
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.
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:
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
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?
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.
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.
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.
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.
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.
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
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.