Go Down

Topic: Keine Ausgabe auf Display! (Read 3629 times) previous topic - next topic

petemanzel

Ich habe jetzt endlich was auf dem Display!

Es wird richtig ausgelesen aber die zahlen im display springen immer zwischen dem richtigen ausgelesenen wert "case x" und "case 1" hin und her.

Ich vermute, dass ich irgend einen Fehler nach der for schleife habe, und zwar in der if-Abfrage wo der neue zustand mit dem alte zustand verglichen wird.

Kann mir bitte jemand helfen!

Danke!

Code: [Select]

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#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

// Assign human-readable names to some common 16-bit color values:
#define  BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

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

byte state = 0;               
int lastState = 0;
int count = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void) {
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE); 
  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED); 
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void) {
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop() {
 
  for (count = 0 ; count <8; count++ ) {

  bit1 = bitRead(count, 0);
  bit2 = bitRead(count, 1);
  bit3 = bitRead(count, 2);

  digitalWrite(10, bit1);
  digitalWrite(11, bit2);
  digitalWrite(12, bit3);

const int sensorState = digitalRead(13);

        Serial.print("Pin: ");
        Serial.print(count);
        Serial.print(" Value: ");
        Serial.print(sensorState);
        Serial.print(" ");
       
      Serial.println("-----");


    if(sensorState == 0) state = count;

      if(lastState != state) {
      lastState = state;

        switch (state)
      {
      case 0:
        drawChar('0');
       break;
     
      case 1:   
        drawChar('1');
      break;
     
      case 2:   
        drawChar('2');
      break; 
     
      case 3:   
        drawChar('3');
      break;
     
      case 4:   
        drawChar('4');
      break;
     
      case 5: 
        drawChar('5');
      break;
     
      case 6:   
        drawChar('6');
      break;
     
      case 7: 
       drawChar('7');
      break;
     
      default:
      problem();
      }
    }
   }
}
Der Pete

gregorss

Ich habe jetzt endlich was auf dem Display!
Das sind ja mal erfreuliche Neuigkeiten :-)

Kann mir bitte jemand helfen!
Gerne, nur nicht sofort - aber ich werde mich bald damit beschäftigen.

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

michael_x

Ich schätze, loop läuft so schnell durch, dass du auf dem display gar nicht alles siehst.

Die Geschwindigkeit hängt an den Serial Testausgaben, die das ganze (bei 9600) auf ca. 1000 Zeichen/sec
begrenzen. Bei ca. 30 Zeichen je for-Schleife also 30 Anzeigen /sec, das sollte schöne Flacker-Effekte ergeben.  

Mach mal in die for - Schleife ein  delay(300);   und das Ganze sieht sicher anders aus.

gregorss

Mach mal in die for - Schleife ein delay(300);   und das Ganze sieht sicher anders aus.
Eieiei ... eine Blockade! Von Dir!

SCNR

@Pete: Kompliment, Dein Code ist echt schön lesbar! Beim Debugging ist das Gold wert. Ich habe das trotzdem noch ein bisschen „enhanced" (s. unten). Mich irritierte zuerst, dass Du „sensorState" als const deklariert hast. IMO ist das da überflüssig, hat aber mit dem Fehlverhalten nichts zu tun. Dafür ist Michaels Hinweis gut. Probiere das mal und berichte.

Gruß

Gregor

PS: Der Code
Code: [Select]

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#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

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

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

byte state = 0;               
int lastState = 0;
int count = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void)
{
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED);
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void)
{
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  for (count = 0 ; count <8; count++ )
    {
      bit1 = bitRead(count, 0);
      bit2 = bitRead(count, 1);
      bit3 = bitRead(count, 2);
 
      digitalWrite(10, bit1);
      digitalWrite(11, bit2);
      digitalWrite(12, bit3);

      bool sensorState = digitalRead(13); // Bool benoetigt nur 1 Bit
                                          // int aber 4 Byte (32 mal so viel)
                                          // Ist meistens aber wurscht.
      Serial.print("Pin: ");
      Serial.print(count);
      Serial.print(" Value: ");
      Serial.print(sensorState);
      Serial.print(" ");
      Serial.println("-----");

      if(sensorState == false)
{ state = count; }

      if(lastState != state)
{
  lastState = state;

  switch (state)
    {
    case 0:  drawChar('0'); break;
    case 1:  drawChar('1'); break;
    case 2:  drawChar('2'); break;
    case 3:  drawChar('3'); break;
    case 4:  drawChar('4'); break;
    case 5:  drawChar('5'); break;
    case 6:  drawChar('6'); break;
    case 7:  drawChar('7'); break;
    default: problem();
    }
}
    }
}



Nicht lange fackeln, lass' Backen wackeln! (Seeed)

Serenifly

#19
Feb 26, 2016, 06:26 pm Last Edit: Feb 26, 2016, 06:27 pm by Serenifly
Das switch/case kann man auch rausschmeißen:

Code: [Select]

if (state >= 0 && state <= 7)
  drawchar(state + '0');
else
  problem();



Das ist falsch:
Quote
bool sensorState = digitalRead(13); // Bool benoetigt nur 1 Bit
Bool kann nur 0 oder 1 annehmen, aber belegt 1 Byte

gregorss

#20
Feb 26, 2016, 07:52 pm Last Edit: Feb 26, 2016, 07:53 pm by gregorss
... Bool kann nur 0 oder 1 annehmen, aber belegt 1 Byte
Uh. Ja. Ich denke bei solchen Sachen meistens an STL-Container, die so programmiert sind, dass 1 Bit tatsächlich nur 1 Bit belegt.

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

michael_x

Quote
Ich denke bei solchen Sachen meistens an STL-Container, die so programmiert sind, dass 1 Bit tatsächlich nur 1 Bit belegt.
Tatsächlich ? Na, egal, erstmal, sowohl hier wie sonstwo.
1 Byte ist halt das kleinste, was eine eigene Adresse hat und daher meist selbst auf so einem kleinen Controller das sinnvollste für eine Variable.

Aber, ist hier vollkommen egal.

Quote
Eieiei ... eine Blockade! Von Dir!

SCNR
:P

Ist ja nur zum Test, und ist nichts interaktives im Sketch drin.

Natürlich hat schon solch eine for-Schleife nichts in loop zu suchen, "eigentlich" und bei einem "richtigen" Programm.
Aber das Zeitverhalten zu steuern durch Vollballern der Serial-Testausgaben ist definitiv schlimmer.
;)

petemanzel

#22
Feb 27, 2016, 08:20 am Last Edit: Feb 27, 2016, 10:49 am by petemanzel
Vielen Dank, fuer eure Tips.

@Michael: Ich habe jetzt erst einmal die ganze "Serial-Testausgabe" rausgeschmissen.
Hab ja jetzt was auf meinem Display.

Mit dem "delay (300)" in der for-Schleife springt die Ausgabe jetzt eben langsam zwischen dem richtigen ausgelesenen wert "state x" und "state 1" hin und her.

@Serenifly: switch/case lasse ich so, da im Moment die entsprechenden Zahlen ausgegeben werden, aber spaeter sollen u.U. Buschstaben oder Zahlen oder, oder, oder stehen.

@Gregor: Vielen Dank fuer das Kompliment. Bin noch am Anfang und versuche mir alles so sauber wie moeglich zu halten sonst verstehe ich nicht mehr was da in meinem Programm passiert.

Ich poste hier mal den Stand der dinge:

Code: [Select]

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library

#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

// Assign human-readable names to some common 16-bit color values:
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

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

byte state = 0;               
int lastState = 0;
int count = 0;

int bit1 = 0;
int bit2 = 0;
int bit3 = 0;

void problem(void)
{
  tft.fillScreen(RED);
  tft.setCursor(38, 150);
  tft.setTextColor(WHITE);
  tft.setTextSize(4);
  tft.println("KEIN");
  tft.setCursor(38, 200);
  tft.println("SIGNAL");
}

void drawChar(char c)
{
  tft.fillScreen(WHITE);
  tft.setCursor(20, 20);
  tft.setTextColor(RED);
  tft.setTextSize(40);
  tft.print(c);
}

void setup(void)
{
  tft.reset();
  tft.begin(0x9341);
  tft.setRotation(0);
  tft.fillScreen(RED);
   
  pinMode(13, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(12, OUTPUT);
}

void loop()
{
  for (count = 0 ; count <8; count++ )
    {
      bit1 = bitRead(count, 0);
      bit2 = bitRead(count, 1);
      bit3 = bitRead(count, 2);
 
      digitalWrite(10, bit1);
      digitalWrite(11, bit2);
      digitalWrite(12, bit3);

      bool sensorState = digitalRead(13); // Bool benoetigt nur 1 Bit
                                          // int aber 4 Byte (32 mal so viel)
                                          // Ist meistens aber wurscht.

      if(sensorState == false)
  { state = count; }

      if(lastState != state)
  {
    lastState = state;

    switch (state)
      {
      case 0:  drawChar('0'); break;
      case 1:  drawChar('1'); break;
      case 2:  drawChar('2'); break;
      case 3:  drawChar('3'); break;
      case 4:  drawChar('4'); break;
      case 5:  drawChar('5'); break;
      case 6:  drawChar('6'); break;
      case 7:  drawChar('7'); break;
      default: problem();
      }
  }
  delay (300);
    }
}


Der Pete

petemanzel

Ich habe jetzt folgendes versucht:

Wenn ich in der for-Schleife bei 1 anfangen lasse zu zaehlen, dann funktioniert alles super es springt nichts mehr zwischen ausgelesenem und "1" hin und her, nur fehlt mir dann natuerlich "case 0".

Was kann das sein?
Der Pete

michael_x

Keine Ahnung.

Lass mal zum Test den sensorstate = digitalRead(13); und das if(sensorstate...) raus.

Also nur

Code: [Select]
for (count=0; count < 8; count++) {
   switch (count) {
      case ... break;
   }
   delay(300);
}

petemanzel

Zaehlt schoen von 0 bis 7 und macht dann die Pause "delay (300)"
und dann wieder von vorne.
Der Pete

michael_x

Quote
Zaehlt schoen von 0 bis 7 und macht dann die Pause "delay (300)"
Dann hast du entweder die Klammern anders gesetzt, oder ich verstehe dich falsch, oder was ganz anderes stimmt (mit drawChar() ? ) nicht.

Mein Beispiel sollte eigentlich nach jeder Anzeige, innerhalb der for-Schleife, jedesmal ein delay machen und nach '7' mit der gleichen Geschwindigkeit bei '0' weitermachen...
Code: [Select]
void loop() {

for (byte count=0; count < 8; count++) {
   switch (count) {
      case 0:
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:  drawChar('0'+count); break;
      default: problem(); break;
   } // end switch
   delay(300); // damit man jede Ausgabe schön sieht
} // end for
} // end loop


Die Anzeige der 3 bits von count per led kriegst du alleine dazu, nehm ich mal an ;)

gregorss

Auch ich sehe gerade keinen Fehler im Code.

Ist sicher, dass die Hardware vollkommen okay ist?

Gruß

Gregor
Nicht lange fackeln, lass' Backen wackeln! (Seeed)

petemanzel

@michael_x: Jetzt funktioniert so wie von Dir beschrieben. "... nach '7' mit der gleichen Geschwindigkeit bei '0' weitermachen..."

Danke fuer deine Muehe!
Der Pete

petemanzel

@Gregor: Davon gehe ich aus. Denn wenn ich das Display weg lasse und nur die Ausgabe nur ueber den Serial-Monitor mache, wird alles fehlerfrei ausgegeben.
Der Pete

Go Up