PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu Software Uart



Blamaster
27.06.2008, 17:53
Hi,

ich habe eine Frage zur Software Uart.

Gibt es da irgendeinen Befehl bei dem unabhängig in welcher sub schleife sich das Programm befindet, festgestellt wird ob gerade daten empfangen wurden und das Programm dann in eine Interrupt schleife springt ?

Also so wie das bei der Hardware Uart mit On Urxc auch funktioniert ?

mfg Blamaster

fhs
27.06.2008, 19:09
Hallo Blamaster,


...Gibt es da irgendeinen Befehl bei dem unabhängig in welcher sub schleife sich das Programm befindet, festgestellt wird ob gerade daten empfangen wurden und das Programm dann in eine Interrupt schleife springt ? ...

von Bascom habe ich keine Ahnung, da ich nur Assembler und C verwende. Ich wage trotzdem eine Antwort: Wenn die Software-UART-Implementierung von Bascom etwa der Atmel-Note AVR305 ( http://www.atmel.com/dyn/resources/prod_documents/doc0952.pdf ) entspricht, wird das gar nicht möglich sein, da die UART-Zeitabläufe durch Warteschleifen bestimmt sind. Falls doch ein Timer (mit Timer-Interrupt) benutzt würde, wäre das anders! Sieh mal in der entsprechenden Bascom-Dokumentation nach.

Normalerweise ist es nicht sinnvoll, bei Nutzung eines Software-UARTs (ohne Timer-Interrupts) andere längere Funktionen aufzurufen -- allerhöchstens z.B. sehr kurze ISRs; sonst kann die Software-UART-Routine nicht richtig funktionieren.

Wie könnte man es anders machen? Dazu müsste die Software UART-Routine mindest einen Timer-Interrupt nutzen. Dann ließe sich dort entscheiden, was zu tun ist, wenn ein Zeichen komplett empfangen wurde. Man könnte das Zeichen dann (falls das sehr schnell geht) innerhalb der ISR weiterverarbeiten oder einen "Software-Interrupt" (über einen der externen Interrupt-Pins per Software einen Interrupt auslösen!) auslösen. Aber da sind wir schon wieder bei Interrupts, die ja meist nicht nicht zu einem Software-UART gehören.

Bist Du Dir sicher, dass bei Deinem Bascom Program "sub Schleifen" (wie Du sie nennst) überhaupt parallel zur Software-UART-Routine laufen können?

Gruß

Fred

Blamaster
27.06.2008, 19:17
Nein parallel zueinander können sie wohl nicht laufen.

Was ich erreichen möchte ist ganz einfach, das sobald der µC etwas über die Software Uart empfängt den restlichen Ablauf abbricht und erstmal die empfangenen Daten behandelt.

Im Prinzip ist also die Frage mit welchem befehl Bascom signalisiert, dass gerade etwas über die uart reingekommen ist.

mfg Blamaster

repi64
27.06.2008, 22:10
Habe schon mal schaltungen gesehen bei denen der Soft- RX Pin gleichzeitig mit einem weiteren Interrupt Pin verbunden ist, damit bei einem eingehenden Zeichen in die ISR gesprungen werden kann.

Blamaster
28.06.2008, 00:12
Kann dazu jemand genauere Infos geben ?

Am besten mit Beispiel ?

mfg Blamaster

fhs
28.06.2008, 09:57
Hallo Blamaster,

wenn Du zusätzlich einen Interrupt-Pin verwenden möchtest, warum nimmst Du dann nicht gleich einen AVR mit Hardware-UART(s) und UART-Interrupt?

Wenn ich mir diese Bascom-Beispiele ansehe ( http://books.google.com/books?id=4K6ZEzju6u4C&pg=PA116&lpg=PA116&dq=bascom+%22software+uart%22&source=web&ots=riopWXDEIh&sig=w61a7zW7Q_ceEUDNWWbjckDrku4&hl=de&sa=X&oi=book_result&resnum=8&ct=result ), ist der Bascom Code entweder mit der Abarbeitung des Software-UART-Codes beschäftigt, oder er macht etwas anderes. Wie schon oben gesagt, beides simultan geht nicht, es sei denn, Du verwendest ein RTOS o.ä., z.B. Task-Switching mit Hilfe eines Timer-Interrupts.

Gruß

Fred

Blamaster
28.06.2008, 10:49
Den Avr kann ich leider nicht mehr wechseln.

Ich habe jetzt den code nochmal abgewandelt, so dass ich in einer Do Loop abfragen könnte, ob neue Daten über die Uart kommen.

Mit welchem Befehlt kann ich das denn abfragen ?

mfg Blamaster

fhs
28.06.2008, 13:14
Hallo,


...Mit welchem Befehlt kann ich das denn abfragen ? ...

in dem Link (S. 116 des Buchs) in meinem obigen Beitrag wird der Port einfach geöffnet und dann nachgesehen ob die Funktion
Inkey(#PORTNUMMER) ungleich Null ist (was wohl bedeutet, dass ein Zeichen eingetroffen ist).
Wie gesagt, ich spreche nur C und Assembler.

Gruß

Fred

Blamaster
28.06.2008, 13:21
Thx so funkt es :)

Blamaster
29.06.2008, 11:26
Hi,

wie müsste denn der Code aussehen, wenn ich einfach in einer Do Loop Abfragen möchte ob was übern Com gekommen ist und das ganze dann übern nen lcd ausgeben möchte ?

Ich habe es jetzt so probiert, aber es funkt nicht wirklich ...



Do

Open "comb.6:9600,8,n,1" For Input As #2
Input #2 , Test
Cls
Locate 1 , 1
Lcd Test
Close #2

Loop


Test ist als Byte deklariert.

Kann mir da jemand helfen ?

mfg Blamaster

repi64
29.06.2008, 12:13
Hi,
dein Open und Close gehört nicht unbedingt in die Loop Schleife.
Wenn du es so machst, bleibt der Ablauf so lange am Input Befehl stehen, bis Daten kommen und ein (CR) folgt.
Erst dann geht es weiter zur LCD Geschichte.
Kannst in der Zwischenzeit nichts anderes machen außer wenn der oder ein anderer Part in einer Interrupt Routine steht.

Blamaster
29.06.2008, 12:35
Kannst dazu ein code beispiel machen ?