MAX7456 Breakout Board On Screen Display Libary Fehlermeldung

Halllo,

ich versuche gerade mit dieser Platine:

http://www.amazon.de/gp/product/B006IHM4C6/ref=oh_details_o00_s00_i00?ie=UTF8&psc=1

und einem Arduino Uno einen Text in ein Videobild einzublenden. Dazu möchte ich diese Libary verwenden:

http://dlnmh9ip6v2uc.cloudfront.net/datasheets/Widgets/MAX7456_Arduino_Library.zip

Wenn ich das HelloWorld Beispiel überprüfe kommt aber immer die Fehlermeldung ""MAX7456" does not name a type". Hat jemand schon mal Erfahrungen mit dieser Libary gemacht und kann mir sagen was das bedeutet und wie ich den Code verändern muss damit er läuft?

0) Hast Du die Bibliothek im richtigen Ort und unter dem richtigen Unterordner abgespeichert und den IDE geschlossen und wieder geöffnet? 1) bitte Sketch 2) bitte alle Fehlermeldungen Grüße Uwe

Danke für den Tipp, ich hatte die Libary einfach nur im falschen Ordner.

Das kompilieren funktioniert jetzt also aber wenn ich das Programm laufen lasse passiert auf meinem Bildschirm nichts. Es wird also nur das übliche Videobild ohne einen eingeblendeten Schriftzug angezeigt.

So habe ich den Arduino mit dem OSD verbunden:

Arduino Pin 13 mit Breakout Board SCK
Arduino Pin 12 mit Breakout Board DOUT
Arduino Pin 11 mit Breakout Board DIN
Arduino Pin 10 mit Breakout Board CS
Arduino 5V mit Breakout Board +5V und RST
und Arduino GND mit Breakout Board GND

Das ist der Quellcode:

/*
  HelloWorld.ino
    
    Demonstrates most simple use of the MAX7456 Library.


    This example code is in the public domain.
    Requires Arduino 1.0 or later.


    History :
      1.0 ~ Creation of HelloWorld from MAX7456Demo 0.4
            2013.01.301 - F. Robert Honeyman <www.coldcoredesign.com>
      
*/



// Included Libraries //////////////////////////////////////////////////////////

  #include <SPI.h>
  #include <MAX7456.h>





// Pin Mapping /////////////////////////////////////////////////////////////////
  
  // pinValue = 0 means "not connected"

  //  FDTI Basic 5V                   ---  Arduino  VCC      (AVCC,VCC)
  //  FDTI Basic GND                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic CTS                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic DTR                  ---  Arduino  GRN
  //  FDTI Basic TXO                  ---> Arduino  TXO [PD0](RXD)
  //  FDTI Basic RXI                 <---  Arduino  RXI [PD1](TXD)
  
  
  //  Max7456 +5V   [DVDD,AVDD,PVDD]  ---  Arduino  VCC      (AVCC,VCC)
  //  Max7456 GND   [DGND,AGND,PGND]  ---  Arduino  GND      (AGND,GND)
  //  Max7456 CS    [~CS]            <---  Arduino  10  [PB2](SS/OC1B)
  //  Max7456 CS    [~CS]            <---  Mega2560 43  [PL6]
  const byte osdChipSelect             =            43;
  //  Max7456 DIN   [SDIN]           <---  Arduino  11  [PB3](MOSI/OC2)
  //  Max7456 DIN   [SDIN]           <---  Mega2560 51  [PB2](MOSI)
  const byte masterOutSlaveIn          =                      MOSI;
  //  Max7456 DOUT  [SDOUT]           ---> Arduino  12  [PB4](MISO)
  //  Max7456 DOUT  [SDOUT]           ---> Mega2560 50  [PB3](MISO)
  const byte masterInSlaveOut          =                      MISO;
  //  Max7456 SCK   [SCLK]           <---  Arduino  13  [PB5](SCK)
  //  Max7456 SCK   [SCLK]           <---  Mega2560 52  [PB1](SCK)
  const byte slaveClock                =                      SCK;
  //  Max7456 RST   [~RESET]          ---  Arduino  RST      (RESET)
  const byte osdReset                  =            0;
  //  Max7456 VSYNC [~VSYNC]          -X-
  //  Max7456 HSYNC [~HSYNC]          -X-
  //  Max7456 LOS   [LOS]             -X-





// Global Macros ///////////////////////////////////////////////////////////////





// Global Constants ////////////////////////////////////////////////////////////

  const unsigned long debugBaud = 9600;         // Initial serial baud rate for 
                                                //   Debug PC interface
  




// Global Variables ////////////////////////////////////////////////////////////
  
  HardwareSerial Debug = Serial;                // Set debug connection
  
  MAX7456 OSD( osdChipSelect );





// Hardware Setup //////////////////////////////////////////////////////////////

  void setup() 
  {
    
    // Initialize the Serial connection to the debug computer:
    Debug.begin( debugBaud );
    
    
    // Initialize the SPI connection:
    SPI.begin();
    SPI.setClockDivider( SPI_CLOCK_DIV2 );      // Must be less than 10MHz.
    
    // Initialize the MAX7456 OSD:
    OSD.begin();                                // Use NTSC with default area.
    //OSD.setCharEncoding( MAX7456_ASCII );       // Only needed if ascii font.
    OSD.display();                              // Activate the text display.
    
  }
  // setup()





// Main Code ///////////////////////////////////////////////////////////////////

  void loop() 
  {
    
    while (OSD.notInVSync());                   // Wait for VSync to start to 
                                                //   prevent write artifacts.
    OSD.print( "Hello World!" );                // The '!' will not display
                                                //   because it does not come 
                                                //   in the factory font.
    while (true);
    
  } 
  // loop()





// Interrupt Methods ///////////////////////////////////////////////////////////





// Local Methods ///////////////////////////////////////////////////////////////

Strom scheint das OSD zu haben, denn wenn ich die Verbindung zwischen Arduino 5V und Breakout Board +5V trenne hab ich auf meinem Bildschirm gar kein Signal mehr.

Die Beschreibung der Verbindung im Sketch verbinder Reset mit Reset und nicht mit +5V. Schreib einige Serial.print in ddie schleifen damit Du weißt, wo der Sketch stecken bleibt. Grüße Uwe

Der Sketch läuft bis while (true); da bleibt er dann stecken. Soweit ich das beurteilen kann soll er das auch. Sonst würde er ja ständig den selben Text auf den Bildschirm schreiben. (Oder nicht?)

Ich hab jetzt Reset mit Reset verbunden. Wenn ich das Programm jetzt uploade bzw. resette bekomme ich ein schwarzes Bild auf meinen Monitor. Wenn ich dann aber den Video ausgang des Boards aus- und wieder einstecke wird mir das ganz normale Bild angezeigt also so, wie es ohne das Board ankommen würde.

Ja, while (true); soll den Sketch blockieren. Das ist richtig. Also läuft der Sektch richtig durch. Hast Du kontrolliert, ob die Verkabelung richtig und ohne Wackelkontakte ist? wie lang sind die Verbindungskabel? Grüße Uwe

Hallo,

füge doch mal direkt nach dem OSD.begin(); ein OSD.setDefaultSystem(MAX7456_PAL); ein und schau ob es dann funktioniert. So wie ich das sehe (kann mich irren - kann es halt nicht probieren) wird als Video-System NTSC ausgewählt. Dein Video kommt aber wahrscheinlich als PAL.

Gruß, Ralf

Die Kabel zwischen Arduino und OSD sind ungefähr 10 cm lang. Die Verkabelung hab ich mehrmals auseinander und wieder zusammen gesteckt und mit einem Ohmmeter die Verbindungen getestet. Immer mit dem Selben Ergebnis. Außerdem hab ich mit LED`s getestet ob vielleicht einer der Arduino Pins tot ist. Das mit dem schwarzen Bild auf dem Monitor, das weg geht wenn ich den Video OUT Stecker ziehe hab ich jetzt aber nicht mehr. Das Lag an einem kaputten Kabel vom OSD zum Bildschirm. Jetzt hab ich entweder überhaupt kein Signal oder das ganz normale Videobild.

Das mit dem OSD.setDefaultSystem(MAX7456_PAL); war denke ich eine gute Idee. Jetzt bekomme ich manchmal regelmäßig angeordnete weiße Punkte über das Vidobild gelegt (komisch, hier: http://theboredengineers.com/2012/12/a-max7456-library-for-arduino/ steht die Libary wäre mit einem Pal System verwendet worden). Aber keine Spur von Buchstaben.

Epijano: Das mit dem OSD.setDefaultSystem(MAX7456_PAL); war denke ich eine gute Idee. Jetzt bekomme ich manchmal regelmäßig angeordnete weiße Punkte über das Vidobild gelegt

Da ist sicherlich irgendwas, irgendwo falsch eingestellt (per Software). Aber leider sind mir die guten Ideen jetzt auch schon ausgegangen, weil ich mir das einfach nicht ansehen kann. Kannst Du vielleicht ein Bild von den Linien machen?

Gruß, Ralf

Klar.

2013-09-22 16.07.52.jpg

Hmm, ich dachte, man sieht vielleicht etwas, das wie ein Zeichengenerator-Fehler aussieht. Scheint aber nicht so zu sein. Tut mir leid. Ich bin erst mal raus. Sollte mir doch noch was einfallen, melde ich mich hier wieder.

Gruß, Ralf

Also wenn ich diesen Beispielcode uploade:

/*
  TerminalDemo.ino
    
    Demonstrates full capabilities of the MAX7456 Library.


    This example code is in the public domain.
    Requires Arduino 1.0 or later.


    History :
      1.0 ~ Creation of TerminalDemo from MAX7456Demo 0.4
            2013.01.31 - F. Robert Honeyman <www.coldcoredesign.com>
      
*/



// Included Libraries //////////////////////////////////////////////////////////

  #include <util/crc16.h>
  #include <SPI.h>
  #include <MAX7456.h>





// Pin Mapping /////////////////////////////////////////////////////////////////
  
  // pinValue = 0 means "not connected"

  //  FDTI Basic 5V                   ---  Arduino  VCC      (AVCC,VCC)
  //  FDTI Basic GND                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic CTS                  ---  Arduino  GND      (AGND,GND)
  //  FDTI Basic DTR                  ---  Arduino  GRN
  //  FDTI Basic TXO                  ---> Arduino  TXO [PD0](RXD)
  //  FDTI Basic RXI                 <---  Arduino  RXI [PD1](TXD)
  
  
  //  Max7456 +5V   [DVDD,AVDD,PVDD]  ---  Arduino  VCC      (AVCC,VCC)
  //  Max7456 GND   [DGND,AGND,PGND]  ---  Arduino  GND      (AGND,GND)
  //  Max7456 CS    [~CS]            <---  Arduino  10  [PB2](SS/OC1B)
  //  Max7456 CS    [~CS]            <---  Mega2560 43  [PL6]
  const byte osdChipSelect             =            43;
  //  Max7456 DIN   [SDIN]           <---  Arduino  11  [PB3](MOSI/OC2)
  //  Max7456 DIN   [SDIN]           <---  Mega2560 51  [PB2](MOSI)
  const byte masterOutSlaveIn          =                      MOSI;
  //  Max7456 DOUT  [SDOUT]           ---> Arduino  12  [PB4](MISO)
  //  Max7456 DOUT  [SDOUT]           ---> Mega2560 50  [PB3](MISO)
  const byte masterInSlaveOut          =                      MISO;
  //  Max7456 SCK   [SCLK]           <---  Arduino  13  [PB5](SCK)
  //  Max7456 SCK   [SCLK]           <---  Mega2560 52  [PB1](SCK)
  const byte slaveClock                =                      SCK;
  //  Max7456 RST   [~RESET]          ---  Arduino  RST      (RESET)
  const byte osdReset                  =            0;
  //  Max7456 VSYNC [~VSYNC]          -X-
  //  Max7456 HSYNC [~HSYNC]          -X-
  //  Max7456 LOS   [LOS]             -X-





// Global Macros ///////////////////////////////////////////////////////////////
  
  //#define DEBUG true





// Global Constants ////////////////////////////////////////////////////////////

  const unsigned long debugBaud = 9600;         // Initial serial baud rate for 
                                                //   Debug PC interface
  const unsigned long dataSourceBaud = 9600;    // Initial serial baud rate for 
                                                //   Input used by OSD
  




// Global Variables ////////////////////////////////////////////////////////////
  
  HardwareSerial Debug      = Serial;           // Set debug connection
  HardwareSerial DataSource = Serial;           // Set display source connection
  
  MAX7456 OSD( osdChipSelect );
  
  char * message = "Awaiting serial data.";
// Hardware Setup //////////////////////////////////////////////////////////////

  void setup() 
  {
    
    // Initialize the Serial connection to the debug computer:
    Debug.flush();
    while (Debug.available()) Debug.read();
    Debug.begin( debugBaud );
    
    // Initialize the Serial connection to the OSD data source:
    DataSource.begin( dataSourceBaud );
    
    
    // Initialize the SPI connection:
    SPI.begin();
    SPI.setClockDivider( SPI_CLOCK_DIV2 );      // Must be less than 10MHz.
    
    // Initialize the MAX7456 OSD:
    OSD.begin( NULL, NULL, NULL, &SPI );        // Use NTSC with no area.
    OSD.setDefaultSystem(1);
    OSD.setSwitchingTime( 5 );                  // Set video croma distortion 
                                                //   to a minimum.
    OSD.setBlinkingTime( 3 );                   // Set blinking lapse time:
                                                //   [ 0-3 ] * 2 fields
    OSD.setBlinkingDuty( 3 );                   // Set blinking duty cycle:
                                                //   0: 50%,   1: 33%,
                                                //   2: 25%,   3: 75%
    OSD.setDefaultSystem( MAX7456_PAL );        // Output PAL video system until 
                                                //   a video source is provided.
    OSD.display();                              // Activate the text display.
    
    // Automatically get font decoding:
    byte          image[54];
    unsigned long fontCRC = 0;
    while (!OSD.readChar( 0x11, image ));       // Wait for read.
    for(char i = 0;
        i < 54; 
        i++        )
    {
      fontCRC =                                 // Do a checksum.
          _crc_xmodem_update( fontCRC,
                              image[i] );
    }
    if (fontCRC != 0x71CA &&
        fontCRC != 0xA8DD)
    {
      OSD.setCharEncoding(MAX7456_ASCII);
    }
    else
    {
      OSD.setCharEncoding(MAX7456_MAXIM);
    }
    
  }
  // setup()





// Main Code ///////////////////////////////////////////////////////////////////

  void loop() 
  {
    
    // Display screen saver until imput is recieved:
    byte          system     = NULL;
    float         angle      = 0.0;
    float         col        = 0.0;
    float         row        = 0.0;
    float         brightness = 0.0;
    byte          textmode   = 0;
    
    OSD.setTextOffset( MAX7456_HOS_MAX, 0 );    // Set initial offset.
    writeScreenSaver();                         // Write screen.
    
    while (!DataSource.available())
    {
      
      // Proper way of handling changes in video:
      checkLink();                              // Check connection at least
                                                //   one time each loop.
      if (OSD.videoIsBad())                     // If bad video caused reset,
      {
        while(OSD.resetIsBusy()) checkLink();   // wait for it to complete,
        system = ~NULL;                         // trigger refresh.
      }
      if (system != OSD.videoSystem())          // If user changes video input,
      {
        system = OSD.videoSystem();             // get new system,
        OSD.setDefaultSystem( system );         // update default system,
        writeScreenSaver();                     // rewrite screen,
        OSD.display();                          // activate the text display.
      }
      
      while (OSD.notInVSync()) checkLink();     // Wait for VSync to start to 
                                                //   prevent write artifacts.
      
      
      // Calculate and draw screensaver:
      angle += atan( 1.0 / MAX7456_HOS_MAX );   // At least 1 pixel/frame
      if (angle > 2 * PI)                       // Upon full rotation,
      {
        angle -= 2 * PI;                        // Reset angle
        textmode++;                             // Change write attributes
        if (textmode >= 8) textmode = 0;
      }

      col = MAX7456_HOS_MAX * cos( angle );     // Use the max h(x) offset and 
      row = MAX7456_VOS_MIN * sin( angle );     // the min v(y) offest to pick
                                                //   the radii of the oval.
      brightness = cos( 8 * angle ) * 2 + 2;
      
      OSD.setTextOffset( col, row );            // Abuse this function to 
                                                //   simulate motion.
      OSD.setWhiteLevel( brightness );          
      OSD.setBlackLevel( brightness );          
      
      OSD.setTextAttributes( textmode );        
      OSD.home();                               
      OSD.print( message );                     // Text must be rewritten to 
                                                // show with new attributes.
    }
    
    OSD.setWhiteLevel( 1 );                     // Restore normal parameters.
    OSD.setBlackLevel( 0 );                     
    OSD.home();                                 
    OSD.videoBackground();                      
    OSD.noBlink();                              
    OSD.normalColor();                          
    
    
    
    // Copy incoming serial data to screen:
    unsigned long timeout  = millis() + 600000; // Screensaver in 10 minutes.
    boolean       lastIsCR = false;             // Prevents ignore of repeated 
                                                //   carriage returns.
    
    OSD.setTextArea( NULL, NULL,                // Resize display for TV safe.
                     MAX7456_ACTIONSAFE );
    
    if (OSD.videoSystem() == MAX7456_NTSC)      // Adjust centering in TV.
    {
      OSD.setTextOffset( -4, 3 );
    }
    else
    {
      OSD.setTextOffset( 1, 1 );
    }
    
    OSD.lineWrap();                             // Set terminal behaviour.
    OSD.pageWrap();
    
    while (OSD.clearIsBusy());                  // Resize clears display, so
                                                //   wait for it to finish.    
    
    while (true) 
    {
      if (millis() > timeout) break;
      
      while (OSD.notInVSync()) checkLink();     // Wait for VSync to start to 
                                                //   prevent write artifacts.
      while (!OSD.notInVSync()) checkLink();    // Skip odd fields to remove
                                                //   mice teeth artifacts.
      while (OSD.notInVSync()) checkLink();     // Wait for next VSync.
      
      while (DataSource.available())
      {
        if (DataSource.peek() == '\n')          // Ignore newlines.
        {
          DataSource.read();
        }
        else if (DataSource.peek() == '\r')     // Upon carriage return,
        {
          DataSource.read();
          DataSource.write( '\n' );
          if (lastIsCR) OSD.write( ' ' );       // bump the cursor, and
          while (OSD.cursorColumn() != 0)       // until the next line,
          {
            OSD.write( ' ' );                   // write empty space.
          }
          lastIsCR = true;
        }
        else                                    // For all other characters,
        {
          OSD.write( DataSource.read() );       // just write them.
          lastIsCR = false;
        }
      }
      
      OSD.blink();
      OSD.cursor();
      OSD.noBlink();
    }
    
    OSD.home();
    
  } 
  // loop()





// Interrupt Methods ///////////////////////////////////////////////////////////





// Local Methods ///////////////////////////////////////////////////////////////
  
  void writeScreenSaver()
  {
    OSD.setTextArea( strlen(message), 1 );      // Set display size.
    while (OSD.clearIsBusy()) checkLink();      // Wait for clear to finish 
                                                //   (resize clears display).
    while (OSD.notInVSync()) checkLink();       // Wait for VSync to start to 
                                                //   prevent write artifacts.
    OSD.print( message );                       // Write screen.
  }
  
  
  // Handles connection problems with OSD.
  unsigned long errTime;
  void checkLink()
  {
    errTime = millis() + 110;                   // Soft reset safety.
    while (!OSD.status())                       // If connection fails, wait 
    {                                           //   for it to be corrected.
      if (millis() > errTime)                   //   This is a failsafe that 
      {                                         //   originated from the need 
        Debug.println( "Connection failure" );  //   to identify unreliable 
        errTime = millis() + 500;               //   solder connections.
      }
    }
  }

kommt dieses Videobild hinten raus. Irgendwelche komischen Zeichen die sich bewegen (auf dem Bild nicht ganz so gut zu erkennen).
Meinst du das mit Zeichengenerator-Fehler?

2013-09-22 17.20.46.jpg

Ja, sowas hatte ich gemeint. Bleib doch bitte mal bei dem ursprünglichen Beispiel und setz da hinter dem OSD.setDefaultSystem(MAX7456_PAL); ein OSD.setCharEncoding(MAX7456_ASCII); ein. Und dann gibst Du mal z.B. nur viele A und dann viele B aus. Ob man da ein System erkennen kann.

Gruß, Ralf

Mit ausgeben meinst du in die OSD.print-Klammer schreiben oder? Was für ein System sollte man da erkennen können?

Ich glaub er hat irgendein Problem mit der Funktion OSD.print(); . Einen Cursor kann ich setzen und wenn ich das in den Setup Teil schreib;

  void setup() 
  {
    
    // Initialize the Serial connection to the debug computer:
    Debug.begin( debugBaud );
    
    
    // Initialize the SPI connection:
    SPI.begin();
    SPI.setClockDivider( SPI_CLOCK_DIV2 );      // Must be less than 10MHz.
    
    // Initialize the MAX7456 OSD:
    OSD.begin();                                // Use NTSC with default area.
    //OSD.setCharEncoding( MAX7456_ASCII );       // Only needed if ascii font.
    OSD.setDefaultSystem(1);
    OSD.setCharEncoding(MAX7456_ASCII);


    while(true)
    {
    OSD.display();                              // Activate the text display.
    OSD.cursor();
    delay(1000);
    OSD.noCursor();
    delay(1000);
    OSD.cursor();
    delay(1000);
    OSD.noCursor();
    delay(1000);
    while (OSD.notInVSync());                   // Wait for VSync to start to 
                                                //   prevent write artifacts.
    OSD.print( "hello world" ); 
    }
  }

blinkt der Cursor zwei mal (so wie er soll) und dann habe ich entweder kein Signal mehr (Sagt mein Monitor) oder das normale Eingangssignal.

Ja, ich meine auf den Bildschirm schreiben. Das System: Viele A's sollten zumindest auf jeder Ausgabestelle am Bildschirm ein gleiches Muster ergeben. Viele B's sollten dann ein anderes Muster haben, aber auch wieder auf jeder Stelle gleich.

Mein Tipp wäre dann: Wenn die Muster gleich sind, klappt die Datenübertragung, aber es werden falsche Daten übertragen. Wenn die Muster nicht gleich sind, stimmt wahrscheinlich schon mit der Datenübertragung etwas nicht.

Gruß, Ralf

// Initialize the MAX7456 OSD:
    OSD.begin();                                // Use NTSC with default area.

Hast Du einen NTSC fähigen amerikanischen Fernsehr?
Ist die Europäische Norm nicht PAL?

Grüße Uwe

Mein Monitor kann PAL und NTFC und schaltet laut Verpackung auch automatisch um. Was für eine Norm das Eingangssignal hat weis ich aber gar nicht. Ich gehe aber schon von PAL aus.

Wenn ich stadt Hello World! viele A's und viele B's auf den Bildschirm schreib passiert beim ursprünglichen Beispiel genau das selbe (die Punkte) bei dem sieht man aber auch überhaupt nichts von Schrift sondern halt nur die Punkte. Wenn der Scetch bei OSD.print angekommen ist passiert entweder gar nichts oder ich hab plötzlich überhaupt kein Signal mehr.

Du mußt die Norm benutzten mit der das Ausgangssignal daherkommt. Du kannst nicht auf ein PAL Signal ein NTFC Signal aufmischen. Grüße Uwe