SPI te traag bij verzenden data naar LCD met MEGA of DUE

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 2
Geregistreerd: 25 Mrt 2015, 06:42

SPI te traag bij verzenden data naar LCD met MEGA of DUE

Berichtdoor ruudautootje » 25 Mrt 2015, 07:22

Hallo, ik ben een gemiddelde gebruiker/ ontwikkelaar. Ik moet nog een hoop ontdekken maar het meeste lukt tot nu toe. Na het gebruik van I2C ben ik nu met SPI bezig. Ik ben een goede scope gebruiker en ik zie dat als ik een paar Bytes verzend naar de LCD van Arduino (robot LCD) er veel te veel tijd verloren gaat. voor het 1-maal verzenden van de getallen 1000, 100, 100 staat mijn MEGA 20 millisec. stil. Dit is onacceptabel in mijn systeem. Ik meet met de scope dat het overzenden van 1 Byte 4,5 microsec. duurt. Het lijkt wel of de data vele malen achter elkaar wordt verzonden en 1- maal per keer is voldoende,. Wie weet een oplossing.

onderstaande code is geprobeerd op een DUE met de aansluitingen MOSI, clock en MISO aangesloten op de SPI header. Rest via pin 7,8,9,10

Code: Alles selecteren


#define pin2 2  // Up button

#include <TFT.h> // Hardware-specific library
#include <SPI.h>

#define CS   10
#define DC   9
#define RESET  8 
#define sd_cs 7

TFT TFTscreen = TFT(CS, DC, RESET);

int counter1 = 0;  // Counter voor uitschakelen dash-board lampjes bij lopende motor
int counter2 = 0;  // Counter voor uitschakelen dash-board lampjes bij lopende motor
int bit1 = 0;  // Counter voor uitschakelen dash-board lampjes bij lopende motor
int var = 0;  // Counter voor uitschakelen dash-board lampjes bij lopende motor

char sensorPrintout[1];
char sensorPrintout_2[1];
char sensorPrintout_3[1];

char str3[14];
char str4[14];
char str33[14];
char str34[14];
char str35[14];
char str36[14];
char str37[14];
char str38[14];
char str39[14];
char str40[14];
char str41[14];
char str42[14];
char str43[14];
char str44[14];
char str45[14];
char str46[14];
char str47[14];


void setup(){

  pinMode(pin2, OUTPUT);     //Res rood
  pinMode(sd_cs, OUTPUT);
 
  String string3 = "Engine Speed";
  String string4 = "Engine Load";
  String string33 = "Vehicle Speed";
  String string39 = "rpm";    // str3,
  String string42 = "%";          // str4,8,11,
  String string45 = "Km";
  String string46 = "%";
  String string47 = "Act";


  string3.toCharArray(str3, 14);   // 6 is het aantal charachters
  string4.toCharArray(str4, 14);   // 6 is het aantal charachters
  string33.toCharArray(str33, 14);   // 6 is het aantal charachters
  string42.toCharArray(str42, 14);   // 6 is het aantal charachters
  string43.toCharArray(str43, 14);   // 6 is het aantal charachters
  string44.toCharArray(str44, 14);   // 6 is het aantal charachters
  string45.toCharArray(str45, 14);   // 6 is het aantal charachters
  string46.toCharArray(str46, 14);   // 6 is het aantal charachters
  string47.toCharArray(str47, 14);   // 6 is het aantal charachters
 
 
  TFTscreen.begin();


  TFTscreen.background(0, 0, 0);
}

void loop()
{
counter1++;
if(counter1 > 30000)
   {
screen_dashboard();
counter1 = 0;
   }
var = analogRead(A0);
digitalWrite(pin2, HIGH);
digitalWrite(pin2, LOW);


}

void screen_dashboard()  // c31
{

  TFTscreen.stroke(255, 255, 0);
  TFTscreen.setTextSize(2);
 
  TFTscreen.text(str3, 5, 00);            // Engine speed
  TFTscreen.text(str39, 100, 20);         // RPM

  TFTscreen.text(str33, 5, 45);           // Vehicle speed 
  TFTscreen.text(str45, 100, 65);         // Km

  TFTscreen.text(str4, 5, 90);           // Gear(34) belasting(4)
  TFTscreen.text(str47, 100, 110);        // Actueel(47 %(46)


  TFTscreen.stroke(0, 0, 0);
  TFTscreen.text(sensorPrintout, 30, 20);
  TFTscreen.text(sensorPrintout_2, 30, 65);
  TFTscreen.text(sensorPrintout_3, 30, 110);
     
  String sensorVal = String(6000);   
  sensorVal.toCharArray(sensorPrintout, 5);   // 6 is het aantal charachters
 
  String sensorVal_2 = String(var);   
  sensorVal_2.toCharArray(sensorPrintout_2, 4);   // 6 is het aantal charachters

  String sensorVal_3 = String(100);   
  sensorVal_3.toCharArray(sensorPrintout_3, 4);   // 6 is het aantal charachters

  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text(sensorPrintout, 30, 20);

  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text(sensorPrintout_2, 30, 65);
 
  TFTscreen.stroke(255, 255, 255);
  TFTscreen.setTextSize(2);
  TFTscreen.text(sensorPrintout_3, 30, 110);

}



Scope beeld van de data:

Oeps, hoe kan ik een PNG up-loaden
Bijlagen
scope signal.png
scope signal.png (83.68 KiB) 3284 keer bekeken

Advertisement

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: SPI te traag bij verzenden data naar LCD met MEGA of DUE

Berichtdoor shooter » 25 Mrt 2015, 09:36

de data wordt maar een keer verstuurd, want dat heb jij zelf in de hand, maar het duurt inderdaad best lang voordat een hele bitreeks is verzonden.
oplossing is niet wachten tot alle bits verzonden zijn, maar pin hoog zetten, teruggaan naar jouw programma, kijken of tijd gedaan is, en dan bitje weer laag zetten, weer kijken of tijd gedaan is en zo voort.
De afhandeling van een hele byte reeks is inderdaad traag,kijk maar hoeveel regels jij er alleen in hebt zitten.
dus het geheel opbreken in stukjes is een mogelijkheid, of met een interuptpin (of time) even naar je normale ding gaan. (Dan wordt het allemaal wel spannend want de tijden van de seriele comm kloppen dan niet meer(serial monitor), I2C heeft daar geen last van , net zoals trouwens SPI, dus het gaat wel hoor, maar dan moet je de SPI als master zetten (Logisch want LCD is toch slave) en de interupt kun je dan gewoon afhandelen.
paul deelen
shooter@home.nl

Berichten: 2
Geregistreerd: 25 Mrt 2015, 06:42

Re: SPI te traag bij verzenden data naar LCD met MEGA of DUE

Berichtdoor ruudautootje » 26 Mrt 2015, 08:28

Beste Paul,
Ik ben niet zo doorgevoerd hoor. Ik werk wel af en toe met interupts maar ik weet niet helemaal wat je hier bedoel. Maar die master/slave situatie lijkt mij wel een idee. Is de chip select daar voor en heeft het met deze "#define sd_cs 7" instructie te maken? Ik haal eerst alles van internet af dus weet in eerste instantie niet precies waar het voor is...... Ik heb op de pin7 gemeten maar daar gebeurd niets mee. Maar kan ik voor het overzenden van data naar de LCD deze pin7 handmatig hoog en laag maken?
Ruud

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: SPI te traag bij verzenden data naar LCD met MEGA of DUE

Berichtdoor shooter » 26 Mrt 2015, 14:42

CS betekent chipselect, en hier kun je dus vertellen welke chip (als er meerdere met zelfde adres inzitten gebruikt moet worden.
Ik zie dat je heel veel instructies achetr elkaar hebt staan, maar die kosten wel veel tijd want er zitten veel wachttijden in om de timing een beetje te doen.
ofwel jouw processor staat gewoon te wachten tot de tijd van een puls afgelopen is.
SPI en I2C zijn niet tijdgebonden , en dus kun je gewoon op interupt jouw waarde inlezen.
en dan bijv. 1 keer per seconde op scherm zetten.

kijk eerst maar naar blink without delay (daar staat de basis in van timers)
en uiteraard hoe interupts te gebruiken zijn, (dat is een soort deurbel, waardoor de processor zijn kopje koffie even neerzet en naar de deur loopt, als dat gedaan is dan wordt de koffie automatisch weer opgepakt.
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 35 gasten