Forum: Mikrocontroller und Digitale Elektronik UART Kommunikationsproblem


von Dd D. (neo120484)


Angehängte Dateien:

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

von Dd D. (neo120484)


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

von johnny.m (Gast)


Lesenswert?

Deine delay-Routine dürfte vom Compiler wegoptimiert werden...

von Dd D. (neo120484)


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

von Dd D. (neo120484)


Lesenswert?

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

von Wolfram (Gast)


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.

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.