Go Down

Topic: SPI mit UTFT usw Problem (Read 2475 times) previous topic - next topic

Ratlos

Hallo,
der SPI macht doch oft probleme

Habe ein TFT    Typ  ITDB18SP   angeschlossen.
Weiter ei nShild von Ocean Controls

Jetzt wir dSPI vom Display nicht mehr benutzt.
( Daher wieder Langsam )

Kann da jemand Helfen ???

Danke
Gruss
Ratlos

Der Code

Code: [Select]
/*
  Ocean Controls k-type board KTA259 TC Mux  Neil Davey
*/

#include <SPI.h>
#include <UTFT.h>

extern uint8_t BigFont[]; 

#define CS_TEMP  8 //   MAX6674/6675 /CS Line
#define MUX_EN   7 // ADG608 MUX Enable
#define MUX_A0   4 // ADG608 Addr0
#define MUX_A1   5 // ADG608 Arrd1
#define MUX_A2   6 // ADG608 Addr2

//-------------------------

byte Temp = 0 ;
String Geber = "";

int sda = 11;  //MOSI   TFT
int scl = 13;  //SCLK   TFT
int cs = 10;   //SS TFT
int rst = 3;   // Ori 8 TFT
int rs = 9;   //TFT

UTFT myGLCD(ITDB18SP,sda,scl,cs,rst,rs);   // Remember to change the model parameter to suit your display module!

void Set_Mux_Channel(unsigned char chan)
{
  switch(chan)
  {
    //----------------------
    // MUX Channel 1
    case 1:
      digitalWrite(MUX_A0,LOW);
      digitalWrite(MUX_A1,LOW);
      digitalWrite(MUX_A2,LOW);
      break;
    //----------------------
    // MUX Channel 2
    case 2:
      digitalWrite(MUX_A0,HIGH);
      digitalWrite(MUX_A1,LOW);
      digitalWrite(MUX_A2,LOW);
      break;
    //----------------------
    // MUX Channel 3
    case 3:
      digitalWrite(MUX_A0,LOW);
      digitalWrite(MUX_A1,HIGH);
      digitalWrite(MUX_A2,LOW);
      break;
    //----------------------
    // MUX Channel 4
    case 4:
      digitalWrite(MUX_A0,HIGH);
      digitalWrite(MUX_A1,HIGH);
      digitalWrite(MUX_A2,LOW);
      break;
    //----------------------
    // MUX Channel 5
    case 5:
      digitalWrite(MUX_A0,LOW);
      digitalWrite(MUX_A1,LOW);
      digitalWrite(MUX_A2,HIGH);
      break;
    //----------------------
    // MUX Channel 6
    case 6:
      digitalWrite(MUX_A0,HIGH);
      digitalWrite(MUX_A1,LOW);
      digitalWrite(MUX_A2,HIGH);
      break;
    //----------------------
    // MUX Channel 7
    case 7:
      digitalWrite(MUX_A0,LOW);
      digitalWrite(MUX_A1,HIGH);
      digitalWrite(MUX_A2,HIGH);
      break;
    //----------------------
    // MUX Channel 8
    case 8:
      digitalWrite(MUX_A0,HIGH);
      digitalWrite(MUX_A1,HIGH);
      digitalWrite(MUX_A2,HIGH);
      break;
    //----------------------
    default:
      break;
  }
}

//-------------------------
int Read_Temperature(void)
{
unsigned int temp_reading;
  // force conversion now..
  delay(1); // Ori 5
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
  delay(1); // Ori 5
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High
  delay(200); // Ori 250  wait for conversion to finish..
 
  // read result
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
  //delay(1);  // Ori 1
  temp_reading = SPI.transfer(0xff) << 8; 
  temp_reading += SPI.transfer(0xff); 
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High
  //delay(1);
 
  // check result
  if(bitRead(temp_reading,2) == 1) // No Connection
    {     
      return(-1); // Failed / NC Error
    }
    else
    {
      return((int)(temp_reading >> 5)); //Convert to Degc
    }
}

//-------------------------
void setup()
{
    SPI.begin();          // ist neu zum Starten der SPI Dadurch zeigt das Dysplay schneller an
    pinMode(10, OUTPUT);    randomSeed(analogRead(0));
    // Setup the LCD
    myGLCD.InitLCD();
    myGLCD.clrScr();
    myGLCD.setColor(28, 187, 255);
    myGLCD.setFont(BigFont);
    myGLCD.setBackColor(0,0,0);
    myGLCD.fillScr(0,0,0);

  Serial.begin(9600);
  pinMode(10,OUTPUT); // Hardware /SS, need to be output
  pinMode(CS_TEMP,OUTPUT); // MAX6675/6674 /CS Line
  pinMode(MUX_EN,OUTPUT); // Enable pin on ADG608
  pinMode(MUX_A0,OUTPUT); // A0 on ADG608
  pinMode(MUX_A1,OUTPUT); // A1 on ADG608
  pinMode(MUX_A2,OUTPUT); // A2 on ADG608

  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High
  digitalWrite(MUX_EN,HIGH); // Enable on
}

//-------------------------
void loop()
{
 
int temperature = 0;
Temp = 0 ;
while(Temp < 8 )
  {
      Temp = Temp ++ ;
    // delay(1);
    Set_Mux_Channel(Temp);
    temperature = Read_Temperature();
    if(temperature == -1)
      {
          Geber = String(Temp);
      //  Serial.println("N/C  Sensor " + Geber);
      myGLCD.print("N/C Se", Temp * 19 -14,125,270);   //
          //    myGLCD.print("N/C Se" + Geber + " ", Temp * 19 -14,125,270);   //
      }
      else
      {
//                Serial.println('Temp');
     //  Serial.print(temperature,DEC);
        Geber = String(Temp);
     //  Serial.println(" C Sensor " + Geber);
            myGLCD.print(String(temperature,DEC), Temp * 19 -14,125,270);   //
      // myGLCD.print(String(temperature,DEC)+ " C Se" + Geber + " ", Temp * 19 -14,125,270);   //
//        Serial.println(Geber);

      }
  }
}




pylon

Quote
der SPI macht doch oft probleme


Bei mir nicht. Wenn die Software stimmt und der Bus richtig verkabelt ist, funktioniert der SPI eigentlich wunderbar.

Quote
Kann da jemand Helfen ???


Kannst Du uns beim Helfen etwas unterstützen, z.B. indem Du Links zu den von Dir verwendeten Komponenten bzw. Bibliotheken postest? Falls es nicht ein Shield ist (das nur richtig rum eingesteckt werden kann), solltest Du auch ein Foto machen, damit wir wissen, wie die Komponente verkabelt ist.

Ratlos

Hallo
Softwarecode ist die ja oben angegeben.
SPI.h  ist bei dem Arduino dabei gewessen
UTFT.h ist von     http://electronics.henningkarlsen.com/


Die Temperaturmessung    ist ein Shield    http://oceancontrols.com.au/KTA-259.html

Das Display ist ein      Serial 1.8" TFT LCD Screen Module ITDB02-1.8SP ITeadStudio IM120419001 
http://www.lipoly.de/index.php?main_page=product_info&cPath=880_1298_1793&products_id=214875


Das Display habe ich auch an anderer Stelle verbaut, da geht alles Super
Denke im Code   Zeile ~109 bis 110   ist ein problem

    " temp_reading = SPI.transfer(0xff) << 8;     "
    " temp_reading += SPI.transfer(0xff);          "

Danke
Grüße
Ratlos

pylon

Wieso denkst Du, dass an den zwei Zeilen etwas faul sein soll? Dort werden zwei Byte vom SPI eingelesen und zu einem vorzeichenlosen Integer zusammengefasst.

Wo liegt eigentlich Dein Problem? Ist da was zu langsam? Wenn ja, was und welche Werte hast Du gemessen?
Oder kommen gewisse Werte nicht an? Was ist mit dSPI gemeint? Eine weitere Bibliothek, die Du nicht verlinkt hast?

Ratlos

Hallo,
es gibt keine weitere Bibliothek

Mein problem ist das Display es ist einfach sehr langsam im aufbau wenn ich diesen bereich drin lasse.
Code: [Select]
unsigned int temp_reading;
   //force conversion now..
  delay(5); // Ori 5
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
delay(5); // Ori 5
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High

  delay(220); // Ori 250  wait for conversion to finish..
  // read result
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
  delay(1);  // Ori 1

"Als wenn ich das Display ohne SPI betriebe"


lösche ich den bereich geht es schnell  =(  aber der Wert stimmt an de Stelle nicht mehr.

Schöner mist da Ihr es nicht nachbauen könnt ohne das Shild und das Display

Grüße
Ratlos

Ratlos

UPS
Meinte wenn ich den Bereich lösche
  delay(5); // Ori 5
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
delay(5); // Ori 5
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High

  delay(220); // Ori 250  wait for conversion to finish..
  // read result

pylon

Deine Hardware besteht aus einem AD-Wandler, der direkt Thermocouple-Sensoren in Temperaturen umwandeln kann und einem Multiplexer, der jeweils einen von acht Eingängen auf den AD-Wandler schaltet. Nun, dieser AD-Wandler braucht ca. 1/5 Sekunde, bis er den Eingang richtig gelesen hat. Da Du alle 8 Eingänge der Reihe nach auf den Wandler schaltest und den entsprechenden Wert einliest, dauert ein Durchgang beinahe 2 Sekunden. Diese Verzögerung, bis Du zu den Werten kommst, ist prinzipbedingt und kann nicht einfach eliminiert werden. Was allerdings möglich ist: der Arduino kann in der Zeit, die er jetzt mit Warten auf die fertige AD-Wandlung zubringt, etwas anderes tun. In Deinem Sketch hat er aber keine anderen Aufgaben.

Da es sich um Temperatur-Werte handelt, sollte allerdings die zeitliche Verzögerung nicht so stark in's Gewicht fallen, die Temperatur wird sich kaum so schnell verändern.

Ratlos

Hallo Pylon,
das Lesen ist OK

Aber der Aufbau auf dem Display....
da kann ich zusehen ( Pixel für Pixel / fast )

Ein Lesedurchgang dauert 6 Sec. das ist schon das mindeste was ich möchte.
Aber die Ausgabe auf den TFT  =(
Jede Zeile kann ich beim aufbau betrachten, das ist nicht so schoen


Müste es nicht bei der Anzeige schneller gehen ?


Habe andere Anwendungen mit dem TFT da geht der Aufbau ratz fatz

Grüße
ratlos


pylon

Ändere mal die paar Zeilen in der Funktion "Read_Temperature":

Code: [Select]
  // read result
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
  //delay(1);  // Ori 1
  SPI.begin();  // setup SPI hardware
  temp_reading = SPI.transfer(0xff) << 8; 
  temp_reading += SPI.transfer(0xff);
  SPI.end();  // release SPI hardware for bit banging interface
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High
  //delay(1);


Die TFT-Bibliothek verwendet nicht das SPI-Interface sondern emuliert es. Da Du das Display an den Hardware-SPI-Pins angeschlossen hast, entsteht ein Konflikt. Indem Du den SPI nach Gebrauch wieder deaktivierst, steht er dem Bit-Banging der UTFT-Bibliothek wieder zur Verfügung.

Ratlos

Hallo
danke für die super Hilfe.
Es ist so das das Display dann aus bleibt.
Wenn ich später "nach   SPI.end();  // release SPI hardware for bit banging interface " wieder
   SPI.begin();  setze geht es auch, abe rtrotzdem langsam  :smiley-zipper:

Grüße
Ratlos

pylon

Ich habe die UTFT Version 2.01 vom 5. Februar 2013 heruntergeladen, dort aber keinen Support für den Hardware-SPI gefunden. Wieso hast Du trotzdem diesen Kommentar im Code?

Code: [Select]
    SPI.begin();          // ist neu zum Starten der SPI Dadurch zeigt das Dysplay schneller an


Versuche doch mal, nach dem SPI.end() noch folgenden Code einzufügen:

Code: [Select]
pinMode(sda, OUTPUT);
pinMode(scl, OUTPUT);


Damit sollte der Zustand dieser Pins wieder fast so sein, wie nach dem Konstruktor der TFT-Klasse.

Ratlos

Hallo
ohne das Starten des SPI.begin()  geht das Display zwar auch, aber wie schon gesagt Langsam
Deshalb ist es bei mir mit dabei.
( Original UTFT hat es nicht )

Wenn ich den SPI.end setze ohne SPI.begin wieder anzuschalten, bleibt das Display dunkel.

int Read_Temperature(void)
{
unsigned int temp_reading;
   //force conversion now..
  delay(5); // Ori 5
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
delay(5); // Ori 5
   SPI.begin();  // setup SPI hardware
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High

  delay(220); // Ori 250  wait for conversion to finish..
  // read result
  digitalWrite(CS_TEMP,LOW); // Set MAX7765 /CS Low
  delay(1);  // Ori 1

           temp_reading = SPI.transfer(0xff) << 8; 
           temp_reading += SPI.transfer(0xff); 
            SPI.end();  // release SPI hardware for bit banging interface
            pinMode(sda, OUTPUT);
            pinMode(scl, OUTPUT);
            SPI.begin();  // setup SPI hardware
  digitalWrite(CS_TEMP,HIGH); // Set MAX7765 /CS High
  //delay(1);
 
  // check result
  if(bitRead(temp_reading,2) == 1) // No Connection
    {     
      return(-1); // Failed / NC Error
    }
    else
    {
      return((int)(temp_reading >> 5)); //Convert to Degc
    }
    //*/
}


habe es ohne SPI.begin() versucht, aber das Display bleibt dann dunkel.

Es war durch
pinMode(sda, OUTPUT);
pinMode(scl, OUTPUT);
keine Veränderung sichtbar

Hmmm eine harte Nuss   :smiley-zipper:

Grüße
Ratlos

pylon

Was hältst Du davon, die UTFT-Bibliothek auf Hardware-SPI aufzurüsten, anstatt mühsam die Hardware wieder für das Bit-Banging frei zu machen? Es wäre eine relativ begrenzte Modifikation der Hardware-Abstraktionsschicht und des Initialisierungscodes.

Ratlos

Hallo,
klar würde ic hdas machen.
Aber so hoch ist mein wissenstand nicht.
Habe jetzt ca. 8 Wochen mit Schaltung AVR usw zu tun.

Aber wagen würde ich das.
Wiste nicht das es eine Hardware-SPI gibt
Mit hilfe von hier kann das was werden.

Grüße
Ratlos

pylon

Welchen Arduino verwendest Du? UNO? Mega2560?

Go Up