mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart empfängt nicht richtig


Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich schon wieder mit eim UART das problem was ich jetzt habe ist 
das ich was sende aber nicht das bekomme was ich gesendet habe.

Mein Programm und der atmega16 können Daten empfangen und auch auf PortB 
ausgeben, in dem ich UDR auf Port B gebe. Aber so wie ich die Daten mit 
einem anderen MC sende kommen sie nicht auf den Ausgang B an.
Wenn ich ein 10001010 sende zeigt mein oszi am Eingang des emfpängers 
------_-_-___--------- an was schon mal richtig ist. An meinem Port B 
des Empfängers bekomme ich aber 11100000 aber da müsste eigentlich 
01010001 sein. Wenn ich eine 11111111 sende bekomme ich an Port b des 
Empfängers 11111110. Ich sende 8bite und 1 Stopbit mit 2400 Baud. Kann 
mir jemand helfen und sagen was ich falsch mache.


#include <stdlib.h>
#include <avr/io.h>  
#include <util/delay.h>
#include <inttypes.h>

#define F_CPU 1000000L
#define BAUD 4800L
#define ubrr_value (  ( F_CPU / (16*BAUD) ) - 1  )

// Prototypen
uint8_t uart_getc(void);
void initusart ();
void uart_gets( char* Buffer, uint8_t MaxLen );





//********************  main   *********************
int main(void)
{
  char strBuffer[256];
  DDRB = 0xff;
  initusart ();   
    
  while (1)
  {
    // void uart_gets( char* Buffer, uint8_t MaxLen )
    uart_gets( &strBuffer[0], 255 );  //void  
  }
}
/************************ Zeichen empfangen *******************/
uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)));   // warten bis Zeichen verfuegbar    
    PORTB = UDR;
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}

//********Zeichen sammeln und zum String zusammen setzen*********
void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;
 
  NextChar = uart_getc();         
   
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }
}

//***************UART Initialisieren********************
void initusart ()
{
  //UBRRH = (unsigned char)(ubrr_value>>8);
    //UBRRL = (unsigned char)ubrr_value;
    
  UBRRH = ubrr_value >> 8;
    UBRRL = ubrr_value & 0xFF;

  
  
  UCSRB = (1<<RXEN)|(1<<TXEN);// UART RX einschalten                 
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #define F_CPU 1000000L
> #define BAUD 4800L

Wie sieht es mit anderen Taktraten/Taktquellen (Quarz!) oder niedrigeren 
Baudraten aus?

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem Herrn sei dank die Baud rate war der fehler ich brauche ja 2400 und 
nicht 4800 danke für deine schnelle hilfe.

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.