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