Forum: Mikrocontroller und Digitale Elektronik USART Kommunikation nur im Einzelschritt? ATmega2560 USART Problem


von Michel S. (c00n)


Angehängte Dateien:

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.

von Dietrich L. (dietrichl)


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

von Stefan F. (Gast)


Lesenswert?

Mein avr-gcc fügt am Ende der main Funktion eine Endlos-Warteschleife 
ein.

von Jonas Wühr (Gast)


Lesenswert?

Ich würde es im ISR machen.

von Main (Gast)


Lesenswert?

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

von Stefan F. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.