PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit UART und Baudrate



Rodney
25.07.2004, 15:51
Hallo Leute,

ich betreibe meinen AtMega16 an einem 4Mhz Quarzoszillator und wollte nun das ganze mal über RS232 mit dem PC verbinden.

Jetzt habe ich schon oft gelesen, dass mit einer so geraden Mhz Zahl die Übertragung sehr schlecht funktioniert.

Am PC kommen bei mir auch nur irgendwelche Hyroglyphen (wahrscheinlcih falsch geschrieben) an.

Ich verwende zur Zeit 9600 Baud. Kann es sein, dass damit die Übertragung einfach nicht funktioniert?

BTW: Wenn man den Quarzoszillator an XTAL1 anschließt stellt sich der Controller doch automatisch von intern auf externe Taktfrequenz um oder?

-MfG, Rodney

tobimc
25.07.2004, 16:03
Hi Rodney.

Also ich habe bei einer Atmel-Atmel UART Verbindung keine Probleme.
Den Oszillator musst du aber vorher in den Fuse-bits umschalten.

Der Mega16 ist standardmäßig von Atmel auf internen Oszillator eingestelt.
Mit dem Internen R/C Glied lässt sich, nach avatar, keine Baudrate treffen.

Die UART Geschichte hat bei mir auch erst nicht funktioniert, aber als ich auf den externen Quarz umgeschaltet habe, gings..

Kannst du mir bei meinen Auslese-Problemen helfen?

https://www.roboternetz.de/phpBB2/viewtopic.php?t=2572

Hoffe, ich konnte dir helfen,

liebe Grüße, Tobi

Rodney
25.07.2004, 16:23
Hi Rodney.

Also ich habe bei einer Atmel-Atmel UART Verbindung keine Probleme.
Den Oszillator musst du aber vorher in den Fuse-bits umschalten.

Der Mega16 ist standardmäßig von Atmel auf internen Oszillator eingestelt.
Mit dem Internen R/C Glied lässt sich, nach avatar, keine Baudrate treffen.

Die UART Geschichte hat bei mir auch erst nicht funktioniert, aber als ich auf den externen Quarz umgeschaltet habe, gings..

Kannst du mir bei meinen Auslese-Problemen helfen?

https://www.roboternetz.de/phpBB2/viewtopic.php?t=2572

Hoffe, ich konnte dir helfen,

liebe Grüße, Tobisorry ich kenne mich mit Basecom leider nicht aus, ich progge in C.

Ich hab schon von mehreren Leuten gelesen die bei dem Versuch den Takt auf extern umzustellen, sich ihren Controller unbrauchbar gemacht haben.

Was muss ich genau umstellen? Ich arbeite mit PonyProg 2.05a

tobimc
25.07.2004, 18:39
Hi Rodney!

naja... egal.

Du musst beim umstelen der Fusebits darauf achten,
Dass du a) nicht die programming-sperre aktivierst,
und b) beim Umstellen auf den externen Taktgenerator,
dass der auch funktioniert, da du dass sonst nicht mehr rückgängig machen kannst. Ohne Takt, kein Prozessor.

Wenn der Takt funktioniert, ist das kein Problem.
Bei mir gab es da noch nie Probleme.

Liebe Grüße, Tobi

Rodney
25.07.2004, 19:04
ok ich hab das ganze jetzt umgestellt, hab grad noch nen paar Probleme mit der Stromversorgung...

Ich glaub ich probiere morgen mal weiter und versuch das UART zum laufen zu kriegen.

MfG, Rodney

Frank
25.07.2004, 21:41
Wie bei Mega 16 die Fusebits bei PonyProg aussehen sollten sieht man hier

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=152

Rodney
25.07.2004, 22:38
ja der Controller an sich funktioniert ja, nur die Anschlussklemmen von Reichelt kann man sowas von in die Tonne kloppen...

Nach der Zeit bilden sich kalte Lötstellen und man muss sie wieder neu anlöten...

Rodney
26.07.2004, 23:08
so jetzt stehe ich vor einem weiteren Prob.
Das Senden vom Controller aus funktioniert einwandfrei.

Allerdings hab ich jetzt so meine Probleme beim Empfangen von Daten:



#define CPU_Frequency 4000000 // 4Mhz-Quarz
#define UART_BAUD_RATE 4800 // 9600 Baud


#include <avr/io.h>
#include <stdarg.h>
#include <ctype.h>
#include <string.h>
#include <avr/interrupt.h>

#include "bitdef.h"
typedef unsigned char BYTE;
typedef unsigned short WORD;

//************************************************** ************************************************** ********************

void warten(int t) //ermöglicht Pausen
{
int h;
for (;t>0;t--)
{
for (h=700;h>0;h--) {}
}
return;
}

void uart_init()
{
outp( (CPU_Frequency / (UART_BAUD_RATE*16L))-1 , UBRRL );
outp( 0, UBRRH );
outp( (1 << URSEL) | (3 << UCSZ0), UCSRC);
outp( (1 << RXCIE) | (1 << TXEN) | (1 << RXEN), UCSRB);

sei();
}


void uart_nachricht(char* senden) {

for (; *senden != '\0'; senden++) {
loop_until_bit_is_set(UCSRA, UDRE);
UDR=*senden;
}
loop_until_bit_is_set(UCSRA, UDRE);
UDR = 13;
}

Signal (USART_Receive_Complete) {
uart_nachricht("Hab was emfangen!");
}

int main()
{
outp (0xFF, DDRA);
uart_init();
uart_nachricht("Initalisierung...");

for (;;) {
warten(500);
PORTA = B00000101;
warten(500);
PORTA = B00000010;
}

}


An Pin 0,1,2 sind Leuchtdioden angeschlossen die wie vorgesehn schön abwechselnd blinken. Wenn nun allerdings der Interrupt USART_Receive_Complete ausgelöst wird schmiert das ganze Programm ab, die Led´s blinken nicht mehr und die NAchricht "Hab was empfangen!" wird auch nicht übertragen.

- MfG Rodney

Rodney
28.07.2004, 09:14
hat niemand eine Erklärung :-(

avatar
28.07.2004, 10:31
Die Baudrate wird ja durch herunterteilen der Quarzfrequenz erzeugt.
Deswegen würde ich vorschlagen, mal einen anderen Quarz auszuprobieren, beispielsweise

4915200
6144000
9830400

Diese Frequenzen lassen sich jweils leicht auf 9600 herunter teilen indem man sie mehrfach halbiert. Wie hoch ist denn die maximale Taktfrequenz für deinen Prozessor ?

Wenn die Baudrate nicht genau stimmt, wird eine Übertragung zum PC nicht möglich sein.

Rodney
28.07.2004, 10:34
Max Frequenz ist 16Mhz

Ich werde mir bei der nächsten Bestellung einen neuen holen, aber so müsste es doch jetzt auch klappen oder?

Senden funzt ja auch...
Er schmiert ja einfach ab...

avatar
28.07.2004, 10:51
Vielleicht solltest du das SENDEN nicht direkt in der Interruptroutine machen.

Probier' doch mal, innerhalb der Interruptroutine nur einen Schalter zu setzen.
Den kannst du im Hauptprogramm abfragen, von dort die Senderoutine aufrufen und den Schalter wieder zurück setzen.

Rodney
28.07.2004, 12:44
ok das werde ich morgen mal probieren, bin grade nicht zuhause.

MfG Rodney