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.