AVR SPI ->VFD

Pal Lukacs ekegep at yahoo.com
Fri Jul 13 15:34:32 CEST 2007


Sziasztok !
 
 Mega8-al szeretnek egy Samsung VFD kijelzot SPI -n meghajtani.
 Megirtam hozza -a kijelzot vezerlo IC adatlapja szerint- a drivert, 
 (AVR a Master) de sehogy nem makar mukodni.
 Valaki foglalkozott mar ilyesmivel? (SPI->soros kijelzo)
 VFD/IC adatlapja : 
 
 http://www.hobbielektronika.hu/katalogus/alkatresz_739.html
 
 Forraskod:
 
 /* gtk, 2007. július  */
 
 
 #include <inttypes.h>
 #include <util/delay.h>
 #include <avr/wdt.h>
 #include <avr/pgmspace.h>
 #include <avr/interrupt.h>
 #include <util/delay.h>
 
 
 #define BUFFER_POINTER_CTRL     0xA0    //specifies the RAM address
 #define DIGIT_COUNTER_CTRL     0xC0    //sets the number of display digits
 #define DUTY_CYCLE_CTRL     0xE0    //sets the duty value
 #define TEST_MODE        0x80    //sets the test mode
 
 #define MAX_VFD_DUTY_CYCLE     32
 
 #define VFD_CTRL_PORT_DDR     DDRD
 #define VFD_CTRL_PORT         PORTD
 #define PIN_POR         PD6
 
 #define DDR_SPI            DDRB
 #define DD_MOSI            PB3            
 #define DD_SCK            PB5    
 
 #define SS            PB2
 
 unsigned char old_brightness_value, new_brightness_value;
 unsigned char adc_brightness_val;
 
 void static __inline__
 spi_master_transmit (unsigned char ch_data);
 
 /* send_command */
 void //static __inline__
 send_command (unsigned char cmd, unsigned char data)
 {
   spi_master_transmit ( cmd | data );
 }
 
 /* set_brightness */
 void
 set_brightness (unsigned char __brightness_value)
 {
   send_command (DUTY_CYCLE_CTRL, __brightness_value);
 }
  
 
 /* POR, Pulse Width: tRESW 200uS & POR-SCLK Time: tRESS 200nS */
 void //static __inline__
 power_on_reset()
 {
  
  VFD_CTRL_PORT |= (1 << PIN_POR);
  _delay_loop_2 (1200);       
 
  /* delay_loop_2( ) 4 orajelciklus alatt valosit meg egy loop-ot.
                                  4MHz-nel : 1/4 000 000 = 0,00000025 = 250nS; 250nS*4*200 = 200uS */
                  //VFD adatlap szerint RESET >= 1mS
 
  VFD_CTRL_PORT &= ~(1 << PIN_POR);
 
  /* delay_loop_1( ) 3 orajelciklus alatt valosit meg egy loop-ot. */
   _delay_loop_1 (1);    //1    //4MHz-nel : 1/4 000 000 = 0,00000025 = 250nS; 250nS*3*1 = 750nS 
 }
 
 /* spi_master_init, mega8 124. old */
 void 
 spi_master_init()
 {
  /* Set MOSI and SCK output */
  DDR_SPI = (1 << DD_MOSI) | (1 << DD_SCK);
  /* Enable SPI, Master, set clock rate sck/8 */
  SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//|(1<<CPOL)|(1<<CPHA) ; |(1<<SPI2X)
 }
 
 /* spi_master_transmit */
 void //static __inline__
 spi_master_transmit (unsigned char ch_data)
 {
   SPDR  = ch_data;
   /* Wait for transmission complete */
   while( !(SPSR & (1<< SPIF)) )
      ;
   /* VFD tBUSY: wait 40 uS */
   _delay_loop_2 (50);    //40    //4MHz-nel : 1/4 000 000 = 0,00000025 = 250nS; 250nS*4*40 = 40uS
 }
 
 /* send_char */
 void //static __inline__
 send_char (unsigned char addr, unsigned char ch)
 {
   send_command (DIGIT_COUNTER_CTRL, addr); //kell ha az initben DIGIT_COUNTER_CTRL erteke 0
   spi_master_transmit (ch&0x0f);   
 }
 
 /* vfd_init */
 void
 vfd_init ()
 {
   /* MSC1937-01 init */
   /* F_CPU=4000000 */
 
   spi_master_init();
 
   /* VSS rise time, tPRZ 100uS */
   /* delay_loop_2( ) 4 orajelciklus alatt valosit meg egy loop-ot. */
   _delay_loop_2 (1100);        //4MHz-nel : 1/4 000 000 = 0,00000025 = 250nS; 250nS*4*100 = 100uS
  
   /* POR, Pulse Width: tRESW 200uS & POR-SCLK Time: tRESS 200nS */
 
   power_on_reset();
 
   //set DIGIT_COUNTER
   //send_command(DIGIT_COUNTER_CTRL, 0x00); //0 all to be controlled : VFD 7.old ; actual : 1-15
   //brightness
   set_brightness(20);
   //send_command(BUFFER_POINTER_CTRL, 0x00);
 }
 
 main ()
 {
   VFD_CTRL_PORT_DDR |= (1 << PIN_POR);
   
   vfd_init();
  
   send_char(0x04, 'F');
   //2C comma
   //2E decimal point
   
   for(;;);
  
 }
 
 
 Eszreveteleket,otleteket varom,
 Koszonom !
 
       
---------------------------------
Boardwalk for $500? In 2007? Ha! 
Play Monopoly Here and Now (it's updated for today's economy) at Yahoo! Games.


More information about the Elektro mailing list