Forum: Mikrocontroller und Digitale Elektronik Uart empfangen


von Mathias K. (underworldgamer)


Angehängte Dateien:

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

von Rahul, der Trollige (Gast)


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.

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

I send mit HTerm.exe a ascii 1 aber der PORTA = 0x01 bim Atmega 32 funzt 
einfach ned


mfg Mathias

von Rahul, der Trollige (Gast)


Lesenswert?

Könntest du bitte nur das C-file posten!? Mit .rar können nicht alle 
umgehen. Und der C-code sollte reichen...

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Hier wäre das file



Schick ein Ascii 1

mfg Mathias

von Rahul, der Trollige (Gast)


Lesenswert?

Die Daten vom AVR kannst du am Terminal sehen?

von Mathias K. (underworldgamer)


Lesenswert?

ja
i kann daten vonm up zu pc senden

von Karl H. (kbuchegg)


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?

von Mathias K. (underworldgamer)


Lesenswert?

Nein

Was muss man sonst noch was definieren
RXD und TXD Port???


Passt der Code serial.c oben

mfg Mathias

von Mathias K. (underworldgamer)


Lesenswert?

Muss RXD und TXD jeweils auf 1 liegen

von Karl H. (kbuchegg)


Lesenswert?

Mathias Koch wrote:
> Nein
>

Schlecht.

Aber du siehst im Hyperterminal den Text ATMEGA32.

Das heist für mich, dass das Kabel und der MAX232
zumindest in Hinrichtung (µC an PC) funktioniert.

Hast du im Hyperterminal, die Flusssteuerung auf 'keine'
gesetzt? Ganz sicher?

von Mathias K. (underworldgamer)


Lesenswert?

ja hab ich

von Mathias K. (underworldgamer)


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;
}

von Rahul, der Trollige (Gast)


Lesenswert?

Dein Controller sendet dauernd "ATMEGA 32" an den PC?
Pack das mal vor die Schleife.

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Was könnte sonst noch der Fehler sein??

Stimmt die Empfangs Routine und die Überprüfung im If()

hier noch ein Bsp wie ich die Daten sende

mfg Mathias

von Sonic (Gast)


Lesenswert?

Versuch' mal 'c' als 'volatile' zu definieren, am Besten global, dann 
sollte es gehen.

von Mathias K. (underworldgamer)


Lesenswert?

Daten empfangen geht ja nur nicht senden i vielleicht mein code  falsch 
oder an was liegst sonst noch

von Mathias K. (underworldgamer)


Lesenswert?

Ich glaube das RXC Flag nicht ausgelöst wird und deshalb nich die daten 
ind UDR gelangen was muss ich deshalb tuan

mfg Mathias

von Rahul, der Trollige (Gast)


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
}

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Ne geht leider auch nicht hab mal ein Bild der RS232 Schaltung beigelegt

ATMEGA 32 gibt es immer aus  nur bei "uart_receiver(); " denke i mal 
hägt sich das programm auf

RXD auf PDO
TXD auf PD1

mfg

von Karl H. (kbuchegg)


Lesenswert?

C8 ist verkehrt rum.
V- ist negativer als GND. Also muss der + Anschluss vom Elko
nach GND.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART

von Mathias K. (underworldgamer)


Lesenswert?

ja hab ich geht auch nicht mit dem AVR Simulator funtkionierts wenn ich 
RXC auf eins setze

von Rahul, der Trollige (Gast)


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

von Mathias K. (underworldgamer)


Lesenswert?

Oben angezeigtes bild

T1out 14 hat 6.61 Volt
R1out hat 0 Volt


Wenn ich das Kabel mit 2-3 verbinde kommt was beim hyp term raus
wenn ich T1out und R1out verbinde tuat sich nix

von Rahul, der Trollige (Gast)


Lesenswert?

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

von Mathias K. (underworldgamer)


Lesenswert?

11 und 12 Verbunden tuat sich nix

von Rahul, der Trollige (Gast)


Lesenswert?

Dein MAX hat einen an der Waffel...

von Mathias K. (underworldgamer)


Lesenswert?

Pin 8 und 9 waren mal auf GND weil der Kollege einen fehler gemacht hat 
kann es sein das er deshalb nich geht??

7 auf 7,60
8 auf 0
9 auf 4,7
10 auf 3,6
11 auf 4,69
12 auf 4,67
13 auf 0
14 auf 6,92

von Karl H. (kbuchegg)


Lesenswert?

Hast du den Elko schon umgedreht?
Noch mal: C8 ist verkehrt rum in der Schaltung!

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.