mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart empfangen


Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:

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


mfg Mathias

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier wäre das file



Schick ein Ascii 1

mfg Mathias

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Daten vom AVR kannst du am Terminal sehen?

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja
i kann daten vonm up zu pc senden

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was ist, wenn du einfach nur machst:
int main(void)
{
  unsigned char buffer;

  uart_init();
  uart_puts ("ATMEGA 32\r\n");
  for(;;)
  {
    buffer = uart_receiver();
    uart_putc( buffer );
  }
}

Du müsstest alles was du ins HT hineintippst auch
vom HT angezeigt kriegen. Funktioniert das?

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein

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


Passt der Code serial.c oben

mfg Mathias

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss RXD und TXD jeweils auf 1 liegen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja hab ich

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Rahul, der Trollige (Gast)
Datum:

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

Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sonic (Gast)
Datum:

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

Autor: Mathias K. (underworldgamer)
Datum:

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

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Probier das mal:
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)|( 1 << RXEN );        // UART TX RX einschalten
    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
}

unsigned char uart_receiver(void)
{
  while (!(UCSRA & (1<<RXC)));   /* Wait for incomming 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
   unsigned char buffer;
   
   uart_init();

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

   for(;;)
   {
      buffer = uart_receiver(); // Byte empfangen
      uart_putc(buffer);        // Byte als Echo zurückliefern
      // Byte auswerten
      if (buffer == '1') PORTA = 0x01;
      if (buffer == '0') PORTA = 0x00;
   }
}

Autor: Mathias K. (underworldgamer)
Datum:
Angehängte Dateien:
  • preview image for 1.JPG
    1.JPG
    92 KB, 98 Downloads

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mathias K. (underworldgamer)
Datum:

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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"...).

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
11 und 12 Verbunden tuat sich nix

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein MAX hat einen an der Waffel...

Autor: Mathias K. (underworldgamer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.