Пытаюсь завести драйвер светодиодов TLC5947 на atmega8, написал следующий код:
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.8 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 01.05.2010
Author : striker
Company : home
Comments:
Chip type : ATmega8
Program type : Application
Clock frequency : 8,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega8.h>
#include <stdio.h>
#include <spi.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 3
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
unsigned int red, green, blue;
#define XTAL_FREQ 11059200
void delay_ms_xtal(long del)
{
unsigned int tmp;
while (del--) {
for (tmp = 0; tmp < XTAL_FREQ/8333; tmp++);
}
}
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status = UCSRA;
data = UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) {
rx_buffer[rx_wr_index] = data;
if (++rx_wr_index == RX_BUFFER_SIZE) {
rx_wr_index = 0;
red = (int)rx_buffer[0];
green = (int)rx_buffer[1];
blue = (int)rx_buffer[2];
//printf("buffer = %s, rgb: %d, %d, %d,\r\n", rx_buffer, red, green, blue);
}
if (++rx_counter == RX_BUFFER_SIZE) {
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void) {
char data;
while (rx_counter==0);
data = rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// Declare your global variables here
void main(void)
{
// Declare your local variables here
int i;
char spi_data;
// Input/Output Ports initialization
PORTB=0x00;
DDRB=0x2C;
PORTC = 0x00;
DDRC = 0xFF;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600 (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 2*2000,000 kHz
// SPI Clock Phase: Cycle Start
// SPI Clock Polarity: High
// SPI Data Order: LSB First
SPCR=0x7C;
SPSR=0x01;
// Global enable interrupts
#asm("sei")
red = 0;
blue = 0;
green = 0;
while (1) {
for (i = 0; i < 32; i++) {
printf("sending spi: %d\r\n", i);
spi_data = spi(i);
printf("spi_data = %d\r\n", spi_data);
delay_ms_xtal(200);
}
PORTC.0 = 1;
PORTC.0 = 0;
printf("XLAT GO!\r\n");
delay_ms_xtal(2000);
};
}У кого-нибудь есть опыт работы с подобными драйверами?
p.s. в листинге много рудиментарного кода. вырезать не стал, чтобы не отрезать чего-нибудь важного. простите, если что.


