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
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..
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
Kann mir den keiner weiterhelfen .. das empfangen auf uC seite geht aber das senden zum PC geht nicht richtig...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
