Forum: Mikrocontroller und Digitale Elektronik ? MCP342x Beispiel-Code / Hilfe ?


von Ingolf G. (harpax)


Lesenswert?

Hallo eGemeinde!


Ich sitzte hier nun schon seit einiger Zeit vor einem MCP3428 (12-16bit 
Sigma-Delta ADC). Irgendwie will das Teilchen nicht so recht mit mir 
reden. :-(

Hat einer von Euch dies schon geschafft?

Oder vielleicht habe ich auch das Datenblatt falsch verstanden - schaut 
doch mal bitte über meinen Weg und holt mich wenn nötig vom 
Holz-selbigen. :-)

z.Z. versuche ich es noch mit Bascom, da ich in C noch nicht so recht 
fitt bin.

(Ub = 3,3V / Abtastrate = 10 Hz)

Aber seis drum - erstmal abstrakt - vielleicht fällt Euch da schon etwas 
auf.

Hier das Datenblatt:
http://ww1.microchip.com/downloads/en/DeviceDoc/22226a.pdf

ADC_w_Adr=208 (A0 und A1 auf low)
ADC_r_Adr=209

Vor dem Lesen der ADC-Werte muss ertmal der Kanal gewählt und div. 
Einstellungen gesetzt werden.

Bit 7   = 0
Bit 6-5 = 00 (Kanel =1)
Bit 4   = 1  (Continuous Conversion Mode)
Bit 3-2 = 00 (12bit / 240Sps)
Bit 1-0 = 00 (Gain x1)

-> 00010000 = 16 = ADC_conf

So und nun zum theoretischen Programmablauf


Konfiguration setzen:

I2Cinit
I2Cstart
I2Cwrite ADC_w_Adr, ADC_conf
I2Cstop

ADC-Werte abrufen:

I2Cinit
I2Cstart
I2Cread ADC_r_Adr, ADC_h_Byte, ADC_l_Byte_, ADC_conf, NACK
I2Cstop


So habe ich es jedenfalls verstanden.
Ist es so Richtig?

Als Ausgabe bekomme ich aber (bin) das hier:

0000011 00100010 00100010

Beim Durchfahren des Potis ändert sich nur das 1. also ist das h-Byte 
OK.
Das 2. Byte bleibt gleich -> Sollte hier nicht das l-Byte sein?
Selbst wenn das 3. Byte das Conf-Byte sein sollte, so steht da ja nicht 
das drin, was ich vorher reingeschrieben habe.

Ich steh auf'm Schlauch!

Irgendjemand ne Idee???


Gruss...Harpax

von Johannes V. (j-v)


Angehängte Dateien:

Lesenswert?

Hallo Ingolf,

hier mal ein C-Code von mir der funktioniert. War nur ein "Proof of 
concept", also nur mal schnell hingeschrieben.

Das Prinzip müsstest Du aber nach BASCOM übernehmen können.

Gruß Johannes

von Ingolf G. (harpax)


Lesenswert?

N'Abend Johannes!


Dickes Danke!
Werd's mir gleich mal ansehen!


Gruss...Harpax

von Ingolf G. (harpax)


Lesenswert?

Nochmal N'Abend Johannes!


Vom Prinzip her ist es das Gleiche wie bei meinem Bascom-Code.
Also habe ich das Datenblatt wohl nicht falsch verstanden. Mist!

Tja...dann werde ich mich mal ans STM32-Bördchen setzen müssen und dort 
meine ersten i2c-Gehversuche absolvieren um einen BASCOM-Fehler 
auszuschließen. Wenn dort der gleiche Müll ausgespuckt wird...hmmm tja 
was dann?

Trotzdem nochmal Denke für Deinen Code!


Gruss...Harpax

von MWS (Gast)


Lesenswert?

Ingolf Geißler schrieb:
> meine ersten i2c-Gehversuche absolvieren um einen BASCOM-Fehler

Der Fehler sitzt, wie so oft, hinter dem Bildschirm.

Ingolf Geißler schrieb:
> I2Cread ADC_r_Adr, ADC_h_Byte, ADC_l_Byte_, ADC_conf, NACK

Du fantasierst... Oder zeigst alles Mögliche, nur nicht den 
tatsächlichen Code.

Es gibt unter Bascom weder ein I2CRead, noch ein I2CWrite, das heißt 
dort entweder I2CRByte, oder I2CWbyte und kann, wie's der Name schon 
impliziert, nur ein einzelnes Byte bearbeiten.

Dann tät's noch I2CSend und I2CReceive geben, welche mehrere Bytes 
handhaben können, gleichzeitig aber die gesamte Sequenz 
I2CStart,...,I2CStop beinhalten. Wird da noch ein extra Start/Stop 
gesendet, geht das auch in die Hose.

Vielleicht beschäftigst Du Dich erst mal mit den Grundlagen, bevor Du 
auf Basis ungültigen Codes Deine Fragen stellst.

von Ingolf G. (harpax)


Angehängte Dateien:

Lesenswert?

Hey WMS...komm mal runter - Bitte!

Wie ich oben schrieb, sind dies die abstrakten Vorgänge!
Also kein so funktionierender Code (obwohl ich zugebe, das die 
Programm-ähnliche Schreibweise dazu verleiten könnte)!
Das der Fehler oft vorm Moni sitzt...da gebe ich Dir durchaus Recht!
Aber wenn der eingeschlagene Programmweg fehlerhaft ist, tja, was dann?
Da kannste x-fach die selben Zeilen tippern - immer in der Annahme, das 
ja alles stimmt - und Du kommst doch wieder in Deiner eigenen Falle an.

Also was wäre ne Alternative?
Richtig... Auf nem anderen System das Gleiche probieren.
Und da Du Dich ja so gut auskennst, werde ich Deinem Wunsch nach dem 
Bascom-Code erfüllen. Vielleicht findest Du ja den Fehler. Würd mich 
wirklich drüber freuen.
(Hintergrund meiner Zurückhaltung bezüglich der Bascom-Zeilen: Sobald 
jemand hier Bascom erwähnt, blenden die C-User aus. Dies wollte ich 
vermeiden. OK?)


Noch kurz zur verwendeten Hard- und Software:

ATXMega32A4 mit 32MHz.
Dadurch muss abweichend vom ATMega-Code jeweils die Kanal-Nummer hinten 
dran geschrieben werden. Aus einem "I2CInit" wird dann z.B. ein "I2CInit 
#4".
(MCP3428 und ATXMega werden vom gleichen Wandler mit 3,3V versorgt.)
BASCOM-v2.076

OK, wer findet den Fehler?

(Bitte kein Gesabbel a la "BASCOM ist Müll" etc. sowas zeigt nur 
ungenügende Hirnreife um auch über dem C-Tellerrand blicken zu können!)


Gruss...Harpax

von Ingolf G. (harpax)


Lesenswert?

Hallo Mitstreiter!


Ich hau mir gleich selber nen Knüppel über!

Wenn man NACK mit ACK tauscht, dann funktioniert es!!!

Himmel A*sch und Zwirn!!!
Das hätte mir auch schon am Fr auffallen können!

Naja - was solls!

Wäre der Schnipsel nicht was für die Code-Sammlung
(Also bitte ohne mein Getexte!)



Gruss...Harpax (mit Beule!)

von MWS (Gast)


Lesenswert?

Ingolf Geißler schrieb:
> Wie ich oben schrieb, sind dies die abstrakten Vorgänge!

Einen Code-Fehler auf Basis abstrakter Vorgänge zu suchen, ist wie der 
Besuch beim Zahnarzt, wenn der Fuß schmerzt.

> (Hintergrund meiner Zurückhaltung bezüglich der Bascom-Zeilen: Sobald
> jemand hier Bascom erwähnt, blenden die C-User aus. Dies wollte ich
> vermeiden. OK?)

Da Du genau den selben "abstrakten" Code in's Bascom-Forum gepostet hast 
- wer sollte sich denn dort nicht "ausblenden" ?

von MWS (Gast)


Lesenswert?

Ingolf Geißler schrieb:
> Wenn man NACK mit ACK tauscht, dann funktioniert es!!!

Ja, so macht man das normalerweise, das letzte gelesene Byte ist mit 
NACK zu quittieren.

von Ingolf G. (harpax)


Lesenswert?

@MWS

Und der Zahn-Doc stellt dann nen Nierenschaden fest ... ja-ja :-)

Tja, und wenn Du richtig gelesen hättest, dann wäre DIR der Fehler vor 
mir aufgefallen und auch die Erklärung für's Doppelposting wäre Dir 
sicher dann auch nicht entgangen.

Bin selber kein Freund vom Doppelposting, da aber die Zeit arg mächtig 
drückt, musste es leider sein. Wer mich hauen möchte - bitte gern - auch 
für die NACK/Ack-Verwechslung. Da stehe ich jedem Knüppel gern zur 
Verfügung!


Gruss...Harpax

von MWS (Gast)


Lesenswert?

Ingolf Geißler schrieb:
> Tja, und wenn Du richtig gelesen hättest, dann wäre DIR der Fehler vor
> mir aufgefallen und auch die Erklärung für's Doppelposting wäre Dir
> sicher dann auch nicht entgangen.

Ich hatte erst die Unlogik Deines Posts beantwortet und mir danach den 
Code angesehen, der Rest hat sich überschnitten.

Bei meiner Aussage ging's nicht um's Doppelpost an sich, sondern um den 
Umstand, dass Du hier erklärst, Du postest abstrakten Code, weil Du die 
Jünger des C nicht verärgern willst.

In's Bascom-Forum setzt Du dagegen denselben unbrauchbaren Code rein, 
obwohl Dir dort wohl kein C'ler böse sein wird. Das war nicht besonders 
schlüssig.

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.