UART Problem Atmega2560

OP #2574247
Lesenswert?

Hallo, ich hab ein absolut seltsames Problem, welches mich nun schon 
eine Woche festhält.
Hardware Atmega2560-16AU mit 14,7456MHz Quarz

Ich will ein Byte per UART versenden, soweit, sogut.

Hierzu die codeschnipsel:
Programmkopf
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/eeprom.h>
4
#include "Display.h"
UART initialisierung
1
void UART_Init(void)
2
{      
3

4
  UCSR0B = 0x98;  //Empfänger aktiv  Sender aktiv  INT RX Complete
5

6
  UCSR0C = 0x06;  //8 Datenbits, 1 Stopbit, keine Parität, asynchron
7

8
  UBRR0 = 0x2F;    //Baudrate
9
}
nun die Senderoutine:
1
char Senderoutine(unsigned char Aktuelles_Datenbyte)
2
{
3
  while ( !(UCSR0A & (1<<UDRE0)) )    //Warten auf leeren Sendepuffer
4
    ;
5
  if((PINE & 0x04) == 0x04)         //Prüfen, ob CTS vom Display aktiviert ist, wenn ja: Fehlermeldung
6
    return 1;
7
  else
8
  {
9
    UDR0 = Aktuelles_Datenbyte;      //Senden des Datenbytes
10
    return 0;
11
  }
12
}

Ich hab mit dem Oszi gemessen, daß die 14,7456MHz auch schwingen, das 
tun sie. Der Quarz ist also richtig bestückt und macht auch, was er 
soll.
Außerdem hab ich einen Debugger dran der mir Zeigt, daß alles korrekt 
abgearbeitet wird.

Vor den Versuchen hab ich die Baudrate vom Präprozessor berechnen lassen 
mit dem gleichen Ergebnis, ich wollte jedoch eine weitere Fehlerquelle 
ausschließen und hab deshalb die Hex Werte direkt eingetragen.

Das Problem ist nun, daß die Baudrate jenseits von gut und Böse ist.
Mit Jenseits von gut und Böse meine ich bei Obiger Einstellung dauert 
ein Bit in der Übertragung ca. 416µs
(normal sind bei der Baudrate ca 54µs...

Ich hab hier 2 Boards mit dem gleichen Aufbau und gleichem Verhalten. 
das macht mich komplett verrückt.
Es ändert sich auch nicht wen ich den Debugger nicht dran hab.

Auch scheint sich das Problem mit den Timern fortzusetzen.
Um ca. jede Sekunde einen Interrupt ausgelöst zu bekommen brauch ich 
folgende Einstellung:
1
.
2
.
3
.
4
  TCCR5A = 0;              
5
  TCCR5B = (1<<WGM53) | (1<<WGM52);  //CTC Mode
6
  ICR5 = 1800;        //Reloadwert für ca. 1sec
7
  TIMSK5 = (1<<OCIE5A);
8
}

Entweder hab ich momentan einen kompletten Denkfehler oder ich hab ein 
mir absolut unbekanntes Problem. Allerdings währs schon gut, wenn mir 
jmd helfen könnte.
OP #2574851
Lesenswert?

Danke für den Hinweis! ich werd das mir heut Nachmittag mal ansehen. Hab 
an den Fuses nur den Clock auf external 8+MHz 65ms Startuptime 
gestellt, alle anderen Fuses sind Werkseinstellung (hoffe ich). Damit 
sollte also laut Datenblatt der Teiler von 8 einsetzen... ok, das 
erklärt so einiges. Danke für den Hinweis!

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