INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
17.06.2014, 14:30 (Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2014 15:19 von Vilius.)
Beitrag #1
Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Liebe Forum-Mitglieder.

Mein Ziel ist es, die Ausgangsspannung als auch die Stromanzeige meines Netzteiles von analoger Instrumentenanzeige auf digitale TFT-Anzeige umzustellen.
Dazu habe ich nachstehendes 1.8" Display an einem UNO Arduino angeschlossen.

Die vorab aufgebaute Anzeige mit einem ST7735R LCD über die Pin's 13(SCL), 11(SDA), 10(CS), 9(DC), 8(Res.) funktioniert soweit und ist in der Lage über die Pins's A4 u. A5 (I2C-Reader) eingelesenen simulierte Daten, Spannung und Strom von einem anderen Arduino Mega 2560 Pin's SDA u. SCL (I2C-Slave) anzuzeigen. Der Mega dient als Testwertgenerator für verschiedene Spannungs und Ampere Werte zur Anzeige auf dem Display an dem UNO und verrichtet seine Datenübertragen fehlerfrei. Den Mega benutze ich zur Lastenverteilung.

Meine Unsicherheit bezüglich SPI Betrieb an dem Mega besteht darin, wie ich die beiden ADC-Module vom Typ LTC2400, jeweils ein Modul für Spannung und Strom an dem Mega montiere und in Besonderem, wie ich in der Software das erste Modul z.B. mit SS (Select Slave) selktiere, nach der Datenwertübergabe deselektiere und danach dieselbe Pozedur mit dem zweitem Modul ebenfalls über SS durchführe. Insbesondere interessiert mich die praktische Verdrahtung der Pin's zur Modulselektierung auf dem Mega 2560 PCB.
Siehe auch File LTC2400-Mega-Uno-ST7735R.jpg im Anhang.

Ich habe den Verdacht... das geht nur mit dem DUE. Ist das Richtg?

Ein unbeschaltetes UNO-Board mit nur EINEM LTC2400 funktioniert zum Test der nachstehenden Software von Martin Nawrath, Kunsthochschule fuer Medien Köln, einwandfrei. Einen zweiten LTC habe ich noch nicht hinzugeschaltet oder organisiert.
http://interface.khm.de/index.php/lab/ex...converter/



Die Software habe ich für meine Lesbarkeit geringfügig geändert, wird mit der Arduino Vers. 1.0.5 fehlerfrei kompiliert und zum UNO-PCB transferiert.

Code:
/*************************** Software Begin *********************/

// LTC2400 24bit ADC Module
//
// Application Demo: 7 digit voltmeter
// 24bit ADC IC: LTC2400
// 4.096 precision reference: LT1021C-5
// By coldtears electronics
// LTC2400 code is adapted from Martin Nawrath
// Kunsthochschule fuer Medien Koeln
// Academy of Media Arts Cologne
// Läuft auf dem UNO-PCB.... OK!!

/************************* Variablen **************************/
float volt;
float v_ref=4.094;                  // Reference Voltage, 4.094 Volt for LT1021-5 or 3.0 Volt for LP2950-3
long int ltw = 0;                   // ADC Data ling int
int cnt;                            // counter
byte b0; //
byte sig;                           // sign bit flag
char st1[20];                       // float voltage text

/************************ define / include *********************/
#include <Stdio.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#define LTC_CS 2                    // LTC2400 Chip Select Pin on Portb 2
#define LTC_MISO 4                  // LTC2400 SDO Select Pin on Portb 4
#define LTC_SCK 5                   // LTC2400 SCK Select Pin on Portb 5

/************************** Setup *****************************/
void setup()
{cbi(PORTB,LTC_SCK);                 // LTC2400 SCK low
sbi (DDRB,LTC_CS);                  // LTC2400 CS HIGH
cbi (DDRB,LTC_MISO);
sbi (DDRB,LTC_SCK);
Serial.begin(57600);                // init SPI Hardware
sbi(SPCR,MSTR) ;                    // SPI master mode
sbi(SPCR,SPR0) ;                    // SPI speed
sbi(SPCR,SPR1);                     // SPI speed
sbi(SPCR,SPE);                      //SPI enable
Serial.println("LTC2400 ADC Test");}

/************************** printFloat *****************************/
void printFloat(float value, int places)
{int digit;
float tens = 0.1;
int tenscount = 0;
int i;
float tempfloat = value;
float d = 0.5;
if (value < 0)
d *= -1.0;
for (i = 0; i < places; i++)
d/= 10.0;
tempfloat += d;
if (value < 0)
tempfloat *= -1.0;
while ((tens * 10.0) <= tempfloat)
   { tens *= 10.0;
     tenscount += 1;}
if (value < 0)
Serial.print('-');
if (tenscount == 0)
Serial.print(0, DEC);
for (i=0; i< tenscount; i++)
  { digit = (int) (tempfloat/tens);
    Serial.print(digit, DEC);
    tempfloat = tempfloat - ((float)digit * tens);
    tens /= 10.0;}
if (places <= 0)
return;
Serial.print(',');
for (i = 0; i < places; i++)
  {tempfloat *= 10.0;
   digit = (int) tempfloat;
   Serial.print(digit,DEC);
   tempfloat = tempfloat - (float) digit;}
}
/*************************** SPI_read **************************/
byte SPI_read()
{SPDR = 0;
  while (!(SPSR & (1 << SPIF))) ;     /* Wait for SPI shift out done */
  return SPDR;}

/************************** Main - Program **************************/
void loop()
{ cbi(PORTB,LTC_CS);                // LTC2400 CS Low
  delayMicroseconds(1);
  if (!(PINB & (1 << 4)))           // ADC Converter ready ?
   { // cli();
     ltw=0;
     sig=0;
     b0 = SPI_read();               // read 4 bytes adc raw data with SPI
     if ((b0 & 0x20) ==0) sig=1;    // is input negative ?
     b0 &=0x1F;                     // discard bit 25..31
     ltw |= b0;
     ltw <<= 8;
     b0 = SPI_read();
     ltw |= b0;
     ltw <<= 8;
     b0 = SPI_read();
     ltw |= b0;
     ltw <<= 8;
     b0 = SPI_read();
     ltw |= b0;
     delayMicroseconds(1);
     sbi(PORTB,LTC_CS);             // LTC2400 CS Low
     if (sig) ltw |= 0xf0000000;    // if input negative insert sign bit
     ltw=ltw/16;                    // scale result down , last 4 bits have no information
     volt = ltw * v_ref / 16777216; // max scale
     char tmp[10];
     dtostrf(volt,6,6,tmp);
     mp[8]='V';
     tmp[9]='\n';
     Serial.print(cnt++);
     Serial.print(" : ");
     printFloat(volt,6);            // print voltage as floating number
     Serial.println(" ");}
  sbi(PORTB,LTC_CS);                // LTC2400 CS hi
  delay(1000);                      // delay(1000); orig
}

/************************* Software Ende ***********************/

Meine Versuche bereits nur ein ADC-Modul !! U N D !! obige TFT-Anzeige mit dem UNO-PCB zum Laufen zubringen sind wegen des ?Hardware-Adressierugkonfliktes? gescheitert... :-(

Obiger ADC-Modul Program-Code wurde nun unverändert fehlerfrei für den Mega kompiliert und transferiert .
Anstelle der UNO Pins wurden nun die Mega Pins wie nachstehed angegeben, benutzt.

UNO-Signal-MEGA
10 ---- SS --- 53
12 -- MISO -- 50
13 --- SCK --- 52

Jedoch funktionierte weiterhin nur das Display mit einer String-Testausgabe vom Mega an den UNO. Eine schwach gerippelte Werteausgabe "EINES" ADC-Konverters bleibet selbst am seriellen Monitor des Mega aus.
Selbst wenn ich das Display vom Mega trenne und nur die Software wie sie auf dem UNO läuft für den Mega neu kompiliere und zum Mega ohne Fehler transferiere gibt das Program nur den String "LTC2400 ADC Test" auf dem PC-Monitor aus. Das sieht so aus als wenn ich das Modul nicht richtig am Mega angeschlossen habe.

Genau hier beginnt mein Problem. Wie wird obige Software an ein MEGA-PCB angepasst, wenn überhaupt notwendig und das ADC-Modul über den SPI -Bus verdrahtet?
Lässt sich der Mega überhaupt über die selben Register wie mit obiger UNO-Software ansprechen?
Siehe auch File LTC2400-Mega-Uno-ST7735R.jpg im Anhang.

Vermutlich laufen die ! ZWEI ! ADC's nur am DUE mit korrektem SS -Timing angeschlossen, problemlos ? Dieser könnte ja die beiden Daten Spannung und Strom an das UNO-PCB, welches für die Dislpay-Ausgabe zuständig ist, senden.

In der Hoffnung dem Forum als "Anfänger" keine unlösbare oder gar dumme Fragen gestellt zuhaben, verbleibe ich mit freundlichen Grüßen und bestem Dank.

Vilius


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2014, 13:01
Beitrag #2
RE: Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Hoi Vilius,

mir ist irgendwie nicht ganz klar, warum es nur mit einem DUE funktionieren sollte, wenn man es ans Mega anpasst. (ich werf da gleich mal nen Blick auf die Schaltpläne)

Auf dem richtigen Weg bist Du ja schon.

Du hast den Code angepasst? Die Libary auch eingebunden?
Leider funktioniert Dein Link nicht, bzw ist dort die Seite nicht mehr vorhanden.
Ich nehm aber an, dass es sich um den auch hier erwähnten Code handelt:
Code for LTC 2400

Dann frag ich mich, warum Du an die I2c ne 5V mit Pullupwiderständen gebastelt hast? So lang sind Deine Strecken ja eigentlich nicht? oder?

Aber das nur am Rande.

Du hast schon versucht es nur am Uno zu testen, scheiterte aber an einem Hardwareadressierungsproblem?
Hast Du das inzwischen gelöst (irgendwie hab ich da die beiden I2C in Verdacht...)??
Zitat:Meine Versuche bereits nur ein ADC-Modul !! U N D !! obige TFT-Anzeige mit dem UNO-PCB zum Laufen zubringen sind wegen des Hardware-Adressierugkonfliktes gescheitert... :-(

Nun ich schmeiss das mal als Erinnerung hier in die Runde und glaube mit der Software von Martin Nawrath, Kunsthochschule fuer Medien Köln bist Du nicht der erste und sicher nicht der letzte, der sich damit befasst.

Sag hier einfach mal Piep und wir sehen weiter.
Vielleicht kannst Du in Zukunft den Code noch für die Forenuser besser lesbar
Code:
mit Hilfe der # oben als Code hier einbinden.... :)

Greetz
Sloompie

Dimidium facti, qui coepit, habet: SAPERE AUDE, incipe!©Horaz

Vor allem sapere aude! oder wie Immanuel Kant sagt:
"Habe Mut, dich deines eigenen Verstandes zu bedienen!"

Es tut auch nicht weh! Daher: incipe! oder Tu es! wie Yoda sagen würde.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.06.2014, 14:00 (Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2014 15:18 von Vilius.)
Beitrag #3
RE: Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Erst einmal ein Dankeschön an G. Sloompie !

Ich habe euch ja mit meinen ersten Beitrag (mit Fragen über Fragen:-( zugetextet.
Nochmals überarbeit ist der Code schon leichter lesbar. In diesem Zusammenhang möchte ab nun kleinere Schritte machen...

Also das LTC2400 Analog/Digitawandler-Modul funktioniert mit dem UNO einwandfrei.
Wenn ich diesen "C"-Code nun für das Mega-PCB kompiliere und tranferiere, beides geschieht ohne Fehlermeldungen, dann erhalte auf dem PC-Monit. aber nur den Ausgabestring "LTC2400 ADC Test". Das war es dann. Nach einem Reset des Boards dauert es ca. 1 Sek. bis zur obigen Stringausgabe. Die mehrstelligen Messwertausgaben wie beim UNO bleiben jedoch aus.
Das sieht so aus, als wenn die Hardware mit dem Mega nicht korrekt angesprochen wird?

So wie im Anhag sehen die getesteten Signal/Verbindungen aus.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.06.2014, 17:51
Beitrag #4
RE: Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Hallo Vilius,

die hast die richtige Frage gleich am Anfang gestellt:
Zitat:Lässt sich der Mega überhaupt über die selben Register wie mit obiger UNO-Software ansprechen?
Antwort: nicht immer Huh Daher wohl die Probleme auf dem Mega.
Schau dir mal hier: http://forum.arduino.cc/index.php/topic,45329.0.html
den Eintrag von Igor R vom 19. Juni 2009 an.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.06.2014, 20:38 (Dieser Beitrag wurde zuletzt bearbeitet: 24.06.2014 21:47 von Vilius.)
Beitrag #5
RE: Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Hallo Ricardo,

danke für die promte Antwort die mich überzeugt hat. Inzwischen habe ich mein Konzept dahingehend überdacht den zweiten ADC ebenfalls über eine "zeitgleich" invertiertes Chip oder SlaveSelect-Signal anzuschliesen. Siehe Schaltung nachstehend.
   
Damit möchte ich erreichen das bei dem Looping im ersten Durchlauf das SS-Signal nur den ersten ADC anspricht und der zweite ADC damit nicht angesprochen wird. Mit Beendigung der ersten Durchgangs Selektieren, MISO-Datenaustausch und Clock-Signal wird, so vermute ich, wird das SS Signal wieder zurück gesetzt und damit qasi das SS invertiert, so das im zweiten Durchlauf die erneute Selektierung entfallen könnte und nach desem Datenaustausch wieder zurück gesetzt werden könnte...
Vielleicht ist es sogar softwaremäßig leichter einen anderen UNO-Pin für das zweite SS-Signal zu programieren.
Habe vor vielen Jahren mal die X86-Assembler-Sprache für Mini-Projekte in der Hardware ähnlich wie diese genutzt, und vieles wieder vergessenSad . Darum suche ich hier Rat oder Vorschläge die mir helfen ein brauchbares Ergebnis zu erzielen.

Gruß Vilius
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.06.2014, 14:44 (Dieser Beitrag wurde zuletzt bearbeitet: 26.06.2014 11:23 von Vilius.)
Beitrag #6
Big Grin RE: Zwei Analog-Digital-Konverter über SPI selektieren u. auswerten
Liebe Nutzer des Arduinoforums...

meine Recherche scheint dem Ziel etwas näher zu sein. Hier versuchte ebenso ein Nutzer einen anderen Pin für das Chip-Selekt Signal (zum Glück auch für ein LTC2400 & UNO) mit Ethernet (MicroSD Card) erfolgreich herzustellen... Wink

Siehe Link http://forum.arduino.cc/index.php?topic=57643.0

Gruß Vilius
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Android Smartphone über Bluetooth steuern StephanBuerger 0 83 25.11.2016 20:01
Letzter Beitrag: StephanBuerger
  Arduino NANO mit zwei 1.8 SPI-tfts Thandor 2 99 15.11.2016 23:18
Letzter Beitrag: Thandor
  Uno gehen zwei digital Pins nicht edlosijagen 15 591 07.07.2016 19:22
Letzter Beitrag: Bitklopfer
  Stromversorgung über Solarladeregler - Arduino funktioniert kurz und hängt sich auf Daniel Zorn 5 507 18.05.2016 13:57
Letzter Beitrag: hotsystems
  tempo Digital Port Binatone 6 479 06.05.2016 17:37
Letzter Beitrag: Bitklopfer
  Atmega über Board Erbsenhirn 22 1.703 09.04.2016 15:45
Letzter Beitrag: Erbsenhirn
  Per Keypad Shield zwischen zwei Programmen schalten Rob-LE 9 925 09.03.2016 14:27
Letzter Beitrag: iks77
  Zwei Ausgabeports am Mega verbinden um 50 mA Verbraucher anzuschließen ? holo 15 862 01.02.2016 13:07
Letzter Beitrag: Bitklopfer
  Zwei Schrittmotoren mit Arduino steuern MarcusW 6 2.379 28.09.2015 21:05
Letzter Beitrag: Bitklopfer
  Sensor an Arduino über IP abfragen/steuern kubinek 5 2.622 03.08.2015 21:14
Letzter Beitrag: Haustechno

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste