Forum: Mikrocontroller und Digitale Elektronik UART-2Microkontroller-gleichzeitig senden und empfangen


von hans w. (elektropepi)


Lesenswert?

Hallo,
folgende Aufgabe:ATMEGA328P
2uC: S1..TASTER1, S2..TASTER2,L1..Led1, L2..LED2
S1 an uC1 soll LED2 an uC2 schalten(Wenn Tasrer betätigt->LED EIN)
S2 an uC2 soll LED1 an uC1 schalten(Wenn Tasrer betätigt->LED EIN)
das ganze soll mit UART realisiert werden.



Mein Programm:
1
#include <avr/io.h>
2
#include <stdio.h>
3
4
void UART_init(); //Definition der Funktion UART_init
5
unsigned char UART_receive();//UART Empfangs-funktion
6
void UART_transmit(unsigned char data);//UART Sende-funktion
7
8
volatile unsigned char wert = 0;
9
10
11
int main ()
12
{
13
  UART_init();//UART initialisieren
14
  
15
  DDRC = 0x00;//Alles Eingänge
16
17
  PORTC = 0x00;
18
19
  DDRB |= (1<<PORTB5);//AUSGANG
20
21
  PORTB |= (1<<PORTB5);//PB5 ist Ausgang (LED low aktiv)
22
23
24
25
  while(1)
26
  {
27
    wert = UART_receive();//Wert empfangen
28
29
    switch(wert)
30
    {
31
      case 'E':  PORTB &= ~(1<<PORTB5);//LED leuchtet
32
      case 'A':  PORTB |= (1<<PORTB5);//LED leuchtet nicht
33
    }
34
35
    if ((PINC & (1<<PINC5)))
36
    {
37
      UART_transmit('E');//LED Ein-Befehl schicken
38
    }
39
    else 
40
    {
41
      UART_transmit('A');
42
    }
43
44
    
45
      
46
  }
47
48
  
49
}
50
51
52
53
54
55
void UART_init()//Funktion UART_init
56
{
57
      DDRD |= (1<<1);
58
59
   DDRD &= ~(1<<0);
60
61
   PORTD |= 0x02;
62
63
   UCSR0B = (1<<RXEN0) | (1<<TXEN0);//RX und TX (Empfangen und Senden) enabled
64
65
   UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);//8-Bit Betrieb und 1 Stopbit
66
67
   UBRR0H = 0;
68
   UBRR0L = 103;//Laut Tabelle (Datenblatt) bei 16 MHz für Baud = 9600 --> 103;  UBRR0H nicht benötigt, da 2^8 = 256
69
70
71
}
72
73
unsigned char UART_receive()
74
{
75
  while ( ! (UCSR0A & (1<<RXC0)));//Warten auf Empfang
76
77
  return UDR0;//Empfangene Daten zurückgeben
78
}
79
80
void UART_transmit(unsigned char data)
81
{
82
  while( ! (UCSR0A & (1<<UDRE0)));//Warten auf leeres Datenregister
83
84
  UDR0 = data;//Daten senden
85
}



Funktioniert nicht;(
Vielen dank wenn mir evtl. jemand weiterhelfen kann

mfg

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

hans werner schrieb:
> while ( ! (UCSR0A & (1<<RXC0)));//Warten auf Empfang

Deadlock.

von Thomas K. (thomas_k39)


Lesenswert?

Oder etwas ausführlicher: beide uC warten darauf, dass der andere als 
erster ein Zeichen sendet, aber keiner will den ersten Schritt machen.

von hans w. (elektropepi)


Lesenswert?

vielen Dank erstmals:)

Wie könnte das gelöst werden?

mfg

von Markus O. (pipimaxi)


Lesenswert?

Ein break vermisse ich in der switch-case ebenso

von Karl H. (kbuchegg)


Lesenswert?

Indem man hier
1
 while(1)
2
  {
3
    wert = UART_receive();//Wert empfangen

bzw. in der Funktion selber
1
unsigned char UART_receive()
2
{
3
  while ( ! (UCSR0A & (1<<RXC0)));//Warten auf Empfang
4
5
  return UDR0;//Empfangene Daten zurückgeben
6
}

nicht so lange wartet, bis irgendwas eingetroffen ist, sondern ganz 
einfach den UART befragt: Hast du was für mich?
Und nur dann ein Zeichen holt, wenn eines da ist. Im anderen Falle wird 
dann eben nicht solange gewartet, bis ein Zeichen eingetroffen ist 
sondern mit dem Rest des programms weiter gemacht.

Oder bleibst du neben dem Postkasten stehen, solange bis der Briefträger 
einen Brief einwirft? Dann wirds aber nix mit einer Brieffreundschaft, 
wenn du immer nur neben dem Postkasten rumlungerst und deswegen nie zum 
selber schreiben kommst.

Das könnte dann zb so aussehen
1
...
2
3
  while(1)
4
  {
5
    if( UART_available() )    // gibts was an der UART?
6
    {
7
      wert = UART_receive();//Wert empfangen
8
9
      switch(wert)
10
      {
11
        case 'E':  PORTB &= ~(1<<PORTB5); break; //LED leuchtet
12
        case 'A':  PORTB |= (1<<PORTB5); break;  //LED leuchtet nicht
13
      }
14
    }
15
16
    if ((PINC & (1<<PINC5)))
17
    {
18
      ...
19
  }

bzw.
1
uint8_t UART_available()
2
{
3
  if( UCSR0A & (1<<RXC0) )    // gibts was an der UART zu holen?
4
    return TRUE;
5
6
  return FALSE;
7
}

: Bearbeitet durch User
von hans w. (elektropepi)


Lesenswert?

1
#include <avr/io.h>
2
#include <stdio.h>
3
4
void UART_init(); //Definition der Funktion UART_init
5
unsigned char UART_receive();//UART Empfangs-funktion
6
void UART_transmit(unsigned char data);//UART Sende-funktion
7
8
volatile unsigned char wert = 0;
9
10
11
int main ()
12
{
13
  UART_init();//UART initialisieren
14
  
15
  DDRC = 0x00;//Alles Eingänge
16
17
  PORTC = 0x00;
18
19
  DDRB |= (1<<PORTB5);//AUSGANG
20
21
  PORTB |= (1<<PORTB5);//PB5 ist Ausgang (LED low aktiv)
22
23
24
25
  while(1)
26
  {
27
     if( UART_available() )    // gibts was an der UART?
28
    {
29
      wert = UART_receive();//Wert empfangen
30
31
      switch(wert)
32
      {
33
        case 'E':  PORTB &= ~(1<<PORTB5); break; //LED leuchtet
34
        case 'A':  PORTB |= (1<<PORTB5); break;  //LED leuchtet nicht
35
      }
36
    }
37
38
    if ((PINC & (1<<PINC5)))
39
    {
40
      UART_transmit('E');//LED Ein-Befehl schicken
41
    }
42
    else 
43
    {
44
      UART_transmit('A');
45
    }
46
47
    
48
      
49
  }
50
51
  
52
}
53
54
55
56
57
58
void UART_init()//Funktion UART_init
59
{
60
      DDRD |= (1<<1);
61
62
   DDRD &= ~(1<<0);
63
64
   PORTD |= 0x02;
65
66
   UCSR0B = (1<<RXEN0) | (1<<TXEN0);//RX und TX (Empfangen und Senden) enabled
67
68
   UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);//8-Bit Betrieb und 1 Stopbit
69
70
   UBRR0H = 0;
71
   UBRR0L = 103;//Laut Tabelle (Datenblatt) bei 16 MHz für Baud = 9600 --> 103;  UBRR0H nicht benötigt, da 2^8 = 256
72
73
74
}
75
76
uint8_t UART_available()
77
{
78
  if( UCSR0A & (1<<RXC0) )    // gibts was an der UART zu holen?
79
    return TRUE;
80
81
  return FALSE;
82
}
83
84
85
unsigned char UART_receive()
86
{
87
  while ( ! (UCSR0A & (1<<RXC0)));//Warten auf Empfang
88
89
  return UDR0;//Empfangene Daten zurückgeben
90
}
91
92
void UART_transmit(unsigned char data)
93
{
94
  while( ! (UCSR0A & (1<<UDRE0)));//Warten auf leeres Datenregister
95
96
  UDR0 = data;//Daten senden
97
}

So?
Muss ich noch etwas inkludieren bzw. TRUE und FALSE deklarieren?

Vielen Dank nochmals und entschuldigt die dummen Fragen. Bin Noob im uC 
programmieren:)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

hans werner schrieb:

> Vielen Dank nochmals und entschuldigt die dummen Fragen. Bin Noob im uC
> programmieren:)

Dann wirds Zeit für ein C Buch, wenn du noch nicht mal weißt, wie die 
Defintionen für die boolschen Werte TRUE bzw. FALSE lauten bzw. wie C 
das Thema Wahrheitswerte behandelt.

"Bin Noob" lass ich seit geraumer Zeit nicht mehr als Ausrede für 
fehlende Grundlagen gelten.
Du willst programmieren? Gut. Dann lern deine Sprache. Du musstest ja 
auch erst mal in der Fahrschule Autofahren lernen, ehe du auf den 
Strassenverkehr losgelassen wurdest.

: Bearbeitet durch User
von hans w. (elektropepi)


Lesenswert?

Dann erkläre es mir bitte:)

Für euch Profis ist das sicherlich ein klacks;)

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.