PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS485 ohne Config Print aber mit Config SerialOut



demmy
20.11.2013, 19:13
Hi zusammen,

folgendes Problem, wie Ihr aus dem Titel schon entnehmen könnt, versuche ich Daten über eine RS485 zu Senden ohne die Automatische Sende und Empfangsumschaltung aber dafür mit Ausgangspuffer zu realisieren.

Ich habe es auf folgendem Weg versucht:



Do
' Prüfen ob der Ausgangspuffer leer ist
If _rs_bufcountw1 = 0 Then
Waitus 500
Rs485dir1 = 0 ' Auf Empfangsmodus schalten
End If

' Alle Daten empfangen
If _rs_bufcountr1 >= 17 Then

Rs485dir1 = 1 ' Auf Sendemodus schalten

Waitus 500

' Sende 17 Bytes aus dem Bytearray ab Position 1
Printbin #1 , S_bus_sendearray(1) , 17 ;
End If
Loop


Nur ist es so, das ich nicht immer alle Daten sauber zurück bekomme. Jetzt meine Frage:
Kann es sein das meine Wartezeiten vor bzw. nach dem Umschalten der Senderichtung zu kurz sind? Wie lang müssen die Wartezeiten denn Sein?
Gibt es denn nicht ein Interrupt, welches ausgelöst wird, wenn der Sendepuffer leer ist?
Oder gibt es einen anderen Weg das Problem zu lösen bzw. abzufragen ob alle Daten gesendet wurden?
Wie würdet / habt Ihr das Problem gelöst?

Vielen Dank schon mal.

demmy
20.11.2013, 21:32
Also ich habe inzwischen noch was gefunden,
es gibt das "Transmitt Complete Interrupt", an das muss ich ran kommen.

Ich muss es für die 2. Hardwareuart aktivieren.
Zum aktivieren des Interrupts habe ich folgendes aus dem Datenblatt ausgelesen:

Set Ucsr1b.txcie1

Aber wie weise ich das Label zu, welches angesprungen wird? Ich habe es so versucht, aber eine Fehlermeldung erhalten.

On Ucsr1a.txc1 Isr_von _outbuf1

Könnt ihr mir helfen?

for_ro
20.11.2013, 23:15
Hallo demmy,
der Interrupt heißt in Bascom UTXC.
Schau mal unter Enable in der Bascom Hilfe, da stehen die Interruptnamen und ihre Bedeutung.

demmy
21.11.2013, 05:51
Ahh ok Vielen Dank.

Mein Code sieht jetzt so aus:



Set Ucsr1b.txcie1
On UTXC1 Txd_Ready
Do

' Alle Daten empfangen
If _rs_bufcountr1 >= 17 Then

Rs485dir1 = 1 ' Auf Sendemodus schalten

Waitus 500

' Sende 17 Bytes aus dem Bytearray ab Position 1
Printbin #1 , S_bus_sendearray(1) , 17 ;
End If
Loop

Txd_Ready:
' Prüfen ob der Ausgangspuffer leer ist
If _rs_bufcountw1 = 0 Then
Waitus 500
Rs485dir1 = 0 ' Auf Empfangsmodus schalten
End If
Return


Ich bin mal gespannt, ob das nun so funktioniert? :)
Eigentlich müsste ich doch die Zeile " If _rs_bufcountw1 = 0 Then" auch weglassen können oder? Da das Event nur gefeuert wird, wenn der komplette Sendepuffer leer ist?

demmy
21.11.2013, 19:51
Ok, es will einfach nicht funktionieren, egal was ich mache.

RS485 , CONFIG SERIALOUT, das Serial TX complete interrupt vertragen sich wohl nicht zusammen in Bascom kann das sein?

Ich weiß aktuell nicht weiter. Alles was ich erreichen wollte, war im Hintergrund über eine RS485 Daten zu versenden und zu empfangen.

Hat niemand mehr eine Idee????

for_ro
21.11.2013, 22:32
Hast du denn auch die Interrupts global freigegeben (Enable Interrupts)?
Ansonsten zeige doch mal dein komplettes Programm, sonst müssen wir raten, was dort stehen könnte.

demmy
22.11.2013, 14:12
Hi,

also die globalen Interrupts sind freigegeben. Hmm also es ist so, dass das restliche Programm funktioniert und nur der Teil mit dem Senden der Daten nicht funktioniert. Ich denke das gesammte Programm würde hier den Rahmen sprengen.
Aber im wesentlichen habe ich den betroffenen Teil weiter oben schon gepostet. Das UTXC1 Interrupt ist das einzige Interrupt, welches ich aktuell verwende. Sonst nur noch 2 Timer die aber einwandfrei funktionieren im Einsatz.

Im Grunde soll nichts anderes passieren, als in der Hauptschleife zu schauen ob 17 Byte im Eingangspuffer sind. Sind die Bytes da, sollen über den Ausgangspuffer 17 Byte zurück gesendet werden. Da man ja laut Bascom Hilfe zusammen mit dem Ausgangspuffer nicht die automatische Senderichtungsumschaltung verwenden darf, dachte ich ich kann das über das UTXC-Interrupt lösen.
Könnte es aber sein, das der Ausgangspuffer auch dieses UTXC-Interrupt werwendet und es deshalb nicht geht?

Mit dem oben gepostetetn Code funktioniert es gelegentlich einmal Daten zu Empfangen und zu senden, danach geht nichts mehr!

demmy
24.11.2013, 14:23
Hat niemand mehr eine Idee? :(