USART Kommunikation nur im Einzelschritt? ATmega2560 USART Problem

OP #4472348
Hallo,

Ich bin dabei einen ATmega2560 so zu konfigurieren, dass er mehrere 
Sensoren über einen Multiplexer nacheinander abfragt. Der ATmega soll 
dann die Antworten (Messwerte) aufnehmen und weiter verarbeiten. Das 
"anpeilen" der Sensoren klappt ganz gut, jedoch gibt es Probleme bei der 
übermittlung der Antwort, was meiner Einschätzung nach ein Timing 
Problem sein könnte (Sensor braucht eine Weile bis er antwortet, paar 
ms).

Also hier meine main()

angehangen sind die weiteren files wie uart init, uart senden und uart 
empfangen.

Nochmal mein Ziel: Ich sende einen String über den UART1 an den Sensor. 
Dieser antwortet (er antwortet wirklich, habe eine TX-kontroll-LED) und 
die Antwort soll in ein char array eingelesen werden. Leider Antwortet 
der Sensor nur wenn ich im Einzelschrittmodus das Programm ausführe, 
führe Ich das Programm normal aus bleibt er irgendwo stecken 
(warscheinlich weil er auf eine Antwort wartet)
Ich hoffe ihr habt ein paar Lösungsansätze und konstruktive Kritik für 
mich.
1
#define BAUD1 19200U
2
#define BAUD2 38400U
3
#define UART1_BAUD_RATE (((F_CPU + BAUD1*8)/(16UL*BAUD1))-1)
4
#define UART2_BAUD_RATE (((F_CPU + BAUD2*8)/(16UL*BAUD2))-1)
5
#define UART_MAXSTRLEN 10
6
#include "USART_init.c"
7
#include "USART_send.c"
8
#include "USART_receive.c"
9
volatile uint8_t uart_str_complete = 0;
10
volatile uint8_t uart_str_count = 0;
11
volatile char uart_string[UART_MAXSTRLEN + 1] = "";
12

13
int ports[4] = {0x00, 0x01, 0x02, 0x03};
14
char* cmd[] = {"&i\r\n", "&e\r\n","&s\r\n"};
15

16
int main()
17
{
18
  
19
  char Line[43];
20
  DDRA = 0xff;
21
  PORTA = ports[1];
22
  uart_init(); //Funktion in UART_init.c
23
  uart_puts(cmd[1]); //funktion in UART_send.c
24
  uart_gets(Line, sizeof(Line));//funktion in UART_receive.c
25
  while (!(UCSR3A & (1<<UDRE3)));  /* warten bis Senden moeglich */
26
    for(int i = 0; i < 41; i++)
27
    {
28
      UDR3 = Line[i];
29
    }
30
  return 0;
31
}

ALs Ausgabe (UART3 ist an PC angeschlossen) erhalte Ich in HTerm nur die 
erste Zahl des messwertes und dann viele \0.
Angehängte Dateien:
Michel S. schrieb:
> while (!(UCSR3A & (1<<UDRE3)));  /* warten bis Senden moeglich */
>     for(int i = 0; i < 41; i++)
>     {
>       UDR3 = Line[i];
>     }

Du musst vor jedem "UDR3 = Line[i];" warten bis Senden möglich ist, 
also:
1
  for(int i = 0; i < 41; i++)
2
  {
3
    while (!(UCSR3A & (1<<UDRE3)));  /* warten bis Senden moeglich */
4
    UDR3 = Line[i];
5
  }

>   return 0;

Ist das beabsichtigt, dass main() verlassen wird? Dann startet der µC im 
günstigsten Fall neu.

Gruß Dietrich
Gast
>Mein avr-gcc fügt am Ende der main Funktion eine Endlos-Warteschleife ein

Was macht eine Endlos-Warteschleife ma Ende der Main?

Die Main ist nie zu Ende, die Main ist die Endlosschleife.
Gast
> Die Main ist nie zu Ende, die Main ist die Endlosschleife.

Nein, main() ist eine Funktion, die nach der Initialisierung genau 
einmal aufgerufen wird.

Wenn die main Funktion keine Endlosschleife enthält, fügt der avr-gcc am 
Ende automatisch eine ein.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.