PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Baudrate für UART angeben.



crabtack
28.01.2011, 09:25
Hallo,
Wie kann ich für einen Atmega 32 die Baudrate über UBBR angeben?
UBBR = 6; geht nicht.

mfg
crabtack

PicNick
28.01.2011, 10:43
Da gibt's ellenlange Tabellen im DataShit für den 32-er.
Hast du da schon mal einen Blick drauf geworfen ?

oberallgeier
28.01.2011, 10:59
... UBBR = 6; geht nicht ...Geht nicht, gibts nicht. ABER das gibt z.B. irgendetwas bei 178 kBd *ggggg*. Siehe:

............http://oberallgeier.ob.funpic.de/baud-01.gif

Und zu Roberts Rat kann ich ausser "klar, was sonst" nur (wie schon sooo oft) grinsend sagen: Controller programmieren ohne Datenblatt ist eines der letzten Abenteuer unserer Tage.

Jaecko
28.01.2011, 10:59
Was genau geht an UBRR = 6 nicht?
Also welcher Fehler tritt auf?
Ansonsten meine ich, dass man die beiden Bytes des Registers getrennt schreiben muss bzw. sollte.

So berechne ich die Baudrate immer, hat bisher für jeden AVR gepasst:


uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * baudrate) - 1);
UBBRH = (uint8_t) (ubrr >> 8);
UBBRL = (uint8_t) (ubrr);

crabtack
06.02.2011, 22:43
Hallo, dnake erstmal.
Es lag daran, dass es getrennt geschrieben werden muss.
jetzt habe ich es mal mit makros (wenn sie denn so heißen) versucht.
das klappt auch aleees aber es gibt ein problem.
Das Zeichen wird nicht gesendet.
die kontroll LED leuchtet auch nicht.
Was kann da falsch sein?


#include <avr/io.h>
#include <stdlib.h>

#ifndef F_CPU
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1000000"
#define F_CPU 1000000UL // Systemtakt in Hz - Definition als unsigned long beachten

#endif
#define BAUD 9000UL // Baudrate
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error die abudratenerrror ist zu stark;
#endif





void main (void)
{
DDRC = 0xff; //nur für LED

UCSRB |= (1<<TXEN); // UART TX einschalten
UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8N1

UBRRH = UBRR_VAL >> 8;
UBRRL = UBRR_VAL & 0xFF;
while (1)
{
if (!(UCSRA & (1<<UDRE)))
{

PORTC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4);//Pins mit LED

UDR = 'x';
}


}
}

mfg
Olaf

crabtack
05.04.2011, 17:11
Hallo,
Weiß keiner, was da Falsch ist?

Gruß
Olaf

sternst
05.04.2011, 19:08
#define BAUD 9000UL // Baudrate 9000 Baud? Ich glaube kaum, dass du diese Baudrate wirklich haben willst.


if (!(UCSRA & (1<<UDRE)))
{
PORTC = (1 << DDC0) | (1 << DDC1) | (1 << DDC2) | (1 << DDC3) | (1 << DDC4);//Pins mit LED
UDR = 'x';
}Was hier steht, ist: "wenn KEIN Platz in UDR ist, dann schreibe 'x' hinein". Macht irgendwie keinen Sinn, oder?

crabtack
06.04.2011, 09:45
Hallo Stefan,
danke erstmal jetzt leuchtet die LED.
Also bei if (!(UCSRA & (0<<UDRE)))
Oh ja, das Ausrufezeichen Grummel.

Jedenfalls das Zeichen kommt noch immer Nicht bei hterm an.
Wie du schon sagst wird es vermutlich an der Baudrate liegen.
Aber welche wäre die Richtige?
Aus den ganzen Tabellen im Netz werde ich einfach nicht schlau.
Ich habe eienn Atmega mit Internem Oszi 1mhz.

mfg
Olaf

Martin.
06.04.2011, 09:59
Für die serielle Schnittstelle solltest du auf jeden Fall einen externen Quarz hernehmen. Du kannst ja mal bei hterm show errors einschalten. Wenn da Fehler angezeigt werden, weist du schonmal, dass Signale ankommen. Sollte da nichts angezeigt werden, dann solltest du die Konfiguration nochmal überprüfen und die hardware. Wenn was angezeigt wird, dann würde ich einen externen Quarz probieren.

Sollte auch das nicht klappen, kannst du ja mal zum Test einen erprobten Quellcode benutzen: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART

Der funktioniert sicherlich.

crabtack
06.04.2011, 10:03
Hallo Martin,
Ich bekomme leider keine Fehler angezeigt.
Den code benutze ich doch in leicht veränderter Version.

Gruß
Olaf