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
Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
14.04.2015, 21:32
Beitrag #1
Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Hi@all,

bin ziemlich neu hier und habe ein Anliegen bei dem ich einfach nicht weiter komme.

Erstmal zur Geschichte:

ich habe mir einen Arduino Uno mit 2,4' Touchscreen Display gekauft (http://www.banggood.com/UNO-R3-ATmega328...755.html).

Realisieren möchte ich damit einen rücksetzbaren Kilometerzähler fürs Auto (Orientierungfahrten).

Daher wird die Touchfunktion und der SD-Steckplatz nicht benötigt.

Als eingespeistes Signal habe ich das Tachosignal: 9 Peaks pro Radumdrehung (Hall-Geber am Differential). Dabei habe ich bei 100km/h eine maximale Frequenz von 138Hz (mit Radumfang von 1,81m). Schneller wird normalerweise nicht gefahren...

Nun zum Problem:

Als Eingang kann ich PIN 10-13 (normalerweise SD-Karten-Pins) verwenden. Leider funktioniert auf diesen PIN's keine ISR. Das führt im Programmablauf dazu, das durch die langsame Aktualisierungsrate des Displays ziemlich viele Zählsignale verloren gehen.

Um das Zählsignal zu priorisieren, müsste ich als Eingang PIN 2 oder 3 benutzen. Leider sind die aber mit PIN D2 und D3 des Displays belegt.

Jetzt zur Frage:

Gibt es eine Möglichkeit die PIN's des Displays zu ändern - Also D2 auf PIN 10 zu ändern? Somit wäre PIN 2 frei und für einen interrupt benutzbar.

Librarys benutze ich: Adafruit_GFX_AS8 und Adafruit_ILI9341_AS8

Hoffe ich konnte mein Problem hinreichend Beschreiben - wenn nicht, einfach Fragen!

Schonmal vielen Dank im voraus fürs Kopf zerbrechen ;-)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.04.2015, 21:35
Beitrag #2
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Hi,
such mal nach "Pin change interrupt". Vielleicht hilft das.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.04.2015, 07:29 (Dieser Beitrag wurde zuletzt bearbeitet: 16.04.2015 07:31 von theShadow.)
Beitrag #3
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Hallo Thorsten,

danke für die Hilfe! Habe mir die letzten Tage diverse Google-Ergebnisse zum Thema "Pin change interrupt" angesehen aber komme mit den CodeBeispielen nicht klar...
Ich muss gestehen, dass ich den bisherigen Code mit einem Kommilitonen geschrieben habe, der das eigentliche Programmier-Brain ist - sich aber jetzt unvorhersehbarerweise (Undecided) in die Lernphase verabschiedet hat und auf unbestimmte Zeit ausfällt.
Stehe nun mit dem bisherigen Code, bei dem alles bis auf die Zählgechwindigkeit stimmt, da und kriege es nicht gebacken diesen Interrupt zu implementieren - laufen soll das Ding spätestens am 25.04...
Gibt es irgendwo eine PinChangeInterrupt Anleitung für Noobs oder kann mir evtl. jemand mit ein paar Codezeilen helfen? Wäre echt Mega-Dankbar!!

Hier als Motivation unser/mein bisheriger Aufbau:

Bei Bedarf kann ich auch gerne den Code posten!


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.04.2015, 09:08
Beitrag #4
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Hi,
tja, dumm halt, wenn man was studiert, was man nicht draufhat.
Such halt mal nach "arduino pinchangeint" oder "pinchangeint library". Da gibt's Beispiele und Erklärungen. Versuch halt erstmal das ganze nicht zu integrieren, sondern experimentiere nur mit dem PinChangeInt-Kram.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.04.2015, 11:34 (Dieser Beitrag wurde zuletzt bearbeitet: 16.04.2015 11:46 von Bitklopfer.)
Beitrag #5
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
(16.04.2015 07:29)theShadow schrieb:  Hallo Thorsten,

danke für die Hilfe! Habe mir die letzten Tage diverse Google-Ergebnisse zum Thema "Pin change interrupt" angesehen aber komme mit den CodeBeispielen nicht klar...
Ich muss gestehen, dass ich den bisherigen Code mit einem Kommilitonen geschrieben habe, der das eigentliche Programmier-Brain ist - sich aber jetzt unvorhersehbarerweise (Undecided) in die Lernphase verabschiedet hat und auf unbestimmte Zeit ausfällt.
Stehe nun mit dem bisherigen Code, bei dem alles bis auf die Zählgechwindigkeit stimmt, da und kriege es nicht gebacken diesen Interrupt zu implementieren - laufen soll das Ding spätestens am 25.04...
Gibt es irgendwo eine PinChangeInterrupt Anleitung für Noobs oder kann mir evtl. jemand mit ein paar Codezeilen helfen? Wäre echt Mega-Dankbar!!

Hier als Motivation unser/mein bisheriger Aufbau:

Bei Bedarf kann ich auch gerne den Code posten!

Hi,
also um einen Interrupt Eingang frei zu bekommen mußt du den Display Pin verlegen. Beim LCD Keypad geht das wenn man an der Hardware löten kann Big Grin
Aber die Treibersoftware muß bei der Initialisierung angepasst werden. Von daher wäre es für die Mitleser wichtig hier deinen Code studieren zu können um zu sehen wie die Initialisierung deines Displays aussieht. Bis dahin.
Bei einem LCD Keypad habe ich das schon mal gemacht um die Pins für den CS für die SD Card und den Ethernet Port freizukriegen.
lg
bk

...ähm in der Beschreibung steht hier:
8 bit digital interface, plus 4 control lines
Uses digital pins 5-13 and analog 0-3. That means you can use digital pins 2, 3 and analog 4 and 5. Pin 12 is available if not using the micro SD
Demzufolge sind die Interrupteingänge frei verfügbar. Zieh an deinem Aufbau doch einfach mal die Brücken von Port 2 und 3 raus...Tongue
lg
bk

..und wenn dann das Display noch tut reden wir über Interrupts...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2015, 00:11 (Dieser Beitrag wurde zuletzt bearbeitet: 17.04.2015 00:19 von theShadow.)
Beitrag #6
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
@ Thorsten: deinen ersten Satz ignoriere ich einfach mal...

@ Bitklopfer:

Das mit dem Display-Pin-umlegen war unsere erste Idee, jedoch haben wir in den Libraries (oder wo auch immer) die PINzuordnung nicht gefunden. Löten ist kein Problem (Oszi und Funktionsgenerator auf dem Bild waren Bausätze ;-) )

Die SD-Karten PINs haben wir schon freigelegt um die Eingänge für Resettaster und, ursprünglich gedacht, auch für das Eingangssignal frei zu haben (PINs 10-13).

Wenn man PIN 2 entfernt wird das Display weiß.
Bei PIN 3 funktioniert die aktualisierung des Displays nicht mehr - eingefroren.

Wenn ich jedoch PIN 0 oder 1 entferne, funktioniert das Display ohne Probleme. Allerdings liegt an beiden PINs ein High-Signal und wenn ich sie mit einem Low-Signal überschreibe funktioniert das zählen nicht mehr richtig. Wenn man die PIN's bei der Initialisierung rausprogrammiert könnte es funktionieren - jedoch wären wir dann wieder bei dem Problem wo man das macht^^

Hier unser Code:

Code:
#define DEBUG
#include <Adafruit_GFX_AS8.h>    // Core graphics library
#include <Adafruit_ILI9341_AS8.h> // Hardware-specific library

// The control pins for the LCD can be assigned to any digital or
// analog pins...but we'll use the analog pins as this allows us to
// double up the pins with the touch screen (see the TFT paint example).
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// When using the BREAKOUT BOARD only, use these 8 data lines to the LCD:
// For the Arduino Uno, Duemilanove, Diecimila, etc.:
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).

// Assign human-readable names to some common 16-bit color values:
#define ILI9341_BLACK   0xFFFF
#define ILI9341_BLUE    0xFFE0
#define ILI9341_RED     0x07FF
#define ILI9341_GREEN   0xF81F
#define ILI9341_CYAN    0xF800
#define ILI9341_MAGENTA 0x07E0
#define ILI9341_YELLOW  0x001F
#define ILI9341_WHITE   0x0000

Adafruit_ILI9341_AS8 tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

  bool signal = true;
  bool color = false;
  int pin = 10;
  char Ausgabe[4] = {'0','0','0','0'};
  int Zahl = 0;

unsigned long targetTime = 0;
byte red = 31;
byte green = 0;
byte blue = 0;
byte state = 0;
unsigned int colour = red << 11;

void setup(void)
{  
  tft.reset();
  delay(10);
  tft.begin(0x9341);
  tft.setRotation(1);
  
  pinMode(pin,INPUT);
  digitalWrite(pin,LOW);
  //attachInterrupt(pin,sig,RISING);
    
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_RED, ILI9341_BLACK);
  tft.setTextSize(2);
  tft.drawLine(0,120,320,120,ILI9341_RED);
}

void loop()
{
  
  if(digitalRead(pin)==HIGH)  
  {
    Zahl++;
    signal = true;
    digitalWrite(pin,LOW);      //Pin muss wieder auf LOW gesetzt werden, da er sonst HIGH bleibt
  }
    
  if(signal)
  {
    signal = false;
    int puffer = Zahl;
    
    for(int i=3;i>=0;i--)
     {
      Ausgabe[i]=(puffer%10)+48;
      puffer /= 10;
      //delay(500);
     }
      
    //tft.fillScreen(ILI9341_BLACK);
    tft.drawString(Ausgabe,50,20,6); //(string, poX, poY, font) fonts available: 2,4,6,7    
  }
}

void sig()
{
  Zahl++;
  signal = true;
}

LG Markus Smile
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.04.2015, 07:21
Beitrag #7
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Moin,
also wenn der Displayhertseller sich schon nicht an die Artikelbeschreibung hält dann hast da ein Problem an der Backe...Undecided
Da hilft dann nur noch der Umstieg auf einen Mega. Dann haste wirder genug freie Ports frei zur Verfügung.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.04.2015, 11:28
Beitrag #8
RE: Arduino Uno + 2,4' TFT = Zählerperformanceproblem (ISR)
Thema kann geclosed werden!

Danke nochmal für Eure Hilfe und drückt mir nächste Woche die Daumen ;-)


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino Ethernet mit USB 2 Serial Converter/Welche Einstellungen im Arduino-Sketch lociluke 1 1.118 05.05.2015 13:40
Letzter Beitrag: Bitklopfer
  Arduino Mega-Projekt mit EEPROM auf Arduino Due portieren Foto-Ralf 17 3.144 16.03.2015 12:06
Letzter Beitrag: Foto-Ralf

Gehe zu:


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