- LiTime Speicher und Akkus         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: UART String senden

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Anzeige

    Praxistest und DIY Projekte
    Ich hab bei der uart_init() nun folgenden Code gestrichen. Jetzt funktioniert es.

    // Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
    do
    {
    // UDR auslesen (Wert wird nicht verwendet)
    UDR;
    }
    while (UCSRA & (1<<RXC));

    // Rücksetzen von Receive Complete Flag
    UCSRA = (1<<RXC);
    ISRs hab ich nur eine einzelne die

    Code:
    ISR(SIG_UART_RECV)
    {
        //unsigned char buffer;
    
        // Daten aus dem Puffer lesen ...
        //buffer = UDR;
    }
    Und da steht nichts drin
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  2. #12
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von hacker
    Ich hab bei der uart_init() nun folgenden Code gestrichen. Jetzt funktioniert es.
    Nein, daran liegt es sicher nicht.

    ISRs hab ich nur eine einzelne die

    Code:
    ISR(SIG_UART_RECV)
    {
        //unsigned char buffer;
    
        // Daten aus dem Puffer lesen ...
        //buffer = UDR;
    }
    Und da steht nichts drin
    Und wie sieht diese ISR denn nun wirklich aus? So wie hier (was Probleme verursacht), oder so wie im ersten Posting?
    MfG
    Stefan

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Hallo,

    die ISR sieht nun aktuell so aus:

    Code:
    ISR(USART_RXC_vect)
    {
        unsigned char buffer;
    
        // Daten aus dem Puffer lesen ...
        buffer = UDR;
    }
    UDR wird schon gelesen, sonst rennt der Interrupt ja immer wieder an.

    Aber es funktioniert immer noch nicht wirklich. Nur wenn ich die Interrupts ausschalte, kommt der ganze String an, sonst immer nur "Ha".

    /Edit.

    Jetzt geht es nicht mal mehr, wenn ich die Interrupts ausschalte. Aktueller Code:

    Code:
    #include <uart.h>
    
    //#include <avr/interrupt.h>
    #include <avr/io.h>
    
    
    void set_pll_frequency(unsigned short multiplier)
    {
    	unsigned short divider = 1024;
    	unsigned char mux = 10;
    
    	while (divider * multiplier > 2000)
    	{
    		divider >>= 1;
    		mux--;
    	} 
    
    	//divider * multiplier -> Zerlegen in die zwei PCF8574 Bytes für PLL und über I2C wegschicken
    
    	//mux -> mux ports setzen
    
    }
    
    
    
    
    int main(void)
    {	
    	uart_init();
    
        //sei();
    
    	uart_send_string("Hallo!" "\r\n");
    
        while (1)
    	{
    
    	}
    
    	return 0;
    }
    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define BAUD        19200UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    /*************************************************************************
     Initialisierung vom UART Interface
    *************************************************************************/
    void uart_init(void)
    {
        // Baudrate einstellen (Normaler Modus)
        UBRRH = (unsigned char) (UBRR_BAUD>>8);
        UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
    
        // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
        UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    
        // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    
    	// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte)
        do
        {
            // UDR auslesen (Wert wird nicht verwendet)
            UDR;
        }
        while (UCSRA & (1<<RXC));
    
       // Rücksetzen von Receive Complete Flag
        UCSRA = (1<<RXC); 
    }
    
    /*************************************************************************
     Zeichen senden
    *************************************************************************/
    void uart_send_char(const unsigned char data)
    {
    	// ... warten bis der Sendepuffer leer ist ...
        while (!( UCSRA & (1<<UDRE)))
    		;
    
    	UDR = data;
    }
    
    /*************************************************************************
     String senden
    *************************************************************************/
    void uart_send_string(const char *data)
    {		
    	while (*data)
        {
    		uart_send_char(*data);
    
    		data++;
        }   
    }
    
    /*************************************************************************
     UART Empfangs Interrupt ISR
    *************************************************************************/
    ISR(USART_RXC_vect)
    {
        unsigned char buffer;
    
        // Daten aus dem Puffer lesen ...
        buffer = UDR;
    }
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Kann es sein, dass man noch was in der IDE oder beim Compiler einstellen muss? Ich fang erst mit C an und falls man dazu noch was einstellen müsste, hab ich es sicherlich nicht oder falsch gemacht. Das ist vielleicht als Fehlerquelle auch nicht auszuschließen?
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

LiFePO4 Speicher Test