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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren