Hallo Zusammen,
meine erstes Uart klappt (arbeite ich seit heute Mittag dran...),
es werden im Hyperterminal Zeichen angezeigt, nur leider nicht
die richtigen.
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
#include<stdio.h>
4
#include<stdint.h>
5
#include<util/delay.h>
6
7
#define F_CPU 16000000L
8
#define BAUDRATE 57600
9
10
intput_char(charc){
11
loop_until_bit_is_set(UCSR0A,UDRE);
12
UDR0=c;
13
return(0);
14
}
15
16
intmain(void){
17
18
// Uart Initalisieren
19
UCSR0B=(1<<TXEN)|(1<<RXEN);
20
UCSR0A|=(1<<U2X);// doppeltes Tempo
21
// Interrupt freigeben
22
UCSR0B|=(1<<RXCIE);
23
UCSR0B|=(1<<TXCIE);
24
// Teiler setzen
25
UBRR0L=(F_CPU/(BAUDRATE*8L)-1);
26
27
sei();
28
29
while(1){
30
put_char(2);
31
_delay_ms(150);
32
};
33
}
ob ich nun bei put_char 2 oder auch "x" eingebe,
ständig sieht das Ergebnis so aus. (Siehe Anhang.)
Ich habe eine Atmega 64 16AU mit einem 16mHz Oszillator.
Sobald ich die Verzögerung (_delay_ms(150);) verändere
ändert sich auch das Tempo der der merkwürdigen Zeichen.
Verbuch ich schon unter Erfolge :-)
Den Quellcode habe ich weitgehend aus einem Beispiel
für einen Atmega 64 / 20Mhz übernommen.
Über Hilfe würde ich mich sehr freuen.
Ein Ähnliches Problem hab ich im Forum leider nicht
finden könnten.
Danke & Viele Grüße aus Neuss
Askan
Hm als erstes würde ich an deiner Stelle ein anderes Terminalprogram
nehmen. Das Windowseigene ist gelinde gesagt schrott (finde ich) und
dann versuch es erstmal mit einer niedrigeren Baudrate. Meine ersten
Versuche waren bei 9600 und die 57600 kommen mir etwas hoch vor.
Hast du schonmal geschaut wie der Error bei deiner Baudrate und dem Takt
ist? Du weißt sicherlich, dass nicht jeder Takt mit jeder Baudrate
funktioniert.
Gruß ErgoProxy
> ob ich nun bei put_char 2 oder auch "x" eingebe,
Das Zeichen mit dem Code 2 ist ein Steuerzeichen, da können je nach
Terminalprogramm sehr seltsame Dinge passieren.
"x" ist eine Stringkonstante, da sollte der Compiler mindestens eine
Warnung aussprechen.
Hast du es schon mit
1
put-char('2');
versucht? Wenn dann immer noch Müll angezeigt wird, stimmt etwas mit den
Schnittstellenparametern (Baudrate, Anzahl Datenbits usw.) nicht. Also
noch einmal nachrechnen und mit den Einstellungen in Hyperterminal
vergleichen.
naja, so schlecht ist Hyperterminal nun auch wieder nicht (auch wenn
einige wirklich wichtige Sachen fehlen).
Versucht mal, mit Bray-Terminal (war bis jetzt immer mein Favorit) ein
paar grössere Blöcke mit 115k zu übertragen :-(
Wenn man sich fuer die Zeichen interessiert, sollte man sich die daten
als Hex ausgeben lassen, so kann man allenfalls eine Gesetzmaessigkeit
erkennen.
Hallo,
super vielen Dank für die Hilfe.
Mit kleiner Baudrate (9600) und '2' klappt es, es werden nur zweien
angezeigt.
Klasse. Ich versuch dann man sowas wie printf einzubauen.
Juhuuu :)
Askan
Hallo,
dein Hyperterminal ist auf automatische Erkennung der Verbindung
eingestellt. Das kann nicht funktionieren.
Verstell folgendes:
Datei->Eigenschaften. Ein Dialogfenster geht auf, wähle beim
Dropdownmenu "Verbinden über" deinen ComPort aus (vermutlich COM1). Dann
auf "Konfigurieren" drücken. Ein weiteres Fenster geht auf. Stell hier
"Bits pro Sekunde" auf 57600, "Datenbits" auf 8, "Parität" keine,
"Stoppbits" 1 und "Flusssteuerung" auf kein.
Dann sollte es funktionieren.
Und ich kann nur wiederholen, was bereits gesagt wurde, nimm ein anderes
Terminal, wenns besser gehn soll. Es eignet sich Putty für flüssige
Terminalsitzungen sehr gut. Zum Debuggen empfehle ich RealTerm, da kann
man alles mögliche zusätzlich einstellen und die Daten in allen
möglichen Darstellungen anzeigen lassen und auch senden.
Viel Erfolg,
Peter
Wenn jetzt Zweien angezeigt werden, ist das auch falsch.
put_char(2); sendet das ASCII Zeichen mit der Nummer 2, das ist keine
ASCII 2.
Eine Zwei sendet man so:
put_char('2'); //Hochkommas, damit es ein ASCII-Zeichen ist.
Peter
Hallo,
vielen Dank für die Hilfe. Ich habe es jetzt mal mit RealTerm probiert.
und so sieht das aus.
Übersetze ich die Ausgegebenen Zeichen kommt hier nonstop in in HEX
1
E000E0E000E0E000E0E000E0E000E0E0
2
E000E0E000E0E000E0E000E0E000E0E0
3
E000E0E000E0E000E0E000E0E000E0E0
4
E000E0E000E0E000E0E000E0E000E0E0
5
E000E0E000E0E000E0E000E0E000E0E0
Was mich irritiert, rechts sieht man bei RealTerm den Status,
hier leuchtet nicht der TXD(3) Pin, aber der Ring(9) Pin leuchtet ab
und zu auf.
Nicht das ich da einen Hardware Fehler habe...
Danke & Viele Grüße aus Neuss
Askan
Irre ich mich oder steht TXD für senden - du empfängst doch nur nonstop.
Warum sollte da TXD leuchten? Das mit dem Ring hm keine Ahnung wie
Sauber ist dein Anschluss an den PC den gelötet ^^
Empfängst du denn jetzt genau das, was du sendest oder immernoch nur
Zeichenmüll?
Gruß ErgoProxy
Wenn ich die Einstellung auf den Bildern richtig erkenne, dann hast du
dort eine Baudrate von 57600 eingestellt. Ich dachte mit 9600 ging es -
Warum hast du es dann wieder auf die 57600 abgeändert?
Könntest du nochmal deinen aktuellen Quellcode posten + die aktuellen
Einstellungen bei deinem Terminalprogram?
Gruß ErgoProxy
Hi,
UCSR0A |= (1<<U2X); // doppeltes Tempo
durch setzen dieses Bits sendest du nicht mit 9600, sondern mit 19200
Baud.
Ergo Zeile löschen, oder 19200 Baud im Terminal einstellen.
Gruß