Keine Ausgabe auf Display!

Serenifly: ... 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

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.

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. ;)

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:

#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);
    }
}

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?

Keine Ahnung.

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

Also nur

for (count=0; count < 8; count++) {
   switch (count) {
      case ... break;
   }
   delay(300);
}

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

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…

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 :wink:

Auch ich sehe gerade keinen Fehler im Code.

Ist sicher, dass die Hardware vollkommen okay ist?

Gruß

Gregor

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

Danke fuer deine Muehe!

@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.

Das seltsame ist wie gesagt, das wenn ich den zaehler "count" in der for-Schleie bei 1 anfangen lasse zu zaehlen, dann funktioniert alles Perfekt bis eben auf die Tatsache, das "case 0" fehlt.

Hiesse ja dann, dass der Fehler mit dem Anfang der for-Schleife mit "case 0" zusammen haengt.

petemanzel: ... wenn ich das Display weg lasse und nur die Ausgabe nur ueber den Serial-Monitor mache, wird alles fehlerfrei ausgegeben.

Dann steckt der Fehler ganz sicher anderswo, ich bin ratlos und gehe eine rauchen.

Gruß

Gregor

Nur ein Schuss ins Blaue:

Du verwendest Pin 6 des 40xx-Dingens (Enable) nirgendwo – oder habe ich was übersehen?

Gruß

Gregor

BTW: Informatikstudenten finden häufig, dass es Seminare zum Thema Flüche geben sollte :-)

@Gregor: Pin 6 (inhibit) ist an GND.

Kurzer Auszug aus dem Datenblatt:

This device is a single 8-channel multiplexer having three binary control inputs, A, B, and C, and an inhibit input. The three binary signals select 1 of 8 channels to be turned on, and connect one of the 8 inputs to the output.

When a logic “1” is present at the inhibit input terminal all channels are off.

Es sei denn, ich hab da was falsch verstanden.

...Flüche und Vodoo.

Ich dachte “Keine Ausgabe auf Display” wäre vom Tisch, mit dem Test-Sketch, und die Display-Hardware ist offensichtlich richtig angeschlossen und wird richtig angesprochen.

Da musst du doch jetzt “nur noch vorsichtig” die for-Schleife und das delay durch was richtiges ersetzen.

petemanzel: (inhibit) ist an GND.

In dem Datenblatt, das ich quergelesen habe, gibt es das Wort „inhibit“ gar nicht. Und ich kenne das 40xx-Dingens auch überhaupt nicht. Aber wenn ich nicht falsch liege, gibt man mit „enable“ an, dass die Wahl des gemultiplexten Dings „beendet“ ist.

petemanzel: Es sei denn, ich hab da was falsch verstanden.

Oder ich.

Gruß

Gregor

PS: Probiere mal folgendes:

  • Pin 6 des Multiplexers über einen Widerstand an + und an einen freien Pin des Arduino, den Du in setup() als Ausgang definierst.
  • Nach der Wahl des Eingangs des Multiplexers (die Zeilen in denen Du bit1-bit3 setzt) setzt Du den Ausgang dann explizit „low“, damit der Multiplexer weiß, dass jetzt eine gültige Wahl getroffen wurde.

michael_x: 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.

Off Topic, aber der 8051/52 ist da interessant. Da gibt es 16 RAM-Zellen die Bit-adressierbar sind. Und die Abfragen darauf dauern nur einen Takt

Sowas ist aber die Ausnahme

@Gregor: Ich habe jetzt PIN6 auf meinem Breadboard vie von Dir beschrieben umgesteckt. Es aendert sich aber nichts am verhalten.

Wenn "case 0" ausgefuehrt werden soll, springt die Anzeige immer zwischen "case 0" und "case 1" hin und her. Alle anderen-> "case 1" bis "case 7" funktionieren ohne Probleme.

petemanzel: Ich habe jetzt PIN6 auf meinem Breadboard vie von Dir beschrieben umgesteckt. Es aendert sich aber nichts am verhalten. Wenn "case 0" ausgefuehrt werden soll, springt die Anzeige immer zwischen "case 0" und "case 1" hin und her. Alle anderen-> "case 1" bis "case 7" funktionieren ohne Probleme.

Weia. Das ist eine wirklich harte Nuss.

Momentan fällt mir nur ein, dass es gut wäre, den aktuellen Stand von Schaltung und Sketch zu sehen.

Gruß

Gregor

PS: Ich schlage mich hier ebenfalls mit einem fehlerhaften Ding herum und werde wohl (als letzte Maßnahme vor der Kapitulation) die Schaltung analysieren und als Schaltplan aufzeichnen. Ich hoffe, dass ich damit herausfinde, wo eine der I²C-Leitungen einen Kurzschluss mit der Versorgungsspannung hat. Allmählich gehen mir die Flüche aus und ich fühle mich von diesem Gebastel persönlich beleidigt.

Ich hatte doch noch einen Einfall: Vor einiger Zeit habe ich eine Schaltung aus > 20 Teilen aufgebaut, die nicht funktionieren wollte. Auf der Suche nach dem Fehler fand ich auch nach mehreren Tagen nichts. Irgendwann habe ich dann die identische Schaltung erneut auf einem anderen Steckbrett aufgebaut. Dann funktionierte sie. Ich kann daher nur vermuten, dass es beim ersten Aufbau ein Kontaktproblem gab. Vielleicht ist das auch bei Deiner Schaltung so. Wackle mal an allen Teilen und Drähten, steck Drähte testweise in andere Löcher der gleichen „Schiene“ und probiere dann noch einmal, ob der Fehler immer noch auftritt.

Allerdings, eine harte Nuss.

Ich sage ja: "VODOO". Da wo der normale Menschenverstand aufhoert.

Ich habe ja auch an der Schaltung gezweifelt. Aber was ja nicht sein kann, ist, dass wenn ich die unveraenderte Schaltung am SerialMonitor ausgebe, alles 1A bestens funktioniert.

Es mueste ja dann auch in im SerialMonitor immer Schaler1 und Schalter0 hin und her springen.