CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Upload custom character to MAX7456 chip

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Apr 22, 2011 1:32 pm     Reply with quote

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

View user's profile Send private message

MAX7456 GRAPHIC
PostPosted: Thu Apr 28, 2011 9:49 am     Reply with quote

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

View user's profile Send private message

PostPosted: Thu Apr 28, 2011 11:08 am     Reply with quote

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);
}
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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