Forum: Mikrocontroller und Digitale Elektronik Frage zur UART Mega328


von Daniel B. (yzdani)


Lesenswert?

Servus,

ich übertrage ein Char von einem Mega zum anderen
Wenn das UDR0 Register ein A enthält soll ein Pin auf HIGH geschalten 
werden.
Einschalten geht aber abschalten nicht

Hier der CODE:

Sender
1
void uasrt_init(unsigned int ubbr){
2
  UBRR0H=(unsigned char)(ubbr>>8);
3
  UBRR0L=(unsigned char)ubbr;
4
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);
5
  UCSR0C=(0<<USBS0)|(3<<UCSZ00);
6
}
7
8
int main(void)
9
{
10
   portkonfig();
11
   uasrt_init(MYUBBR);
12
   
13
    while (1) 
14
    {
15
    if (PINC&(1<<DDC0))
16
    {
17
      
18
    }else{
19
      UDR0='A';
20
    }
21
    }
22
}

Empfänger
1
void uasrt_init(unsigned int ubbr){
2
  UBRR0H=(unsigned char)(ubbr>>8);
3
  UBRR0L=(unsigned char)ubbr;
4
  UCSR0B=(1<<RXEN0)|(1<<TXEN0);
5
  UCSR0C=(0<<USBS0)|(3<<UCSZ00);
6
}
7
8
9
char chars;
10
int main(void)
11
{
12
    uasrt_init(MYUBBR);
13
  portkonfig();
14
    while (1) 
15
    {
16
    
17
    //while(!(UCSR0A&(1<<RXC0)));
18
    chars=UDR0;
19
    
20
    if (chars=='A')
21
    {
22
      PORTC=(1<<DDC1);
23
  
24
    }
25
    
26
    PORTC=0x00;
27
  
28
    }
29
}

FOSC usw. ist bei beiden gleich eingestellt auf das A reagiert der 
Empfänger auch aber Schaltet wenn kein A mehr kommt nicht mehr ab.


Warum?

Es wird auch kein A mehr gesendet wenn ich den Taster los lasse.

Danke im Voraus!

Gruß
Danie

von Georg G. (df2au)


Lesenswert?

Nimm dir bitte eine funktionierende Lib für den UART, zB von Fleury und 
arbeite damit.

Nur ein paar Stichpunkte:
Du solltest nur senden, wenn das Datenregister frei ist
Du solltest das Datenregister nur lesen, wenn ein Zeichen richtig 
empfangen wurde.
Wenn du ein Portbit einschaltest, ist es wenig zielführend, es im 
nächsten Befehl gleich wieder aus zu schalten. Das sieht man nur mit 
Anstrengung.

von Wolfgang (Gast)


Lesenswert?

Georg G. schrieb:
> Das sieht man nur mit Anstrengung.
... oder mit vernünftigem Werkzeug. Da reich schon ein kleiner LA für 7€

von Daniel B. (yzdani)


Lesenswert?

Danke Georg für die Stichpunkte.

Lese jetzt in einer ISR und es funzt.

Ich denke es macht auch wenig Sinn in der Lernphase eine Libary zu 
verwenden.
Trotzdem danke für den Tipp!

Gruß
Dani

von Sascha (Gast)


Lesenswert?

"
    if (chars=='A')
    {
      PORTC=(1<<DDC1);

    }

    PORTC=0x00;

    }
"

Das wird in einer sehr schnellen Endlosschleife wiederholt ausgeführt.

Wenn du ein A schickst, ist PC1 für ein bis zwei CPU Takte (paar 
Nanosekunden oder so?) auf High Pegel, direkt danach wieder low. Sieht 
man nicht.
Selbst mit PORTC=0; im else-Teil wärs nur bis zum nächsten 
Schleifendurchlauf, das sind dann vielleicht 8 CPU Takte.

Weiterhin ist (1<<DDC1) nur möglich, weil das vom Präprozessor auf 
(1<<1) umgesetzt wird.
Richtig wäre PORTC=(1<<PC1). Noch richtiger wäre

PORTC |=(1<<PC1); zum Einschalten und

PORTC &= ~(1<<PC1); zum Ausschalten.

Unterschied: Mit diesem beiden Befehlen änderst du nur das eine Bit, was 
du ändern willst, nicht alle 8.

Siehe das AVR-GCC Tutorial oben links.

von Georg G. (df2au)


Lesenswert?

Wolfgang schrieb:
> mit vernünftigem Werkzeug

Was vermutest du an Ausstattung und Erfahrung beim TO, wenn du das 
eröffnende Post liest?

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.