|
|
View previous topic :: View next topic |
Author |
Message |
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);
}
|
|
|
|
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 |
|
|
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);
} |
|
|
|
|
|
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
|