Bild men ingen text med MAX7456 (typ löst!)
Postat: 30 oktober 2013, 00:57:35
Hej!
Jag har försökt få igång en MAX7456 ett par kvällar nu utan att lyckats hela vägen. Problemet jag har är att när jag inte har (video)kameran ansluten till den visas texten. När jag kopplar in kameran får jag upp bilden från kameran men ingen text. Jag skulle gärna vilja kunna kombinera dessa så att jag får text och bild samtidigt
Jag tror jag gått igenom varenda inställning i databladet och har googlat flera olika kodexempel på nätet bland annat den nedan men lyckas helt enkelt inte få texten att visas samtidigt som bilden. Jag har även provat att byta kameran men det var ingen skillnad.
Jag hoppas att någon här känner igen felet och kan tipsa mig vad det kan vara. Har jag trots mina försök missat en inställning eller kan jag ha pajat kretsen?
Edit: MAX7456 sitter på ett breakoutkort från Sparkfun...
Jag har försökt få igång en MAX7456 ett par kvällar nu utan att lyckats hela vägen. Problemet jag har är att när jag inte har (video)kameran ansluten till den visas texten. När jag kopplar in kameran får jag upp bilden från kameran men ingen text. Jag skulle gärna vilja kunna kombinera dessa så att jag får text och bild samtidigt

Jag tror jag gått igenom varenda inställning i databladet och har googlat flera olika kodexempel på nätet bland annat den nedan men lyckas helt enkelt inte få texten att visas samtidigt som bilden. Jag har även provat att byta kameran men det var ingen skillnad.
Kod: Markera allt
#include <avr/io.h>
#include <avr/interrupt.h>
#define RESET PC3 //PB0
#define CS PC2 //PB2
#define MOSI PB5 //PB3
#define MISO PB6 //PB4
#define SCK PB7 //PB5
//Define functions
//======================
void ioinit(void); //Initializes IO
void delay_ms(uint16_t x); //General purpose delay
void delay_us(int x);
void SPI1_write(char address, char byte);
char SPI1_read(char address);
//======================
int main2 (void)
{
char x;
ioinit(); //Setup IO pins and defaults
_delay_ms(1000);
//reset
PORTC &= ~(1<<RESET);
_delay_ms(1000);
PORTC |= (1<<RESET);
_delay_ms(1000);
SPI_write(0,0x48); //enable display of OSD image + PAL
_delay_ms(1);
//automatic black level control, have to read, augment and rewrite
//The data sheet is rather specific about this
x = SPI1_read(0xEC);
_delay_ms(1);
x &= 0xEF;
SPI1_write(0x6C,x);
_delay_ms(1);
SPI1_write(0x04,0);//DMM set to 0
x = 25;
SPI1_write(0x05,0x01);//DMAH
SPI1_write(0x06,x);//DMAL
SPI1_write(0x07,0x1D);
SPI1_write(0x06,x+1);//DMAL
SPI1_write(0x07,0x0B);
SPI1_write(0x06,x+2);//DMAL
SPI1_write(0x07,0x17);
SPI1_write(0x06,x+3);//DMAL
SPI1_write(0x07,0x1A);
SPI1_write(0x06,x+4);//DMAL
SPI1_write(0x07,0x16);
SPI1_write(0x06,x+6);//DMAL
SPI1_write(0x07,0x0F);
while(1)
{
SPI1_write(0,0x08); //enable display of OSD image
_delay_ms(1000);
SPI1_write(0,0); //disable display of OSD image
_delay_ms(1000);
}
}
void ioinit (void)
{
PORTB = 0xFF;
PORTC = 0xFF;
DDRB = (1<<MOSI) | (1<<SCK);
DDRC = (1<<CS) | (1<<RESET);
}
void SPI1_write(char address, char byte)
{
unsigned char SPICount; // Counter used to clock out the data
unsigned char SPIData; // Define a data structure for the SPI data
PORTC |= (1<<CS); // Make sure we start with active-low CS high
PORTB &= ~(1<<SCK); // and CK low
SPIData = address; // Preload the data to be sent with Address
PORTC &= ~(1<<CS); // Set active-low CS low to start the SPI cycle
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address byte
{
if (SPIData & 0x80) PORTB |= (1<<MOSI); // Check for a 1 and set the MOSI line appropriately
else PORTB &= ~(1<<MOSI);
PORTB |= (1<<SCK); // Toggle the clock line
PORTB &= ~(1<<SCK);
SPIData <<= 1; // Rotate to get the next bit
} // and loop back to send the next bit
// Repeat for the Data byte
SPIData = byte; // Preload the data to be sent with Data
for (SPICount = 0; SPICount < 8; SPICount++)
{
if (SPIData & 0x80) PORTB |= (1<<MOSI);
else PORTB &= ~(1<<MOSI);
PORTB |= (1<<SCK);
PORTB &= ~(1<<SCK);
SPIData <<= 1;
}
PORTC |= (1<<CS);
PORTB &= ~(1<<MOSI);
}
char SPI1_read(char address)
{
unsigned char SPICount; // Counter used to clock out the data
char SPIData;
char temp;
PORTC |= (1<<CS); // Make sure we start with active-low CS high
PORTB &= ~(1<<SCK); // and CK low
SPIData = address; // Preload the data to be sent with Address
PORTC &= ~(1<<CS); // Set active-low CS low to start the SPI cycle
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock out the Address byte
{
if (SPIData & 0x80) PORTB |= (1<<MOSI); // Check for a 1 and set the MOSI line appropriately
else PORTB &= ~(1<<MOSI);
PORTB |= (1<<SCK); // Toggle the clock line
PORTB &= ~(1<<SCK);
SPIData <<= 1; // Rotate to get the next bit
} // and loop back to send the next bit
PORTB &= ~(1<<MOSI); // Reset the MOSI data line
SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++) // Prepare to clock in the data to be read
{
SPIData <<=1; // Rotate the data
PORTB |= (1<<SCK); // Raise the clock to clock the data out of the MAX7456
temp = PINB;
if (temp & (1<<MISO)) SPIData |= 1; // Read the data bit
PORTB &= ~(1<<SCK); // Drop the clock ready for the next bit
} // and loop back
PORTC |= (1<<CS); // Raise CS
return SPIData; // Finally return the read data
}
Edit: MAX7456 sitter på ett breakoutkort från Sparkfun...