PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere AVR-Controller über RxD TxD verbinden - Timingproble



Alex20q90
09.11.2005, 19:56
Hallo,

ich hab ein Problem mit der Datenübertragung beim ATTiny 2313 mit der Serielen Schnitstelle.

Ich habe mehrere AVR's an einem Datenbus. Die Verbindung und der Datenaustausch klappt hervorragend!

Initialisiert habe ich es mit :

Open "comd.1:100,8,n,1,inverted" For Output As #1
Open "comd.0:100,8,n,1" For Input As #2


Das Funktioniert auch Perfekt! Daten kommen so an wie sie sollen!

So zu meinem Problem :

Wie kann ich es machen, das die Daten empfangen werden, wärend der AVR was anderes macht (z.b. einen A/D Wandler ausliest oder so)?

Kann ich die Daten aus einem Empfangspuffer lesen? Wenn ja wie?

Ich hab schon überlegt einen Interrupt auszulösen sobald am RxD sich was ändert, und dann mit Inkey eine Abfrage starte.

Leider ist es so, das wenn der Prozessor was macht, und eine "Anfrage" kommt, das er nach dem "etwas machen" garnix merkt! Also er sollte mit einem Ohr hinhören!

Grüße
Alex

PicNick
09.11.2005, 20:04
Der 2313 hat doch eine HW-UART ? Wenn ja, kannst du doch mit
CONFIG Serialin=Buffered, size = nn eine Buffer definieren, in den der Bascom asynchron mit Interrupt reinschreibt, und du liest es aus, wenn du Zeit hast ?
(Help "Config")

Alex20q90
09.11.2005, 20:57
Hi,

danke für die Antwort! Leider klappt das mit dem selber geöffneten Port nicht! Ich brauche nämlich beim output "inverted".

Den kann ich so nicht angeben!

Sonst würd ich gerne


$Baud 100

Config Serialin = Buffered , Size = 20
Enable Interrupts

do

B = Inkey()

Kann ich der Internen HW nicht sagen das sie beim TxD "inverted" nimmt?
Oder einfach nur die RxD-HW aktivirt?

Grüße
Alex

PicNick
10.11.2005, 09:23
Inverted is'nich. Aber natürlich kannst du von der UART Rx u. Tx auch isoliert verwenden. Also receive mit der HW, senden zu Fuß, was ja auch leichter ist.

Alex20q90
10.11.2005, 18:33
Hi PicNick,

also Senden langt mir mit

Open "comd.1:100,8,n,1,inverted" For Output As #1

...
...

Print #1, "Hallo"

Aber Empfangen sollte über die HW-UART des AVR, da ich sonst Systemrecourcen für den Empfang nutzen mus, was er ja im "Hintergrund"

erledigen kann.

Nur, wenn ich über die HW-UART auf Empfang gehe, initialisiert er mir die TxD auch, und zwar auf "High"!

Wie kann ich das getrennt machen? Hast Du dafür einen Code?

grüße
Alex

hrei
10.11.2005, 19:16
Nur, wenn ich über die HW-UART auf Empfang gehe, initialisiert er mir die TxD auch, und zwar auf "High"!


Yupp, das macht der Schweinehund soifort nach dem Befehl $Baud xxxx.

Im weiteren Verlauf läßt sich das dann ändern:

SET UCR.3 schaltet TXD ein
SET UCR.4 schaltet RXD ein
RESET UCR.3 schaltet TXD aus <---------------- Das ist für Dich wichtig.
RESET UCR.4 schaltet RXD aus

Dann noch den Portx.x händisch wieder auf 0 setzen und gut isses.

Grüße
Henrik

PicNick
10.11.2005, 19:30
@Henrik, danke, das hätt' ich dazusagen müssen :oops:

Alex20q90
10.11.2005, 21:44
So hi,

hab jetzt folgendes erstellt : (auszug)



$regfile = "2313def.dat" 'AT90S2313
$crystal = 8000000 'Quarz 8MHz
$baud = 110

Dim Name As Byte

Config Serialin = Buffered , Size = 20
Enable Interrupts

Reset Ucr.3
Portd.0 = 0 'Rx Port



do

name = Inkey()

If Err = 0 Then
If Name= Chr(001) Then
xxxxxx
endif
endif

loop
end

Das sind die Kriterien mit denen ich versuche die Seriellen Daten aus dem puffer zu lesen!

Wenn ich aber :


$regfile = "2313def.dat" 'AT90S2313
$crystal = 8000000 'Quarz 8MHz

Dim Name As Byte

Open "comd.0:110,8,n,1" For Input As #1


do

name = Inkey(#1)

If Err = 0 Then
If Name= Chr(001) Then
xxxxxx
endif
endif

loop
end

Nutze klappt es! Woran kann das liegen?

Grüße
Alex

PicNick
11.11.2005, 09:45
if ischarwaiting() then
name = Inkey()
If Name = 1 Then
xxxxxx
endif
endif

Bei der gebufferten Variante mußt du immer erst schauen, ob überhaupt was angekommen ist.

Bemerkung: chr(1) = 1