UART Kommunikationsproblem

OP #354819
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
Angehängte Dateien:
Gast #354824
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren