Baudratenquarz angeschlossen UART funktioniert nicht mehr

OP #2755735
Lesenswert?
• ▲
▼
Hallo

Für ein projekt versuche ich gerade eine verbindung zwischen pc und 
mikrocontroller über die serielle schnittstelle herzustellen. Ich 
besitze einen atmega32 und habe vorerst mit dem internen takt von 1 MHz 
gearbeitet. Da man mit diesem Takt keine gute verbindnung herstellen 
kann habe ich mir einen quarz mit 1,8432 MHz zugelegt. Seitdem ich 
diesen angeschlossen habe funktioniert die UART verbindung jedoch nicht 
mehr. Ich glaube nicht, dass ich die fuse bits falsch gesetzt habe, da 
ich den mikrocontroller problemlos programmieren kann und andere 
funktionen, wie das einschalten von LEDs noch immer funktionieren. 
gesetzt habe ich jedenfalls lfuse 0xfd und hfuse 0x99. Verwendet wird 
der quarz offensichtlich auch, denn sobald ich ihn entferne läuft nichts 
mehr.

Softwaremäßig habe ich die verbinung mit Realterm und einer selbst 
geschriebenen c# anwendung getestet. bei beiden konnte ich zuvor zeichen 
einlesen und schicken, jedoch kamen aufgrund der falschen frequenz immer 
wieder falsche zeichen an. beim virtuellen com port, beim 
mikrocontroller und bei den anwendungen habe ich jeweils folgende 
einstellungen vorgenommen: 8 Datenbits, 1 Stopbit, Baudrate: 9600. Beim 
mikrocontroller erhalte ich einen UBBR wert von 11.

Ich hoffe ich hab den schaltplan halbwegs richtig aufgezeichnet; 
vielleicht habe ich ja etwas falsch verbunden oder übersehen, was mir 
nicht auffällt. beim mx232 sind pin 13 und 14 bewusst vertauscht, da ich 
nur ein nullmodem kabel besitze.

Das Programm auf dem mikrocontroller soll einfach ein zeichen empfangen 
und das selbe wider zurücksenden:
#include <avr/io.h>
#include <inttypes.h>

#define F_CPU 1843200UL
#define USART_BAUDRATE 9600UL
#define UBBR_VALUE F_CPU/(16*USART_BAUDRATE)-1 
//(F_CPU+8*USART_BAUDRATE)/(16*USART_BAUDRATE)-1

int USARTInit()
{
   //Baudrate definieren
   UBRRL = UBBR_VALUE;
   UBRRH = (UBBR_VALUE>8);
   // 8bit 1 Stopbit
   UCSRC=(1<<URSEL)|(3<<UCSZ0);
   //Sender und Empfänger aktivieren
   UCSRB=(1<<RXEN)|(1<<TXEN);
}

// Zeichen von PC empfangen
char USARTReadChar() // gibt char zurück
{
   while(!(UCSRA & (1<<RXC))) // warten bis RX bereit
   {
   }
   return UDR; // char zurückgeben
}

// Zeichen an PC schicken
void USARTWriteChar(char data) // Übergabeparameter char
{
   while(!(UCSRA & (1<<UDRE)))// warten bis TX bereit
   {
   }
   UDR=data;
}

void main()
{
   DDRB |= (1<<PORTB0) | (1<<PORTB1); // B0 & B1 als outputs festlegen
   PORTB |= (1 << PINB0) | (1 << PINB1); // LEDs einschalten
   char data;
   USARTInit(); // USART initialisieren

   while(1)
   {
      data=USARTReadChar();
      USARTWriteChar(data);
   }
}


Ich hoffe, dass mir jemand weiterhelfen kann...
Mfg Martin
Angehängte Dateien:

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.