Forum: Mikrocontroller und Digitale Elektronik PC über USART auf MC und zurück


von flo (Gast)


Lesenswert?

Hallo,

hätte da mal ne Frage versuch gerade mittels Atmega8535 über 
Hyperterminal ein ASCII-Zeichen auf den Controller zu schicken und diese 
möchte ich wieder auf dem Hyperterminal ausgeben.
Hab leider keine Ahnung was falsch läuft.
Gruß Flo.

#define F_CPU    4000000L  // Taktfequenz
#define BAUD     9600L    // Baudrate
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <stdlib.h>
#include <util/delay.h>
#define MYUBRR    ((F_CPU)/((BAUD)*16L)-1) // Uebergabewert
#define PORTC_OUT  DDRC = 0xff;
void Portinit(void)
{
  PORTC_OUT;
}
void UARTinit(void)
{
  UBRRH=(unsigned char)(MYUBRR>>8);
  UBRRL=(unsigned char) MYUBRR;

  UCSRC |= (1<<URSEL)|(3<<UCSZ0);  // Asynchron 8N1
  UCSRB |= (1<<TXEN)|(1<<RXEN);  // UART TX und RX einschalten
}
void uart_putc(unsigned int c)
{
    while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
    UDR = c;                      // sende Zeichen
}
void Usart_Rx(void)
{
    while (!(UCSRA & (1<<RXC)))  // warten bis Zeichen verfuegbar
  {
    uart_putc(UDR);   // Zeichen zurück senden
    PORTC ^= 0xff;   // PORTC toggeln
  }
}
int main(void)
{
  Portinit();
  UARTinit();
  while(1)
  {
    Usart_Rx();
  }
  return(0);
}

von BennyS (Gast)


Lesenswert?

1
  while (!(UCSRA & (1<<RXC)))  // warten bis Zeichen verfuegbar
2
  {
3
    uart_putc(UDR);   // Zeichen zurück senden
4
    PORTC ^= 0xff;   // PORTC toggeln
5
  }

Solang kein Zeichen verfügbar ist läuft die while-Schleife durch, wenn 
dann einskommt springt sie wieder raus.

Nimm mal die { und } weg bzw. den Code dazwischen dannach. Damit er in 
der Schleife bleibt bis er etwas empfangen hat und dann den Code 
abarbeitet.
1
  while (!(UCSRA & (1<<RXC)))  // warten bis Zeichen verfuegbar
2
  // { Nich nötig da die While-Schleife hier nur solang durchlaufen soll 
3
  // } bis was passiert also quasi warten soll
4
  uart_putc(UDR);   // Zeichen zurück senden
5
  PORTC ^= 0xff;   // PORTC toggeln

von flo (Gast)


Lesenswert?

Wenn doch alles nur so einfach wär.
Vielen Dank, so gehts natürlich.
Gruß flo.
ps: später vielleicht mehr.

von Rahul D. (rahul)


Lesenswert?

Das Semikolon nach dem While sollte man nicht vergessen...
1
while (!(UCSRA & (1<<RXC)));  // warten bis Zeichen verfuegbar

von flo (Gast)


Lesenswert?

Wie Semikolon nach einem While???

von Rahul D. (rahul)


Lesenswert?

while (!(UCSRA & (1<<RXC)))_;_

von Karl heinz B. (kbucheg)


Lesenswert?

Schreib das ; in eine neue Zeile. Dann sieht man es besser

  while (!(UCSRA & (1<<RXC)))
    ;

Wenn du abolut klarstellen willst, dass das interessante
an der while-Schleife einzi gund alleine in der
Bedinung zu suchen ist und der Schleifenrumpf leer
ist, schreibe ich auch mal gerne

  while (!(UCSRA & (1<<RXC)))
  {
    // do nothing
  }

Jetzt kann nur noch ein Blinder nicht mitbekommen
was da abläuft.

von Rahul D. (rahul)


Lesenswert?

>Schreib das ; in eine neue Zeile.

Dann sieht es aber sehr verloren aus... ;-)
Ich mache das Semikolon immer ans Ende einer Zeile.
Wenn man noch eine Anweisung hinter dem while(..) stehen hat, kommt da 
ja auch das Semikolon ans Ende. Sobald mehr als eine Anweisung folgt, 
braucht man ja eh die geschweiftenen Klammern. Die fangen dann in einer 
neuen Zeile an.
Das habe ich mir beim Pascal-Programmieren angewöhnt...
Ist aber wie immer eine Anschauungssache...

von Karl heinz B. (kbucheg)


Lesenswert?

> Wenn man noch eine Anweisung hinter dem while(..) stehen hat, kommt da
> ja auch das Semikolon ans Ende.

Wenn ich noch eine Anweisung hinter dem while habe, kommt
die ebenfalls bei mir in eine neue Zeile.

  while( xyz )
    bla-bla;

Übrigens: Das ; alleine ist eine eigene Anweisung. Eine leere 
Anweisung.
Das ; hat in diesem Fall nichts mit dem while zu tun. Keine der
Kontrollstrukturen wird in C mit einem ; abgeschlossen.

von Rahul D. (rahul)


Lesenswert?

Wie gesagt: Ich hab mir die Schreibweise in meiner Schulzeit (ewig her) 
mit dem Programmieren in Pascal angewöhnt....

von Karl heinz B. (kbucheg)


Lesenswert?

Wie du schon sagtest. Ist Anschauungssache

von flo (Gast)


Lesenswert?

ist es so auch Okay?

while (!(UCSRA & (1<<RXC))){}

Oder eher sehr schlechter Programmierstiel.

von Karl heinz B. (kbucheg)


Lesenswert?

Na ja.
Die Frage ist, wie schreibst du das ganze, wenn in den {} eine
Anweisung drinnen ist?

Ich schreibs so

  while( xyyz ) {
    abcd;
  }

Konsequenterweise lautet das ganze dann

  while( xyz ) {
  }


Andere schreiben ersteres so

  while( xyyz )
  {
    abcd;
  }

folgerichtig schreiben sie dann

  while( xyz )
  {
  }

Das wichtigste bei Formatierregeln ist: Es ist weniger wichtig,
welchen Stil du benutzt. Viel wichtiger ist, dass du den Stil
konsequent durchziehst und sowenig Ausnahmen wie möglich machst.

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.