PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Problem AT90USB162



jwsk
20.11.2011, 12:46
Hallöle,

habe inzwischen den 162er am laufen,
aber immernoch leichte Verständnisprobleme....
...ich initialisiere UART wie folgt:
Sollten 8 Datenbit und 2 Stoppbits sein, stimmt das?

void USART_Init()
{

UBRR1H = 0;
UBRR1L = 103; //9600 BAUD

UCSR1B = (1<<RXEN1)|(1<<TXEN1);

UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}

und wie lautet die Initialisierung für
6 Daten und 1 Stoppbits
bztw. 6 Daten und 2 Stoppbits?

Die Schnittstelle sendet, kommt aber nur Gedöns an

021aet04
20.11.2011, 13:10
Die benötigten Register stehen im DB (http://www.atmel.com/dyn/resources/prod_documents/doc7707.pdf) auf S168. Tabelle 17-6 ist für Stoppbits (USBS1=0 => 1 Stoppbit, USBS1=1 => 2 Stoppbits).
Damit du die 6 Datenbits hast musst du "UCSR1C = (1<<UCSZ10);" schreiben (Stoppbit nicht vergessen, das ist im gleichen Register.

Man sollte auch nicht "(3<<UCSZ10)" schreiben sondern "(1<<UCSZ10) | (1<<UCSZ11)". Das ist aber nur meine Meinung. Der Grund ist das man bei den Registern sofort erkennt was gesetzt ist und was nicht.

Ob das mit der Baud Rate passt weiß ich nicht. Wenn du keine vernünftigen Daten bekommst könnte es falsch eingestellt sein. Achte auch auf die Tabellen mit den Abweichungen bei unterschiedlichen Taktfrequenzen.

Eventuell passt auch die Taktfrequenz nicht ganz. Ich hatte vor Kurzem das Problem das ich einen Atmega88 mittels FTDI Chip (USB/UART Wandler) auslesen wollte. Wenn ich den internen 8MHz Takt mit 1/8 Teiler (also 1MHz Taktfrequenz) auslesen wollte hat es funktioniert. Habe ich es allerdings mit dem Takt vom RFM12 Board (ist ebenfalls auf der Platine) versucht kam nur Schrott am Terminal an.

MfG Hannes

jwsk
20.11.2011, 13:14
also mit der oben gelisteten config kann ich alles empfangen,
baud rate passt also :)

danke für die hilfe, werde sofort probieren :)

danke danke

jwsk
20.11.2011, 13:25
danke fürs retten,
klappt.

hatte wohl einen :paul:

jwsk
20.11.2011, 13:38
wie viele zeichen kann ich in den Puffer legen?

021aet04
20.11.2011, 14:32
Du kannst 6Bit in den Puffer geben. Das sind dann 2^6=64Zeichen (0-63).
MfG Hannes

jwsk
20.11.2011, 15:29
okay, udn wenn ich 8 bit einstelle kann ich 8 bit im puffer ablegen?

wie checke ich denn, welche stopp / datenbit kombination mein gegenüber eingestellt hat?

jwsk
20.11.2011, 15:43
das hier ist jetzt die config, die ich nutze:

void USART_Init()
{
UBRR1H = 0;
UBRR1L = 103; //9600 BAUD
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
UCSR1C = (1<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10);
// 6 Datenbits und 2 Stopbits!
}

void USART_Transmit( unsigned char data )
{
while ( !( UCSR1A & (1<<UDRE1)) )
;
UDR1 = data;
}

unsigned char USART_Receive( void )
{
while ( !(UCSR1A & (1<<RXC1)) )
;
return UDR1;
}

wie baue ich denn hier jetzt die interrupt geschichte ein?
macht das überhaupt sinn?
ist dies erforderlich um empfangen zu können während man
selbst sendet oder wie?

021aet04
21.11.2011, 16:08
Wenn man etwas Interrupt steuert wird das nur ausgeführt wenn es nötig ist (wenn ein Interrupt eintritt). Du kannst dann im Hauptprogramm z.B. Berechnungen und ähnliche Dinge tun.
So wie es aussieht hast du fast keine Erfahrung. Du solltest ein Tutorial durchlesen wie z.B. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial. Dort steht das wichtigste drinnen. Wie du etwas einstellst (z.B. Interrupt aktivieren) steht alles im Datenblatt des jeweiligen Controllers. Die einzelnen Register die du z.B. beim UART benötigst sind nur UCSR1A bis UCSR1C (für die Einstellungen). Wie du Interrupts verwendest steht im Tutorial. In diesem Forum wird zwar geholfen, es ist aber Eigeninitiative gefragt (nicht Böse sehen).

MfG Hannes

jwsk
21.11.2011, 19:07
Kein Thema,

meine Fragen wirken vielleicht ahnungslos,
aber ich konnte schon mal mehr, habe dann
aber zwei Jahre oder länger nichts mehr in die
Richtung gemacht.....