Forum: Compiler & IDEs UART Problem Atmega2560


von Christian B. (luckyfu)


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.

von STK500-Besitzer (Gast)


Lesenswert?

DIv-8 Fuse?

von Gasd (Gast)


Lesenswert?

Hallo

wie sind denn die Fusebit gesetzt?

von Konrad S. (maybee)


Lesenswert?

Doku:
  10.13.2 CLKPR ­ Clock Prescale Register

von Christian B. (luckyfu)


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!

von Christian B. (luckyfu)


Lesenswert?

Ok, die Fuse war es. Darauf währ ich vermutlich nicht so schnell 
gekommen. Danke nochmal für den Hinweis.

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.