USART am AtMega32 will nicht

Hemi

Aktives Mitglied
Premium Benutzer
30. Nov. 2008
1.103
19
38
Korntal-Münchingen, Germany
Sprachen
  1. ANSI C
  2. C++
  3. PHP
  4. Java
Servus miteinander,

irgendwie kriege ich es mal wieder nicht hin. Ich habe einen AtMega32 und da will der USART nicht so wie ich will.

Hier ist der Code:

Code:
#include <avr/io.h>

#define BaudRate	9600UL
#define F_CPU		14745600UL

int main (void) {

	uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU / (16*BaudRate)-1);

	UBRRH = (uint8_t)(ubrr >> 8);
	UBRRL = (uint8_t)(ubrr);

	UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE);
	// 8N1
	UCSRC = (1 << UPM1)|(1 << UCSZ1)|(1 << UCSZ0);

	unsigned char buffer;

	while (1) {
		while ( !(UCSRA & (1<<RXC)) ) ;
		buffer = UDR;

		while ( !( UCSRA & (1<<UDRE)) );
		UDR = buffer;

	}
	return 0;
}

In meinem Programm stelle ich 9600 8N1 und sende was, es kommt nichts zurück.

Wenn ich dann den Code wie folgt abändere, bekomme ich nur "\0" (hex 0x00) zu sehen:

Code:
#include <avr/io.h>

#define BaudRate	9600UL
#define F_CPU		14745600UL

int main (void) {

	uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU / (16*BaudRate)-1);

	UBRRH = (uint8_t)(ubrr >> 8);
	UBRRL = (uint8_t)(ubrr);

	UCSRB = (1 << RXEN)|(1 << TXEN)|(1 << RXCIE);
	// 8N1
	UCSRC = (1 << UPM1)|(1 << UCSZ1)|(1 << UCSZ0);

	unsigned char buffer = 'a';

	while (1) {
		while ( !( UCSRA & (1<<UDRE)) );
		UDR = buffer;
	}
	return 0;
}

Ich verwende einen externen Quarz mit 14,7456MHz. Die Fusebits sind:
low: FF
high: 99

Danke & Grüsse
Heinrich
 
Hallo Heinrich,

ich habe mir deine USART-Konfiguration nicht komplett angesehen, aber der Fehler liegt wahrscheinlich an folgendem:

Beim ATmega32 teilt sich das Register UCSRC die IO-Adresse mit dem Register UBRRH. Wenn du etwas in das Register UCSRC schreiben möchtest, muss das Bit URSEL gesetzt sein! In deinem Fall müsste es also wie folgt aussehen:

UCSRC = (1<<URSEL)|(1 << UPM1)|(1 << UCSZ1)|(1 << UCSZ0);

Du setzt auch das Bit UPM1 (UPM0 ist nicht gesetzt) damit aktivierst du even parity. Für 8N1 müssen die Bits UPM1 und UPM0 0 sein.

Dann ist mir noch aufgefallen, dass du den ReceiveCompleteInterrupt aktivierst (Register UCSRB, Bit RXCIE), Global Interrupts müssten noch freigegeben werden, die Interruptserviceroutine müsste dann natürlich noch vorhanden sein.

Eventuell wäre es besser, wenn du das Fusebit CKOPT programmierst, dann läuft der Oszillator bei höheren Frequenzen (>8MHz) stabiler.

Probiere erst einmal die beiden oberen Punkte mit URSEL und UPM1, vielleicht geht es dann schon.

Grüße,
Dirk
 
Ansonsten gibts auch mehr oder weniger fertige USART Bibs :)
 
Hallo,

da hat Dirk das mit dem URSEL-Bit ja schon geschrieben ;)
War bei mir auch der erste Fehler beim USART. Allerdings in Assembler.

Gruß
Dino
 
Hallo @Hemi,
schau mal hier:
Übrigens der ATMega8515 arbeitet auch mit der 16-Bit-U(S)ART Suite wie der 32-er.
Die Reihenfolge Highbyte und Lowbyte ist anders als bei der Einrichtung des Stacks....

http://www.avr-praxis.de/forum/showthread.php?t=178

Scroll mal durch.
Eventuell muß zweimal das Ganze programmiert werden, nachdem URSEL gesetzt wurde, das funktioniert dann aber sicher.

Allerdings die ganze Chose in ASM, nicht BASCOM oder C.

PHP:
ldi	temp,	HIGH(bdteiler)	;Baudratengenerator high byte
out	UBRRH,	temp 		;Teiler setzen
ldi	temp,	LOW(bdteiler)	;Baudratengenerator low byte
out	UBRRL,	temp
ldi	temp,	0x80
out	UBRRH,	temp
ldi	temp,	0x86		;Frameset 8N1
out	UCSRC,	temp
ldi	temp,	0x18 		;enablen TX und RX
out	UCSRB,	temp 		;an UART Control-Register
ldi	temp,	HIGH(bdteiler)	;Baudratengenerator high byte
out	UBRRH,	temp 		;muss nochmal reingesetzt werden
ldi	temp,	LOW(bdteiler)	;Baudratengenerator low byte
out        UBRRL,    temp                   ;muss nochmal reingesetzt werden

Viel Spaß !

Gruß von Oskar01
 
Jungs, Ihr seid Klasse, es hat gepasst. Ich habe tatsächlich nur das URSEL vergessen :)

@Dirk: Es sollte 8E1 heissen, nicht 8N1. Die Initialisierung war schon richtig.

Danke & Grüsse
Heinrich
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)