PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART senden spinnt?!?!?



taylor22
05.11.2007, 21:41
habe folgendes programm geschrieben zur ausgabe einzelner zeichen per
USART!
das problem liegt nun darin, dass die zeichen nicht nur einmal
ausgegeben werden, sondern diese werden immer wiederholt! ????
das ganze sieht dann so "123ABC123ABC123ABC...." keine Ahnung weshalb die zeichen immer wiederholt werden, sollten ja nur einmal eigentlich ausgegeben werden, oder???? vielen dank für eure antworten! habe ATmega128!

#include <avr/io.h>

#define FOSC 14745600 // Clock Speed
#define BAUD 2400
#define MYUBRR FOSC/16/BAUD-1

void USART_Init(unsigned int ubrr);
void USART_Transmit(unsigned char data);
unsigned char USART_Receive(void);

int main(void){
USART_Init(MYUBRR);
USART_Transmit('1');
USART_Transmit('2');
USART_Transmit('3');
USART_Transmit('A');
USART_Transmit('B');
USART_Transmit('C');
while(1);
return 0;
}

void USART_Init( unsigned int ubrr )
{
/* Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/* Enable transmitter */
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = (3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
}

unsigned char USART_Receive(void)
{
/* Wait for data to be received */
while ( !( UCSR0A & (1<<RXC0)) );
/* Put data into buffer, sends the data */
return UDR0;
}

CowZ
05.11.2007, 22:07
Hi,

würde vermuten, dass entweder
- das while(1); wegoptimiert wird und er nach dem return 0; wieder an den anfang springt

oder:
- ein ungewollter interrupt ausgelöst wird, nicht behandelt wird und für einen pseudo-reset sorgt.

gruß, CowZ

McJenso
05.11.2007, 22:07
Hallo,

while (1); wird vermutlich vom Compiler wegoptimiert und das gesammte Programm startet nach return0; neu. Versuch es mal mit:



while(1){
asm volatile ("nop");
}



Gruß
Jens

_werwurm_
06.11.2007, 00:30
Vielleicht kommt ein Reset durch den Watchdogtimer?

taylor22
06.11.2007, 13:45
ich habe den watchodog nicht eingeschaltet! oder kann sich der wenn ich den nicht ausdrücklich ausschalte selber einschalten? ich glaube der schaltet sich nur nach einem unvorhergesehen reset automatisch ein! aber warum sollte es in meinem programm ein rest geben?

CowZ
06.11.2007, 13:53
Guck doch einfach auf mikrocontroller.net im gleichen Thread...

Gruß, CowZ
PS: Ich mag diese "ich poste in allen Foren das gleiche"-Taktik nicht.