USART Kommunikation nur im Einzelschritt? ATmega2560 USART Problem

OP #4472348
Lesenswert?
• ▲
▼
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:
#4472840
Lesenswert?
• ▲
▼
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 #4475035
Lesenswert?
• ▲
▼
> 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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.