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.