www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Problem (Schlaufe)


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
 // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;

MFG
Falk

Autor: Thomas (Gast)
Datum:

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

Autor: Andreas K. (a-k)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.