PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zusammenspiel von SPI-Slave und UART



Kornhaas.net
24.08.2005, 08:39
Hallo,

um meine SPI-Verbindung zu testen, wollte ich mir schnell ein kleines Programm basteln, was mir die über SPI gelesenen Daten über UART auf meinem Terminal anzeigt. Ansich alleien Läuft der UART und auch der SPI Teil des Programmes. Nur im zusammenspiel, geht auf einmal nichts mehr.


Kann mir da evtl einer von euch nen Tip geben wieso ????



#include <inttypes.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

//#define F_CPU 16000000
//#define USART_BAUD_RATE 19200
#define USART_BAUD_SELECT 51

volatile unsigned char data;
unsigned char status;

char cText[] = "Hello, UART !\r\n";

SIGNAL (SIG_SPI)
{
data = SPDR;
if (data =='0') PORTC =0x00; //LEDs an
if (data =='5') PORTC =0xff; //LEDs an
}

void slave_init (void)
{
DDRB |= (1<<PB6); //MISO als Ausgang, der Rest als Eingang
SPCR = (1<<SPE) | (1<<SPIE); //Aktivierung des SPI + Interrupt
status = SPSR; //status löschen
}

//-----------------------------------------------------
void _writeChar(char c)
{
while (!(UCSRA & (1<<UDRE))) {}
UDR = c;
}
//-----------------------------------------------------
void _writeString(unsigned char *string)
{
while ( *string)
_writeChar(*string++);
}
//-----------------------------------------------------

/*void uart_init (void)
{
UCSRB |= (1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
UBRRL = (unsigned char) USART_BAUD_SELECT;
} */

int main(void)
{
DDRC = 0xff;
uart_init ();
_writeString(cText);
slave_init ();
sei();

for (;;) ;
return 0;
}


Prozessor: ATmega16

Mfg

Holger

kater
24.08.2005, 09:31
Ich rate mal ganz bloed. Vllt solltest du erst die Interrups aktivieren mit sei() und dann den String senden. Das wird aber nicht allein der Fehler sein.

Kornhaas.net
24.08.2005, 09:38
Nun wenn ich im moment meine Main richtig verstehe initialisier ich erst den Port C als Ausgang, dannach die UART, dann schreib ich als Test noch nen String auf die UART, danach wird SPI initialisiert.

Danach wird der Interrupt initialisiert.

int main(void)
{
DDRC = 0xff;
uart_init ();
_writeString(cText);
slave_init ();
sei();

for (; ; ) ;
return 0;
}


Wie gesagt, wenn ich das Uart_init aussperre läuft das Programm (nur ohne Uart)

und wenn ich Slave_init aussperre läuft es auch ( nur ohne SPI)




Mfg

Holger

Kornhaas.net
24.08.2005, 10:24
Es geht.

Also der Fehler lag scheinbar nicht an meinem Programm sondern daran, das mein Programmierboard noch auf FW 1.12 stand. Nach einem Update läuft es \:D/