www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega8 USART


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, hab da ne Frage zu Atmega8 und USART/RS232:

Ich versuche vom PC mit HTerm mehrere Zeichen an den ATmega zu senden. 
Der soll die Zeichen kurz speichern und wieder zurücksenden. Sende ich 
jedes Zeichen einzeln vom PC aus geht das auch. Gebe ich alle Zeichen 
ein und gehe dann auf senden kommt der Atmega nicht mehr hinterher. Also 
es kommen nicht alle Zeichen so zurück wie ich sie hingesendet hab.

Um die Standard Frage schonmal zu beantworten: Ja, ich benutze einen 
Quarz.

Was mache ich falsch?

Gruß
Frank

Hier noch der Code:
#define F_CPU 8000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
#include <stdint.h>
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>


#define BAUD 4800UL      // Baudrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif


void uart_init(void)
{
  UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);  // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0)|(1<<UPM1);  // Asynchron 8N1 

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
}

void uart_senden_c(char zeichen)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }
  
  UDR = zeichen;
  
  return;
}


char daten[100];
uint8_t volatile anz_daten = 0;
uint8_t volatile rxFinish = 0;



ISR(USART_RXC_vect)
{
  
  daten[anz_daten] = UDR;
  if(daten[anz_daten] == 'a')
  {
    rxFinish = 1;

  }
  else
  {
    anz_daten++;
    daten[anz_daten] = '\0';
  }
  
}


int main()
{

  uint8_t pos = 0;
  uart_init();
  sei();


  while(1)
  {
  
    if(rxFinish == 1)
    {
      cli();
      uart_senden_c('!');
      while(pos <= anz_daten)
      {
        uart_senden_c(daten[pos]);
        pos++;
      }
      pos = 0;
      anz_daten = 0;
      rxFinish = 0;
      sei();
    }


    
  }

  return 0;
}

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

Bewertung
0 lesenswert
nicht lesenswert
Frank schrieb:

> ein und gehe dann auf senden kommt der Atmega nicht mehr hinterher. Also
> es kommen nicht alle Zeichen so zurück wie ich sie hingesendet hab.

Kannst du das näher präzisieren?
Was bedeutet 'alle'? Ist das erste Zeichen falsch, das letzte? Was 
sendest du hin, was kriegst du zurück?

Autor: Frank (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:

Ich sende blaaa. Wenn ein a gesendet wird sollte er eigentlich alles 
wieder zurücksenden. Ergebnis is auf den Screenshot zu sehen. Das ! 
markiert übrigens den Übertragungsbeginn vom ATmega.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm 'nen Quarz.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab jetzt festgestellt, dass es am Stopbit liegt.

Ich will eine Übertragung mit 1 Stopbit machen. Der AVR empfängt die 
Daten aber nur richtig, wenn ich 2 Stopbits sende.

Laut Datenblatt braucht der Atmega8 nur 1 Stopbit. Das kann man auf der 
Empfansseite auch nicht einstellen. Nur in Senderichtung kann man die 
Anzahl der Stopbits festlegen.

Woran könnte das liegen? Wie bekomme ich das hin, dass Daten mit einem 
Stopbit vom AVR richtig empfangen werden?

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte in letzter Zeit viel zu tun und bin heute dazu gekommen mir 
den Code noch mal angeguckt. Da ist mir aufgefallen, dass ich ein 
Paritätsbit in der Initialisierung vom USART einstelle. Ich frag mich 
wie ich das übersehen konnte, aber es liegt ja oft an so einfachen 
Fehlern.

Jetzt funktioniert es!

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.