Uart empfangen

OP #498122
Hallo i sende mit dem Programm siehe Anhang HTerm.exe eine 1 als Ascii 
über die RS232 Schnittstelle

Leider weiß ich nicht genau wie ich das UDR abfragen kann??? mit 
If()...usw


Wenn ich die Daten empfangen habe möchte ich auch das PA0 auf high ist.

mfg Mathias Koch
Angehängte Dateien:
Gast
x = UDR;

if (x=='1') PORTA |= (1<<PA0);

Man könnte auch

if (UDR == '1') ...

schreiben. Das verhindert aber ein weiteres Verwenden der Daten.

Man könnte mit der ersten Version noch
if (x=='2') PORTA |= (1<<PA1);

machen, was mit der zweiten nicht mehr geht.
Und was ist, wenn du einfach nur machst:
1
int main(void)
2
{
3
  unsigned char buffer;
4

5
  uart_init();
6
  uart_puts ("ATMEGA 32\r\n");
7
  for(;;)
8
  {
9
    buffer = uart_receiver();
10
    uart_putc( buffer );
11
  }
12
}

Du müsstest alles was du ins HT hineintippst auch
vom HT angezeigt kriegen. Funktioniert das?
OP
Das wäre der Code wo liegt der Fehler darin???



void uart_init()
{
    // UART Transmitter anschalten
    // Data mode 8N1, asynchron 4800 1MHZ

  UBRRH  = 0;                                 // Highbyte ist 0
    UBRRL  = 12;                  // Lowbyte ist 12 ( dezimal )


  //UCSRB  = (1 << TXEN)
  //gleiche wie UCSRB = 0x08;
  UCSRB  = (1 << TXEN)|( 1 << RXEN );        // UART TX RX einschalten

  //UCSRC  =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0)
  //gleiche wie UCSRC = 0x86
    UCSRC  =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

}

///////////////////////////////////////////////////////




void uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))  //warten bis senden möglich ist
    {
    }

    UDR = c;                      //Ausgabe des Zeichens über UDR

}


/////////////////////////////////////////

/////////////////////////////////////////



char uart_receiver(void)
{
  while (!(UCSRA & (1<<RXC)));   /* Wait for incomming data */
  if(!(UCSRA & (1<<RXC)))                        /* Return the data */
  return UDR;
}



//////////////////////////////////////////

void uart_puts (char *s)
{
  //schleife wird so lange ausgeführt bis kein Zeichen mehr kommt
    while (*s)
    {
        uart_putc(*s);
        s++;
    }
}




///////////////////////////////////////////////////////


int main(void)
{


DDRA = 0x01; ///Ausgang
char buffer;


uart_init();

for(;;)
{            //Init den Uart siehe oben Unterprogramm

uart_puts("ATMEGA 32");//uart_puts liest einzelne Zeichen und gibt sie 
aus


buffer = uart_receiver();

if(buffer == '1')
{
  PORTA = 0x01;
}
Gast
Probier das mal:
1
void uart_init()
2
{
3
    // UART Transmitter anschalten
4
    // Data mode 8N1, asynchron 4800 1MHZ
5

6
    UBRRH  = 0;                   // Highbyte ist 0
7
    UBRRL  = 12;                  // Lowbyte ist 12 ( dezimal )
8
    UCSRB  = (1 << TXEN)|( 1 << RXEN );        // UART TX RX einschalten
9
    UCSRC  =(1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
10

11
}
12

13
void uart_putc(unsigned char c)
14
{
15
    while (!(UCSRA & (1<<UDRE)))  //warten bis senden möglich ist
16
    {
17
    }
18
    UDR = c;                      //Ausgabe des Zeichens über UDR
19
}
20

21
unsigned char uart_receiver(void)
22
{
23
  while (!(UCSRA & (1<<RXC)));   /* Wait for incomming data */
24
  return UDR;
25
}
26

27
void uart_puts (char *s)
28
{
29
  //schleife wird so lange ausgeführt bis kein Zeichen mehr kommt
30
    while (*s)
31
    {
32
        uart_putc(*s);
33
        s++;
34
    }
35
}
36

37
int main(void)
38
{
39

40

41
   DDRA = 0x01; ///Ausgang
42
   unsigned char buffer;
43
   
44
   uart_init();
45

46
   uart_puts("ATMEGA 32"); // einmalige Ausgabe
47

48
   for(;;)
49
   {
50
      buffer = uart_receiver(); // Byte empfangen
51
      uart_putc(buffer);        // Byte als Echo zurückliefern
52
      // Byte auswerten
53
      if (buffer == '1') PORTA = 0x01;
54
      if (buffer == '0') PORTA = 0x00;
55
   }
56
}
Gast
>ja hab ich geht auch nicht mit dem AVR Simulator funtkionierts wenn ich
>RXC auf eins setze

Da fehlen Satzzeichen...
Meinst du:
"ja, hab ich. Geht auch nicht. Mit dem AVR Simulator funtkionierts, wenn 
ich RXC auf eins setze." ?

Dann sieht es so aus, als würde dein RXD-Pin kein Signal bekommen.
Das einfachste wäre dann, den RX- und TX-Pin des MAX232 auf der 
TTL-Seite direkt miteinander zu verbinden (ohne Mikrocontroller dran).
Dann solltest du im Terminalprogramm genau das sehen, was du auch 
schickst ("hardwired Echobetrieb"...).
Gast
>wenn ich T1out und R1out verbinde tuat sich nix

Du meinst damit wirklich die Pins 14 und 12?

Die sollte man nicht miteinander verbinden...
Verbinde mal Pin 11 und 12.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.