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?
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
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.
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: โป๊กเกอร์ บาคาร่า เสือมังกร คาสิโน มารับความร่ำรวยกัน เกมไพ่ poker 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?
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.
// 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?
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.
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.
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.