mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Kommunikationsproblem


Autor: Dd Dd (neo120484)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich habe ein kleines Probelm bei meiner UART kommunikation auf dessen
lösung ich leider nicht von alleine komme.. also anfänglich läuft das
programm auf meinem uC annähernd so wie es soll ich kann über das
Terminal ein Ascii zeichen schicken und es wird mir darauf hin vom uC
zurückgesendet. Zur anzeige lass ich mir das gesendete Zeichen auch
noch  auf den Leds meines Evaluation Boards augeben..

Jetzt tritt das erste Problem auf das empfangene zeichen passt noch
aber  das zurückgesendete zeichen ist anfänglich gleich mit komischem
zeichen noch hinten drann und nach 3-6 mal schickt er mir nur noch müll
zurück .. die Led's auf dem board zeigen aber noch das richtige an..

Ergo der fehler muß irgenwo beim zurücksenden liegen..

vielleicht weiß ja jemand an was das liegen könnte hier mal mein
Quelltext:


//------------------------------------Includes-------------------------- 
---------
#include <avr/io.h>
#include <stdint.h>
#include <compat\ina90.h>
//------------------------------------Defines--------------------------- 
---------
#define FOSC 3686400
#define BAUD 9600
#define MYUBRR (FOSC/(16L*BAUD))-1


//------------------------------------Functions------------------------- 
---------
//=============Init function=========================
void USART_INIT(unsigned int ubrr)
{
  //Set Bautrate
  UBRR0H =(unsigned char)(ubrr>>8);
  UBRR0L =(unsigned char)ubrr;

  //Enable receive and transive
  UCSR0B = (1<<RXEN0) | (1 << TXEN0);

  //Set Frame format
  UCSR0C = (1<<USBS0)|(1<<UCSZ00);
}


//=============Send function=========================
int USART_Transmit(unsigned char data)
{
  //Wait for empty Register
  while(!(UCSR0A & (1<<UDRE0)))
  {}

  //Send data
  UDR0 = data;

  return 0;
}


//=============Delay function========================
void delay_ms( unsigned int ms )
{
    unsigned int  i;
    unsigned int  j;

    for ( i = ms;  i;  i-- )
    {
        for ( j = 51;  j;  j-- )
        {
        }
    }
}


//=============puts function=========================

void USART_Puts(char *send)
{
  while(*send)
  {
    USART_Transmit(*send);
    send++;
  }
}


//=============Receive Enable========================
void USART_EnableRX()
{
    UCSR0B |= ( 1 << RXEN0);
}

//=============Receive function======================
uint8_t USART_Rx(void)
{
    while (!(UCSR0A & (1<<RXC0)));
    return UDR0;
}












int main(void)
{

  USART_INIT(MYUBRR);

  DDRC  = 0xff;

  PORTC |= (1<<PC6) | (1<<PC5) | (1<<PC4) | (1<<PC3) | (1<<PC2) |
(1<<PC1);

  delay_ms(1000);
  PORTC |= (1<<PC0);


  while(1)
  {
    uint8_t receive = 0;

    receive = USART_Rx();

    PORTC &= receive;

    delay_ms(1000);

    PORTC |= 0xff;

    delay_ms(1000);

    USART_Transmit(receive);


  }

}

Gruß Dominik

Autor: Dd Dd (neo120484)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ach ja das hab ich vergessen zu sagen oben ist ein Bild angehängt was
meine Terminal ausgabe beinhaltet .. Beim Terminal hab ich mir nur die
Empfangenen Daten anzeigen lassen also nicht die Zeichen die ich
eingetippt habe..

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine delay-Routine dürfte vom Compiler wegoptimiert werden...

Autor: Dd Dd (neo120484)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich nicht da ich meine die leuchtdauer meiner LED's damit ganz
gut einstellen kann.. und was hat das mit der UART zu tun? versteh ich
nicht.. G

Autor: Dd Dd (neo120484)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir den keiner weiterhelfen .. das empfangen auf uC seite geht aber
das senden zum PC geht nicht richtig...

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du solltest nochmal genau das Frameformat das du einstellst überprüfen,
da könnte es nötig sein das Datenblatt bezüglich UCSR0C zu lesen.

Deine delayroutine ist Schrott, jeder optimierende Compiler schmeisst
die weg.

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.