-         

Ergebnis 1 bis 4 von 4

Thema: Zusammenspiel von SPI-Slave und UART

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2005
    Ort
    Fürth
    Alter
    36
    Beiträge
    16

    Zusammenspiel von SPI-Slave und UART

    Anzeige

    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 ????

    Code:
    #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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.08.2005
    Ort
    49.80248 8.59252
    Alter
    33
    Beiträge
    172
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2005
    Ort
    Fürth
    Alter
    36
    Beiträge
    16
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.08.2005
    Ort
    Fürth
    Alter
    36
    Beiträge
    16
    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 \/

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •