Autor |
Probleme mit Baudrate beim ATmega8535 |
|
|
|
|
BID = 845753
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
|
Hallo Leute,
ich versuche gerade verzweifelt die Baudrate beim USART vom ATmega8538 einzustellen.
Allerdings scheint diese nicht zu stimmen, obwohl ich laut Datenblatt vorgegangen bin. Übrigens funktioniert diese Initialisierung beim ATmega2560 identisch (außer, dass es da mehrere USARTs gibt).
Der µC läuft mit einem 7,3728MHz Quarz. Ich habe auch schon überprüft ob die Frequenz passt (mit LED und delays). Alles OK.
Code Optimierung ist "-Os"
Ich finde partout den Fehler nicht.
Hier mal die Bibliothek für den USART:
serial.h:
Code : |
#ifndef SERIAL_H_
#define SERIAL_H_
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 7372800UL
//Initialize USART
void usart_init(unsigned int baud);
//Check if a character has been received
uint8_t usart_rx_check(void);
//Get received character
unsigned char usart_getc(void);
//Send Character over USART
void usart_putc(unsigned char c);
#endif /* SERIAL_H_ */ |
|
serial.c:
Code : |
#include "serial.h"
unsigned char rxbuf;
uint8_t rxflag = 0;
//USART receive interrupt routine
ISR(USART_RX_vect) {
rxbuf = (unsigned char)UDR;
rxflag = 1;
}
//Initialize USART
void usart_init(unsigned int baud) {
unsigned int ubrr;
ubrr = (F_CPU / 16 / baud) - 1;
//Set baud rate
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
// Enable receiver and transmitter
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
// Set frame format: 8data, 1stop bit
UCSRC = /*(1<<USBS)|*/(3<<UCSZ0);
}
//Check if a character has been received
uint8_t usart_rx_check(void) {
return rxflag;
}
//Get received character
unsigned char usart_getc(void) {
rxflag = 0;
return rxbuf;
}
//Send Character over USART
void usart_putc(unsigned char c) {
while (!(UCSRA & (1<<UDRE)) ); // wait for empty transmit Register
UDR = c; // Put data into buffer, sends the data
} |
|
Vielleicht fällt ja euch ein Fehler auf.
Danke im Voraus!
EDIT:
Hier noch ein Bild der Fuses:
[ Diese Nachricht wurde geändert von: wulf am 31 Aug 2012 13:54 ] |
|
BID = 845754
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Zitat :
| Allerdings scheint diese nicht zu stimmen, | Was heisst "scheint"?
Wenn du kein Scope hast um dir das anzusehen, dann laß ihn doch einfach mal 100.000 Zeichen senden und schau auf die Uhr, wie lange das dauert.
Denke daran, dass jedes Zeichen aus den 7 oder 8 Datenbits, einem Start- und einem Stopbit, sowie evtl. einem Paritybit besteht. |
|
BID = 845755
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
Ich hab mit dem Oszilloskop gemessen.
Allerdings ist das kein Speicheroszi, sondern eon schrottges Analogoszi. Ich hab dann einfach dem µC ununterbrochen ein Zeichen senden lassen und gehofft, dass das Oszi darauf triggern kann. Aufgrund dieser "Schätzung" dürfte die Baudrate bei ca. 1400baud/s liegen.
Aber deine Methode werd ich jetzt auch probieren.
Edit: Vergiss den Blödsinn von oben.
Die Stoppuhr hat ergeben, dass es ca. 290baud/s sind.
[ Diese Nachricht wurde geändert von: wulf am 31 Aug 2012 14:15 ]
|
BID = 845769
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Stoppuhr hat ergeben, dass es ca. 290baud/s sind. |
Das ist doch ok, wenn es 300Bd sein sollen.
5% Abweichung verkraftet der Empfänger.
Falls du jetzt noch Probleme hast, dann denke daran, dass die üblichen RS232-Treiber und -Empfänger invertieren!
Du kannst also nicht einfach die 5V Pegel des µC auf einen fremden RS232 Eingang geben, obwohl das von der Spannungslage her ginge.
|
BID = 845774
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
Hallo Perl,
entschuldige bitte, ich hatte vergessen zu erwähnen, dass da ein MAX232 sich um die PEgelwandlung kümmert (auch dessen Funktion habe ich überprüft).
Es kann eigentlich nur mehr an der Software liegen.
Eingestellt ist 9600Baud/s, nicht 300.
_________________
Simon
IW3BWH
|
BID = 845812
Jornbyte Moderator
Beiträge: 7178
|
Du schreibst in "baud" sollten die 9600 stehen
#define baud 9600
Aber diese Zeile sehe ich nicht. Hast du die nicht?
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 845813
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
Die Baudrate wird der Funktion usart_init(...) übergeben.
Ich hab auch versucht das UBRR direkt mit einer Zahl zu setzen (ohne die Berechnung). Selbes Problem.
_________________
Simon
IW3BWH
|
BID = 845815
Jornbyte Moderator
Beiträge: 7178
|
Hab mal das Datenblatt geöffnet, der 8535 hat nur ein UBRR Register.
Die Zeile UBRRH = (unsigned char)(ubrr>>8) muss weg und UBRRL in UBRR umbenenen.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 845834
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
Hallo Jornbyte,
DAS WARS!!!
Um ins UBSRC zu schreiben muss noch ein Bit gesetzt werden, da es sich die Registeradresse mit dem UBRRH teilt.
VIELEN DANK!!!
Manchmal sieht man eben den Wald vor lauter Bäumen nicht mehr.
Dank auch dir Perl für deine Mühe.
Liebe Grüße
Simon
_________________
Simon
IW3BWH
|