PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Senden eines Zeichen Per USART (ATMEGA32)



denk
06.02.2009, 13:10
Hallo Leute,

ich brauche Ihre Hilfe.
Und zwar habe ich mir ein Atmel Evaluationboerd Ver. 2.0 von Pollin gekauft.
Ich habe ein einfaches Programm geschrieben, in dem ich ein Zeichen Per-USART an Hyperterminal senden möchte.
Aber leider ich bekomme an meinem Hyperterminal immer das ungewölte Zeichen.
mein Programm sieht so aus:


#include <stdio.h>
#include <avr/io.h>
#include <inttypes.h>
#include <avr/wdt.h>


void send (int data)
{
while (!(UCSRA & 32) );
UDR=data;
}



int main( void)
{


char z= 'A';
DDRD = 0x20;
UBRRL = 51;
UCSRB = 8;
UCSRC = 131;

while (1) {

if ( PIND & 0x04 ){
PORTD = 0x20;



while (1)
{
wdt_reset ();

send(z);
}

}

}



return 0;

}

Die Einstellung von Hyperterminal war in Ordnung.

Als Ergebnis bekomme ich an meinem Hyperterminal das folgende Bild:

€€€€€€€€€€€€€€€€€€€€€€€€€€€€
€€€€€€€€€€€€€€€€€€€€€€€€€€€€

Was meint Ihr ? Oder was war falsch in meinem Programm geschrieben?
Ich danke euch im voraus.....


[/flipv]

McJenso
06.02.2009, 14:04
Hallo,

das Problem gehört an sich ins C Forum. Den Code bitte in [ c o d e ] quellcode [ / c o d e ] einfassen. Dann bleibt die Formatierung erhalten.
Komische Zeichen sind eigentlich immer ein Zeichen für ein Baudratenproblem. Controllertakt stimmt nicht oder UBRR wurde falsch berechnet. Was du da in Dezimalform in die Register schreibst, bin ich zu faul zum auseinander tüfteln. Die Schreibweise wie in diesem Programm (https://www.roboternetz.de/wissen/index.php/UART_mit_avr-gcc#C-Datei) macht eine Fehlersuche deutlich einfacher.

1.Für solche Tests immer den Watchdog aus!
2.Takteinstellung in den Fusebits und in den Projekteinstellungen prüfen.
3. UBRR Berechnung kontrollieren.

Wenn es dann immer noch nicht geht, die Einstellungen aus Hyperterminal mit angeben, Taktquelle und Frequenz nennen.
Wir können sonst nur Rätsel raten.

Gruß

Jens

Hubert.G
06.02.2009, 14:09
Welchen Kontroller
Taktfrequenz, Baudrate
Was hast du am Terminal eingestellt
Wenn du schreiben würdest UCSRB= (1<<RXCIE); wäre das besser lesbar, 131 für UCSRC muss ich mir erst raussuchen.

denk
06.02.2009, 15:30
Hallo Hubert,

Danke für deine Antwort.

Der Kontroller heisst ATMEGA32L8PU.

Meine Einstellungen am Hyperterminal waren wie folgt:
Baudrate: 9600
Datenbits:8
Parität: Keine
Stoppbits:1

für das Programm sieht so aus:
#include <stdio.h>
#include <avr/io.h>
#include <inttypes.h>
#include <avr/wdt.h>


void send (int data)
{
while (!(UCSRA & 32) );
UDR=data;
}



int main( void)
{


char z= 'A';
DDRD = 0x20;
UBRRL = 51;
UCSRB |= (1<<TXEN);
UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);

while (1) {

if ( PIND & 0x04 ){
PORTD = 0x20; //Hier habe ich eine Led angechaltet.


while (1)
{
wdt_reset ();

send(z);
}

}

}



return 0;

}


danke.....

denk
06.02.2009, 15:32
der Quarz hat 8Mhz.....

denk
06.02.2009, 15:32
habe ich vergessen....
der Quatz hat 8Mhz.....

Hubert.G
06.02.2009, 15:55
Hast du es mit der neuen Schreibweise noch mal probiert?
UCSRC =131; ist nämlich nicht das gleiche wie UCSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1); das ergibt 134.

denk
06.02.2009, 16:17
habe ich gerade in meinem Programm die Änderung aufgenommen.
Aber es hat nicht geklappt...

Hubert.G
06.02.2009, 17:05
Mal auf die schnelle mit meinem STK und einen Mega16 getestet. Funktioniert mit HyperTerminal einwandfrei. Es kommen A.
Bist du sicher das nicht der Interne Takt läuft? Bei mir geht es nur mit Quarz, mit internem Takt kommt Unsinn.

denk
06.02.2009, 20:59
Danke für deine Idee...Ich habe nur den Wert von UBRRL geändert und habe ich eine andere Buchstabe am Hyperterminla bekommen. Das heisst etwas stimmt nicht. Ich muss den Externen Quarz auswählen...
Wie das geht werde ich mal im Datasheet anschauen...oder was meinst du??

Hubert.G
07.02.2009, 10:26
Am besten wäre ein Baudraten-Quarz, ich habe einen 11,0592 MHz drinnen. Es geht aber mit 8MHz auch noch.
In den Fuses auf Ext. Crystall/Resonator umstellen und den Quarz lt. Datenblatt anschalten.