Forum: Mikrocontroller und Digitale Elektronik USART Problem (Schlaufe)


von Thomas (Gast)


Lesenswert?

habe folgendes programm geschrieben zur ausgabe einzelner zeichen per 
USART!
das problem liegt nun darin, dass die zeichen nicht nur einmal 
ausgegebne werden, sondern 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???? vieln dank für eure antworten!

#include <avr/io.h>
#include <avr/interrupt.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;
}

von Falk B. (falk)


Lesenswert?

@ Thomas (Gast)

>das problem liegt nun darin, dass die zeichen nicht nur einmal
>ausgegebne werden, sondern 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???? vieln dank für eure antworten!

Der Watchdog bellt. Versuch mal das als erste Zeile im Programm.
1
 // Stop watchdog timer to prevent time out reset
2
  WDTCTL = WDTPW + WDTHOLD;

MFG
Falk

von Thomas (Gast)


Lesenswert?

den watchdog habe ich aber gar nicht programmiert! kann das sein, dass 
der sich manchmal automatisch einschaltet?

von Andreas K. (a-k)


Lesenswert?

Man kann den WDT auch per Fuse einschalten. Und man kann Fuses 
versehentlich verkehrt herum programmieren.

von Falk B. (falk)


Lesenswert?

@ Thomas (Gast)

>den watchdog habe ich aber gar nicht programmiert! kann das sein, dass
>der sich manchmal automatisch einschaltet?

Nöö, aber der ist automatisch nach dem Reset aktiv.

MFg
Falk

von Thomas (Gast)


Lesenswert?

also das heisst dann, dass alle normal läuft und plötzlich aus 
irgendeinem grund ein reset passiert? und nach dem reset ist der 
watchdog aktiv und resetet mein uC weiter?

von Falk B. (falk)


Lesenswert?

@ Thomas (Gast)

>also das heisst dann, dass alle normal läuft und plötzlich aus
>irgendeinem grund ein reset passiert?

Nicht aus "irgendweinem" Grund. Der Watchdog ist nach dem Anlegend er 
Betriebsspannung (POR, Power On Reset) aktiv. Wenn er nach ein paar 
hundert Milliselkunden einen Reset auslöst, ist er immer noch aktiv.

> und nach dem reset ist der
>watchdog aktiv und resetet mein uC weiter?

Genau.

MFG
Falk

von Thomas (Gast)


Lesenswert?

ja aber wieso sollte der schon von anfang an aktiv sein?!?! habe den ja 
gar nicht eingeschaltet!

von Falk B. (falk)


Lesenswert?

@ Thomas (Gast)

>ja aber wieso sollte der schon von anfang an aktiv sein?!?! habe den ja
>gar nicht eingeschaltet!

Hängst du auch in ner Schleife fest? Lies mal den Thread un denk drüber 
nach.

MFG
Falk

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.