Uart empfangen

OP #498122
Lesenswert?

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 #498129
Lesenswert?

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.
#498271
Lesenswert?

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 #498425
Lesenswert?

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 #498629
Lesenswert?

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 #498686
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren