ATmega 16,32 problém s SPI

Zdravím mám takový problém při sbírání dat přes SPI, mám funkční kód, který již použivám v jedné jednotce. Po nahrání tohoto kódu do jiné ATmega nefunguje a není mi jasné proč, jakmile zavolám 2x za sebou funcki SPI_Prenos, tak tam se program zasekne a nepokračuje dál. Prosím o jakoukoliv radu. Díky.

#include <avr/io.h>
#define F_CPU 1000000 //11059200
#define BAUD 9600 //115200
#define MYUBRR F_CPU/16/BAUD-1
#include <util\delay.h>
void SPI_Inicializace(void);
unsigned char SPI_Prenos(unsigned char data);
void USART_Inicializace(unsigned char baud);
void USART_Vysilani( unsigned char data );
typedef unsigned char promenna;

SPI_Inicializace(); // inicializace SPI a USART
USART_Inicializace(MYUBRR);

PORTA=0xFF;
_delay_ms(100);

for(;:wink: ////////sber dat z akcelerometru/////////
{ promenna data;
promenna pomocna = 0xFF;

PORTA = 0xFD;  
SPI_Prenos(0b00001110);		//	osa Y
data = SPI_Prenos(0);
USART_Vysilani(data);
PORTA=0xFF;

USART_Vysilani(pomocna);

}
return 0;

}

void SPI_Inicializace(void)
{

DDRB = (1<<DDB7)|(1<<DDB5); // nastaveni MOSI a SCK

SPCR = (1<<SPE)|(1<<MSTR)|(0<<SPR1)|(0<<SPR0); // povoleni SPI, nastaveni master, hodiny F_CPU/4
}

unsigned char SPI_Prenos(unsigned char data)
{
char pomocna;
SPDR=data;
while (!(SPSR & (1<<SPIF))); //cekani odeslani dat
pomocna=SPDR;
return pomocna;
}

void USART_Inicializace(unsigned char ubbr)
{

UBRRH = (unsigned char)(ubbr>>8); // nastaveni baud rate
UBRRL = (unsigned char)ubbr;

UCSRB =(1<<TXEN); // aktivace vystupu
}

void USART_Vysilani( unsigned char data )
{

while ( !( UCSRA & (1<<UDRE)) ) // podminka prazdneho bufferu
;

UDR=data; // odeslani dat
}

Jinak nastavené pojistky?

Nebo se zdroják změnil, zapomněls na to a tak binár není stejný s tou původní verzí?

Opravdu funkční?
Při kompilaci mi ukazuje 14 chyb a 10 varování.

Jen mu tam (asi při přenosu zdrojáku sem), vypadla hlavička main(), pak už to překládá v pořádku:

int main(void) { SPI_Inicializace(); // inicializace SPI a USART

Zdroják jsem už párkrát měnil, chybý tam main() máte pravdu kopíroval jsem to narychlo. Jen mi prostě nejde do hlavy proč se to na té funkci zastaví. Programuji to přes ISP tak předpokládám, že zapojení je správné, není ve zkratu nebo tak něco. Zkoušel jsem to na dvou AVR právě na jedné ATmega16 s externím OSC, kde jsem nastavil i pojistky, a pak na na ATmega32, kde mám interní OSC a u obou stejná chyba. Už nevím čím by to mohlo být. Nesetkal jste se někdo s podobným problémem?

Tam by se ještě měl řídit signál SS (PORTB4), ne? Nebo to má slave nastavené hw natvrdo, že má SS nulový? Moc SPI ještě neznám, tak jen uvažuju, jestli slave může zablokovat příjem tím, kdyby nevysílal data (že by to pak zůstalo čekat).

Podle čeho tak soudíš?
Zkoušel jsem tvůj kód na své desce a nikde se nezastavuje.
Na terminálu vypisuje stále čísla.

Edit:
V SPI inicializaci nastav pin SS jako výstup.

Vypadá to , že chyba byla na tom pinu SS, nastavil jsem podle rady a jede to. Jen nevím proč tomu tak je. Já si vybírám zařízení se kterým chci komunikovat právě tím PORTA = 0xFD; Každopádně díky moc za pomoc, už jsem byl bezradnej.

Na to si stačí přečíst datasheet, kde píšou, že pokud je v MASTER módu SS definovaný jako vstup, musí se zajistit, aby byla na SS vstupu log. 1, aby SPI běželo. Jinak se stane, že stažením SS na zem se SPI přepne do SLAVE a musí se ručně zase přepnout na MASTER.

Ok, díky za vysvětlení.