![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
pic_micro
Joined: 07 Feb 2011 Posts: 26
|
Upload custom character to MAX7456 chip |
Posted: Thu Apr 21, 2011 10:14 pm |
|
|
I used the MAX7456 dev kit GUI to create custom character, after I save it into *.MCM file, I open with notepad and there is 16385 lines, here are some of the top lines
MAX7456
1010101
1010101
1010101
1010101
1010101
1010101
1010101
1010101
1010101
1010101
1010101
.
.
.
to 16385 lines total.
How can I upload these to the MAX7456 chip?
I follow John Geek links http://www.john.geek.nz/2011/01/adding-custom-characters-to-the-max7456-video-overlay-generator/
But according to his, there will be only 54 lines to upload (0-53). I not sure what to do. Can anybody help?
Remember, I build my own board (breadboard) according to SparkFun schematic, so there is no way I can access the chip as describe per Maxim kits through Serial or USB. |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9173 Location: Greensville,Ontario
|
|
Posted: Fri Apr 22, 2011 6:07 am |
|
|
John's article clearly details how to create and upload the custom characters.Simple and easy.His code can be converted to CCS C in a few minutes.
So how does your PIC communicate with the MAX7456 if not through SPI ? |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Fri Apr 22, 2011 8:56 am |
|
|
To emphasise the point, look at the chip's data sheet. It's _only_ interface, is SPI. Serial peripheral interface. The demo boards allowing you to access the chip using other interfaces, have a processor like the PIC, receiving data from USB or RS232, and then talking to the chip. Exactly what you can do with a PIC.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Apr 22, 2011 1:32 pm |
|
|
Quote: | How can I upload these to the MAX7456 chip?
|
You gave up on your other MAX7456 thread, here:
http://www.ccsinfo.com/forum/viewtopic.php?t=45241
Did you ever do the test to see if you can read back the same byte that
you wrote to the chip ? You need to do that before you try anything else.
With regard to the John Geek link, he's using "spi_send_byte()" to send
the data to the MAX7456. That's equivalent to the max7456_write()
function, shown in the code below.
To do the communication test with the MAX7456, connect your PIC to the
Max7456 like this:
Code: |
PIC Max7456
SDO SDIN
SDI SDOUT
SCLK SCLK
\CS \CS
|
Use pin C2 on the PIC for \CS.
Then run this program. It should hopefully say that it read "55" from
the MAX7456:
Code: |
#include <16F877A.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
// SPI mode definitions.
#define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H)
#define SPI_MODE_1 (SPI_L_TO_H)
#define SPI_MODE_2 (SPI_H_TO_L)
#define SPI_MODE_3 (SPI_H_TO_L | SPI_XMIT_L_TO_H)
#define MAX7456_CS PIN_C2
//-------------------------------------
// Write to the specified register.
void max7456_write(int8 reg_addr, int8 data)
{
output_low(MAX7456_CS);
spi_write(reg_addr);
spi_write(data);
output_high(MAX7456_CS);
}
//------------------------------------
// Read the specified register.
int8 max7456_read(int8 reg_addr)
{
int8 retval;
output_low(MAX7456_CS);
spi_write(reg_addr | 0x80); // Set top bit to do a Read operation
retval = spi_read(0);
output_high(MAX7456_CS);
return(retval);
}
//======================================
void main()
{
int8 result;
// Initialize the PIC's SPI module.
setup_spi(SPI_MASTER|SPI_MODE_0|SPI_CLK_DIV_4);
output_high(MAX7456_CS);
delay_ms(100); // Minimum power-up delay is 50 ms
max7456_write(0, 0x55); // Write 0x55 to register 0
result = max7456_read(0); // Read register 0
// Display what we read.
printf("Wrote 0x55, read: %X \n\r", result);
while(1);
}
|
|
|
![](templates/subSilver/images/spacer.gif) |
pic_micro
Joined: 07 Feb 2011 Posts: 26
|
MAX7456 GRAPHIC |
Posted: Thu Apr 28, 2011 9:49 am |
|
|
I got it working by using SPI function like you mentioned earlier. I can send characters to MAX7456 and display it OK.
I am trying to display clock ( HH:MM:SS or 12:59:59 on the the screen (number 0-9 only, no character), but I can't figure out how to convert hex to decimal to display on the screen. When I increment the SEC, MIN, HOUR, they are in hex format not decimal, example e.g instead of hex 0x0A, 0x0B .... 0x3F , I want 10, 11, .... 59 to display
I have int SEC, MIN, HOUR; and I also define location to display char xSEC, xMIN, xHOUR.
I use timer1 interrupt and start increase SEC, MIN, HOUR
if SEC >= 59, reset SEC = 0 and increment MIN, if MIN >= 59, reset MIN = 0 and increment HOUR, and etc.
What is the best way to convert HEX to DEC? is there any sample code to handle this?
below are my code:
max.c (main)
Code: | #include <16f877a.h>
#fuses XT, NOWDT, NOPROTECT, NOBROWNOUT, NOPUT, NOLVP
#use delay(clock=4000000)
/************************
connection
PIC | MAX7456
----------------
16 | 11 - C4
15 | 9 - C5
14 | 10 - C3
| 8 - A1
**************************/
#include <driver.c>
#include <interrupts.c>
void main()
{
max7456_init();
max7456_write(0x00, 0x02);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{
}
} |
driver.c
Code: | #define MAX7456_CS PIN_A1
#define MAX7456_CLK PIN_C3
#define MAX7456_DI PIN_C5
#define MAX7456_DO PIN_C4
char x = 0;
void max7456_write(int8 addr, int8 data)
{
output_low(MAX7456_CS);
spi_write(addr);
spi_write(data);
output_high(MAX7456_CS);
delay_ms(1);
}
//============= Disable ========================
void Disable(void) // Disable
{
max7456_write(0x00, 0x00);
}
//============= Enable =======================
void Enable(void)
{
max7456_write(0x00, 0x08); // Enable NTSC
max7456_write(0x04, 0x40);
}
//============= Enable =======================
void max7456_init(void)
{
short int i;
output_low(MAX7456_DI);
output_low(MAX7456_CLK);
output_high(MAX7456_CS);
i=input(MAX7456_DO);
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
}
void lines(void)
{
enable();
// =========LINE1 ============
x = 1;
max7456_write(0x06, x);
max7456_write(0x07, 0x01);
delay_ms(10);
// =========LINE2 ============
x = 31;
max7456_write(0x06, x);
max7456_write(0x07, 0x02);
delay_ms(10);
// =========LINE3 ============
x = 61;
max7456_write(0x06, x);
max7456_write(0x07, 0x03);
delay_ms(10);
// =========LINE4 ============
x = 91;
max7456_write(0x06, x);
max7456_write(0x07, 0x04);
delay_ms(10);
// =========LINE5 ============
x = 121;
max7456_write(0x06, x);
max7456_write(0x07, 0x05);
delay_ms(10);
// =========LINE6 ============
x = 151;
max7456_write(0x06, x);
max7456_write(0x07, 0x06);
delay_ms(10);
} |
interrupts.c
Code: | int counter = 0;
int MIN = 0;
int SEC = 0;
int HOUR = 0;
char xHour = 40;
char xMIN = 45;
char xSEC = 50;
void display(void)
{
max7456_write(0x06, xHOUR);
max7456_write(0x07, HOUR);
delay_ms(1);
max7456_write(0x06, xMIN);
max7456_write(0x07, MIN);
delay_ms(1);
max7456_write(0x06, xSEC);
max7456_write(0x07, SEC);
delay_ms(1);
}
}
#INT_TIMER1
timer1_isr()
{
clear_interrupt(INT_TIMER1);
counter++;
enable();
if(counter >=10)
{
SEC++;
if(SEC >= 0x3B) // decimal 59
{
SEC = 0;
MIN++;
if(MIN >= 0x3B) // decimal 59
{
HOUR++;
if(HOUR >= 0x0C) // decimal 12
{
HOUR = 0;
}
}
}
display();
}
}
#INT_EXT
void ext_ISR(void)
{
// clear screen
// clear_interrupt(INT_EXT);
max7456_write(0x00, 0x02);
delay_ms(20);
} |
If anyone can help me out, I would be appreciate |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Apr 28, 2011 11:08 am |
|
|
Clock numbers are displayed in BCD format. You need a routine to
convert your byte integers to BCD. Here it is:
Code: |
//----------------------------------------------
// This function converts an 8 bit binary value
// to an 8 bit BCD value.
// The input range must be from 0 to 99.
int8 bin2bcd(int8 value)
{
char retval;
retval = 0;
while(1)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(value >= 10)
{
value -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += value;
break;
}
}
return(retval);
} |
|
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|