| 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: 7306
  | 
 
 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: 7306
  | 
 
 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 
  |