PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Input , Wait , Print... Warum?



demmy
17.05.2012, 21:02
Hallo zusammen,

ich hab mal eine Verständnissfrage. Ich will Daten über den UART empfangen und direkt danach senden. Warum funtioniert es nur, wenn ich zwischen den Befehl Input und Print ein Wait setze?

Liegt das daran, dass ich einen Buffer fürs Empfangen und Senden verwende? Wenn ich nur eins bis zwei Zeichen sende geht es auch ohne Wait. Werden es aber mehrere Zeichen in Folge, muss ein Wait dazwischen stehen. Also irgendwas muss dann länger dauern!?

Gruß

Kampi
17.05.2012, 21:19
Hi,

ich denke der Grund ist ganz einfach :)
Zum Senden und Empfangen wird das selbe Register verwendet. Wenn du nun längere Zeichenketten sendest, dauert es länger diese komplett auszulesen und wieder nach und nach in das Register zu laden und zu senden.
Von daher musst du diese Zeit überbrücken.
In C macht man dies z.B. so:

while (!( USARTC0.STATUS & USART_DREIF_bm));

Das Programm bleibt solange an der Stelle stehen bis das Datenregister leer ist.
Bascom hat diese Funktion (soweit ich weiß) in einem Input und einem Print nicht mit drin. Von daher musst du die Zeit "händlich" überbrücken lassen, sprich ein "Wait" benutzen.

demmy
17.05.2012, 21:26
Also ich weiß das man auf die Register der Uart zugreifen kann. Welches genau müsste ich denn da abfragen um zu erfahren
wann die UART mit dem Empfangen bzw. Umschichten eines Zeichens fertig ist?

Woher weiß ich wie lange ich das Wait machen muss?

Thomas E.
17.05.2012, 21:32
Also bei mir funktioniert das:


Dim X As Byte

Do

Input X
Print X

Loop

End


Oder hast du etwas anderes gemeint? :confused:

Kampi
17.05.2012, 21:43
Also ich weiß das man auf die Register der Uart zugreifen kann. Welches genau müsste ich denn da abfragen um zu erfahren
wann die UART mit dem Empfangen bzw. Umschichten eines Zeichens fertig ist?

Woher weiß ich wie lange ich das Wait machen muss?

Du kannst das Bit welches das Ende einer Übertragung signalisiert abfragen.

demmy
17.05.2012, 23:08
Das Ende einer Übertragung? Das heißt es wird nach jedem Eingang eines Zeichens gesetzt? Welches Bit wäre das?

Kampi
17.05.2012, 23:16
Das Bit müsste "USART Receive Complete Interrupt Flag" heißen und es wird gesetzt sobald ungelesene Daten im Buffer stehen und wird gelöscht sobald der Buffer leer ist.

demmy
17.05.2012, 23:39
Ahh ok! Vielen Dank!!!

demmy
18.05.2012, 11:26
Hi,
also ich hab jetzt versucht das Bit abzurufen. Wenn UCSRA.RXC = 0 dann soll erst die Antwort gesendet werden. Das funktioniert aber leider auch nicht. Will ich die Zahl 2 senden bekomme ich wieder als Empfang 255. Jetzt versteh ichs gar net mehr? weil der Empfang muss jetzt ja definitiv beendet sein oder!?
Hat das evtl. etwas damit zu tun das ich die Daten per rs485 übertrage?

Kampi
18.05.2012, 11:38
Hi,

Wenn du einen Fehler im RS485 hast kann dies der Fehler sein. Oder hast du UART-RS485 Konverter und die sind nicht für deine Baudrate ausgelegt? Welche Baudrate, Controller und Takt verwendest du den? Und wie sieht der ganze Aufbau aus?

demmy
18.05.2012, 11:52
Also , es ist ein Atmega162, 8MHZ Quarz, Baudrate: 38400, an einem MAX485. (der max485 kann bis zu 2,5Mb)
Ich habe jetzt vor auf die 14,7456 MHZ umzustellen.
Wie gesagt wenn ich ein Wait dazwischen setze funktioniert das Senden und Empfangen Problemlos. Ich verwende die Funktion der automatischen Sende-Empfangsumschaltung in Bascom. Aber ich denke nicht das es an der Hardware liegt. In anderen stellen im Programm wo ein paar Zeilen Code zwischen dem Empfangen und Senden liegen, funktioniert es sogar auch ohne ein Wait.
Ist vielleicht diese automatische Sendeumschaltung zu langsam?

Was auch noch interessant sein könnte an der Stelle lese ich die Daten in ein Array ein. also per Inputbin #1, Empfang() , 1 und sende dann aus einem Array printbin #1, Senden(), 1 ;

Kampi
18.05.2012, 12:08
Ist vielleicht diese automatische Sendeumschaltung zu langsam?


Kannst ja mal testweise diesen Teil isolieren und dann mal testen. Wenn es nicht klappt mach das mal ohne diese Funktion. Dann weißt du ob das der Fehler ist.

demmy
18.05.2012, 16:13
Mhh das hab ich auch schon alles versucht. Keine Ahnung warum das so ist. An einem Atmega8 empfange und sende ich z.b. auch direkt nacheinander und da geht es auch ohne wait. Das is total merkwürdig! Ich kann mir das momentan nicht erklären warum das so ist!?

Vor allem, wenn ich die Daten ja noch in einen Buffer einlese, müsste das ganze doch noch schneller ablaufen, als wenn das Program darauf warten muss bis die Daten eingelesen wurden. Die Daten kann ich ja dann bei Bedarf aus dem Buffer holen.