PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS485 - brauch dringend Hilfe



elkokiller
02.10.2006, 19:50
Hallo,

ich versuche einen kleinen hausbus per Max485 auf zu bauen.
Leider geht bei mir nichts über den Bus.

Den RE und DE Anschluss des Max 485 habe ich an Portd.2 des Atmega 8 angeschlossen und folgenden Code geschrieben




$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600




Config Portd.2 = Output ' RS485


Dim I As Byte
Dim Key As Byte



Do



Portd.2 = 1

Waitms 10
'Print A
Print "Hallo"
Waitms 10

Portd.2 = 0

Loop


End





Irgent etwas muss im Programm falsch laufen - Was?
Tobias

bertl100
02.10.2006, 20:48
damit klappts.


Config Print0 = Portd.2 , Mode = Set
Config Pind.2 = Output

dann brauchst du nur mehr print oder print0

den Rest macht der compiler

MFg

Bertl

elkokiller
02.10.2006, 21:03
Sorry,

da bin ich noch nicht so fit.

Köntets du mir mal den gesamten Code zeigen

bertl100
02.10.2006, 21:07
$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600


Config Print0 = Portd.2 , Mode = Set
Config Pind.2 = Output



Dim I As Byte
Dim Key As Byte



Do






'Print A
Print "Hallo" ' oder print0 "Hallo"


wait 1

Loop


End

elkokiller
02.10.2006, 21:13
in Zeile6 erhalte ich auch in dem von dir erstellten Code einen Fehler
Config Print0 = Portd.2 , Mode = Set

bertl100
02.10.2006, 21:14
welche Version von Bascom hast denn??

elkokiller
02.10.2006, 21:19
Version 1.11.7.7

bertl100
02.10.2006, 21:21
Bei der Version gibt es wahrscheinlich noch kein config print0

Saug einfach die neueste Version runter, dann gehts.
Mehr als 4 KB hast ja sowieso nicht.

MFG

Bertl

elkokiller
02.10.2006, 21:23
Danke, ich evrsuchs mal!

Vitis
02.10.2006, 21:34
Das ist insgesamt käse ...
Du schaltest die 485 zu früh um.
Das ist das Proble mit fertigen Routinen ala Print
schau mal im Datenblatt unter UTXC, oder unter Stichwort 485
Du musst das txc-bit abfragen bevor du umschaltest, weil sonst durch den sendepuffer des avr die 485 vor ende der übertragung umgeschaltet wird.

elkokiller
02.10.2006, 21:40
den Fehler beim compilieren bekomme ich jetzt nicht mehr.

Leider funktioniert auch dieses Programm bei mir nicht.

Hast du es getestet?

elkokiller
02.10.2006, 21:43
Hallo Vitis,

ich bin blutiger Anfänger und befinde mich im Selbststudium.
Kannst du mir einen Beispielcode geben?

Vitis
03.10.2006, 13:27
Das Forum hat zwar auch ne Suche Funktion, aber trotzdem:

ich hab den LTC485 für RS485 verbaut, kein Problem.
Die Ansteuerung erfolgt wie beim Max485.
Du hast normalerweise einen Eingang, einen Ausgang und
2 Steuerpins für die Datenrichtung, von denen einer
invertiert ist. Du kannst einfach die beiden Pins brücken
und an einen Pin deines Mega führen.
Die Ein- und Ausgänge des Max führst du jeweils an RX und TX vom
Mega32 und fertig.
Du kannst dann für die Kommunikation die gleichen Befehle wie für
die normale UART über RS232 Kommunikation benutzen also
print, waitkey inkey usw.
wichtig bei der Handhabung vom RS485 ist, das er nicht volldupex läuft,
sondern nur halbduplex. Daher ist es wichtig beim Umschalten der
Datenrichtung der RS485-Busbausteine darauf zu achten, dass nicht noch
Zeichen im UART-Buffer warten, weil die dann verloren gehen.
Ich glaub hier im Forum war aber mal ne Bedienungsanleitung für 485 drinne ...

Beispielcode für RS485:

Rw485=1 (Schreibrichtung)
print chr(255);"abcdefg"; (255 = Hex FF)
do
loop until Ucsra.txc=1 (prüfen auf leeren Sendepuffer)
reset Ucsra.txc ' (wieder zurücksetzen für nächste Operation)
Rw485 = 0 (Auf Empfangsbereitschaft)

oder hier:
https://www.roboternetz.de/phpBB2/ze.....ag.php?t=18344&highlight=

elkokiller
03.10.2006, 14:03
Hallo Vitis,

vielen Dank für deine Unterstützung.
Mit der Suchfunktion bin ich leider noch nicht sehr viel weiter gekommen.
ich versuche derzeit, ohne Vorkenntnisse, mich in Basic ein zu arbeiten.

Leider stehe ich bei RS485 (oder auch 232) noch ganz am Anfang.

Hier habe ich versucht dein Beispiel in einen Code um zu setzen (leider ohne Erfolg)




$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600



Do

Portd.2 = 1 'Schreibrichtung

Print Chr(255) ; "abcdefg" '255 = Hex FF
do

Loop Until Ucsra.txc = 1 'prüfen auf leeren Sendepuffer

Set Ucsra.txt 'wieder zurücksetzen für nächste Operation

Portd.2 = 0 'Auf Empfangsbereitschaft

Loop

End



Gleich mal ein paar Fragen dazu:
Muss ich Ucsra.txc nicht definieren? Wie?
Wieso wird zwischen .txc unc .txt unterschieden?

Vitis
03.10.2006, 14:33
txc - txt sind verschiedene Bits eines Registers, die den Übertragungsstatus anzeigen. txc = clear, also sendepuffer leer.
die Definition des Registers wird bei Bascom über die def-Datei vorgenommen, für solche Fälle ist die speziell gemacht.
Läuft bei c aber auch so ähnlich.

Suche:

485 und txc ... und schon kommen n paar passende ergebnisse.

wie misst du? oszi oder multimeter?

ach so, beim ltc kann man die übertragungsqualität verbessern indem man pullup und pulldown widerstände an die A-B-Leitungen macht. 10KR funktionieren bei mir prima

elkokiller
03.10.2006, 15:24
o.k. das habe ich verstanden.

Messen muss ich im Moment mit einem Multimeter.
Die Widerstände habe ich auch eingesetzt.

habe ich das Programm richtig in Bascom geschrieben?
Danach sollte jetzt ständig abcdefg im Terminalprogramm stehen.

Vitis
03.10.2006, 19:14
jetzt versteh ich auch was du mit txt meinst, das ist n fehler in meinem beispielcode, sorry.
streiche txt, setzt txc und dann stimmts.

PiCus
30.10.2006, 15:28
Hallo Freunde des BASCOM'S

ich hab folgendes Problem, wie Elkokiller beschrieben hat bin ich dran einen Hausbus über RS485 zu realisieren. Hab mich durch etliche Seiten und Doku's gewälzt und festgestellt dass das schon oft beschrieben SNAP-Protokoll das Beste ist, und vor allem leicht zu verstehen. Ich hab 3 mega8 und 3 2313 am Bus laufen und es geht prima. Es sind mit dem 2313 eine Tastenmudul, ein Relaismodul und ein Rollomodul was sich vom Relaismodul nur in der Soft unterscheidet. Elektronisch verriegelung der Relais. Also über den Bus mit dem Tastmodul kann ich die Relais prima schalten, nur möchte ich an den Modulen auch Taster betreiben die mir die gleich Funktion bringen wie das Tastenmodul, aber ich bekmm's einfach nicht hin. Ich poste mal das Versuchsprogramm mit 2 Relais.



'RS-485 4fach Relais für Hutschiene
'mit 4 Tasten und RS485

$regfile = "2313def.dat"
$crystal = 4000000
$baud = 4800

Ddrb = &B00001111

Config Portd.2 = Output

Config Portd.3 = Input : Portd.3 = 1
Config Portd.4 = Input : Portd.4 = 1
Config Portd.5 = Input : Portd.5 = 1
Config Portd.6 = Input : Portd.6 = 1

'Dim S As String * 10
Dim B(10) As Byte 'At S Overlay
Dim N As Byte

Const Preamble_ = &H55 'H55
Const Sync_ = &H54 'H54
Const Hdb2_ = &H51 'H51
Const Hdb1_ = &H42 'H42
'Const Myadress = &H 04

Dim Myadress As Byte : Myadress = 6
Dim Preamble As Byte
Dim Sync As Byte
Dim Hdb2 As Byte
Dim Hdb1 As Byte
'Dim Dab2 As Byte
Dim Dab1 As Byte
'Dim Sab2 as byte
Dim Sab1 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte

Dim X1 As Bit , X2 As Bit , X3 As Bit , X4 As Bit , X5 As Bit
X1 = 0 : X2 = 0 : X3 = 0 : X4 = 0 : X5 = 0

'----- Programm
On Urxc Onrxd
Enable Urxc
Enable Interrupts
Portd.2 = 0

Main:
If N = 10 Then
Preamble = B(1)
Sync = B(2) : Hdb2 = B(3) : Hdb1 = B(4)
Dab1 = B(5): 'Dab2=B(x)
Sab1 = B(6) : 'Sab2=B(x)
Db2 = B(7) : Db1 = B(8)
Crc2 = B(9) : Crc1 = B(10)
N = 0
End If

Gosub Ausgang

If Sync <> Sync_ Then : Goto Main
Elseif Hdb2 <> Hdb2_ Then : Goto Main
Elseif Hdb1 <> Hdb1_ Then : Goto Main
Elseif Dab1 <> Myadress Then : Goto Main
End If
'------------------------------------------------
Ausgang:

If Pind.3 = 0 Or Db2 = &H01 And X1 = 0 And X2 = 0 Then : X1 = 1 : Portb.0 = X1 : Waitms 500
Elseif Pind.3 = 0 Or Pind.4 = 0 Or Db2 = &H01 Or Db2 = &H02 And X1 = 1 Then : X1 = 0 : Portb.0 = X1 : Waitms 500

Elseif Pind.4 = 0 Or Db2 = &H02 And X2 = 0 And X1 = 0 Then : X2 = 1 : Portb.1 = X2 : Waitms 500
Elseif Pind.4 = 0 Or Pind.3 = 0 Or Db2 = &H02 Or Db2 = &H01 And X2 = 1 Then : X2 = 0 : Portb.1 = X2 : Waitms 500

End If

'Goto Main
Return
Onrxd:
Incr N
B(n) = Udr

Return

End



Wenn ich die Tasten benutze schalten die Relais je nach Taste, aber beim Tastenmodul wird zwar eeingschaltet, aber gleich darauf wieder aus.

Hier mal das Programm vom Tastenmodul




$regfile = "2313def.dat"
$crystal = 4000000
$baud = 4800

Ddrb = &B00000000
Portb = &B00011111

'Config Portd.3 = Input : Portd.3 = 1
'Config Portd.4 = Input : Portd.4 = 1
'Config Portd.5 = Input : Portd.5 = 1
Config Portd.6 = Input : Portd.6 = 1

Const Preamble_ = &B01010101 'H55
Const Sync_ = &H54 'H54
Const Crcpoly = &H1021
Const Hdb2_ = &H51
Const Hdb1_ = &H42
Const Myadress = &H03

Dim Preamble As Byte
Dim Sync As Byte
Dim Crc As Word
Dim Hdb1 As Byte
Dim Hdb2 As Byte
Dim Dab1 As Byte
Dim Dab2 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Sab1 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte
Dim Temp1 As Byte
Dim Temp2 As Byte
Dim Tmpw1 As Byte
Dim Tmpw2 As Byte

'Preamble = Preamble_
'Sync = Sync_

'Db1 = &H3
Db2 = &H0

Dab1 = &H06 ' Adresse des Empfänger
Sab1 = Myadress 'Adresse des Senders
Crc2 = &H01
Crc1 = &H01
Portd.2 = 0

'------------------------------------------------
'hier Programmcode für Tastenabfage und Wertzuweisung
'unterbringen
'z.B.:
' If Pind.0 = 0 Then Db1=&h01
' goto Send
' End IF
'
'oder eine Select Case-Anweisung
'
'------------------------------------------------

Tasten:
Db1 = &H0
If Pinb.4 = 0 Then : Db1 = &H01 : Goto _start
Elseif Pinb.3 = 0 Then : Db1 = &H02 : Goto _start
Elseif Pinb.2 = 0 Then : Db1 = &H04 : Goto _start
Elseif Pinb.1 = 0 Then : Db1 = &H08 : Goto _start
Elseif Pinb.0 = 0 Then : Db1 = &H0 : Goto _start
Elseif Pind.6 = 0 Then : Db1 = &HF : Goto _start
End If

Goto Tasten


_start:

Portd.2 = 1 : Waitms 20 'RS485 PIN auf Senden
Print Chr(preamble_) ; Chr(sync_) ;
Print Chr(hdb2_) ; Chr(hdb1_) ;
Print Chr(dab1) ; Chr(sab1);
Print Chr(db1) ; Chr(db2);
Print Chr(crc2) ; Chr(crc1);

Waitms 10 : Portd.2 = 0 : Wait 1 'RS485 PIN auf Enpfang

'Goto _start
Goto Tasten


wen's Interessiert noch ein Programm für den Bus zu belauschen




'Einfacher String-Empfang
$regfile = "m8def.dat"
$crystal = 8000000
$baud = 4800

Dim S As String * 10
Dim B(10) As Byte 'At S Overlay
Dim N As Byte

Const Preamble_ = &H55 'H55
Const Sync_ = &H54 'H54
Const Hdb2_ = &H51 'H51
Const Hdb1_ = &H42 'H42
'Const Myadress = &H 04

Dim Myadress As Byte : Myadress = 4
Dim Preamble As Byte
Dim Sync As Byte
Dim Hdb2 As Byte
Dim Hdb1 As Byte
'Dim Dab2 As Byte
Dim Dab1 As Byte
'Dim Sab2 as byte
Dim Sab1 As Byte
Dim Db1 As Byte
Dim Db2 As Byte
Dim Crc2 As Byte
Dim Crc1 As Byte

Ddrd = &B00110100
Portd = &B11000000

Ddrc = &B00110110
Portc = &B00100100

Spkr Alias Portd.7

Config Lcd = 20 * 4
Cls
Cursor Off Noblink

On Urxc Onrxd
Enable Urxc
Enable Interrupts
Portd.2 = 0

'------------------------------------------------
Main:
If N > 9 Then
Preamble = B(1)
Sync = B(2) : Hdb2 = B(3) : Hdb1 = B(4)
Dab1 = B(5) : Sab1 = B(6) : Db2 = B(7)
Db1 = B(8) : Crc2 = B(9) : Crc1 = B(10)
N = 0
End If

Gosub Anzeige

If Sync <> Sync_ Then : Goto Main
Elseif Hdb2 <> Hdb2_ Then : Goto Main
Elseif Hdb1 <> Hdb1_ Then : Goto Main
'Elseif Dab1 <> Myadress Then : Goto Main
End If

Goto Main

Anzeige:
Locate 1 , 1 : Lcd Hex(preamble) ; "-" ; Hex(sync) ; "-" ; Hex(hdb2) ; "-" ; Hex(hdb1)
Locate 2 , 1 : Lcd "Empf:" ; Hex(dab1)
Locate 2 , 10 : Lcd "Send:" ; Hex(sab1)
Locate 3 , 1 : Lcd Bin(db1) ; "-" ; Bin(db2)
Locate 4 , 1 : Lcd Hex(crc2) ; "-" ; Hex(crc1)
Locate 4 , 10 : Lcd "Mya:" ; Hex(myadress) ; "-" ; Hex(dab1)
Return


Onrxd:
Incr N
B(n) = Udr

Return


das ist mit einem mega8 und LCD

Hoffendlich kann mir jemand helfen ??

PiCus
04.11.2006, 11:58
Hallo,
mein Problem hat sich erledugt, durch den Code von Elkokiller habe ich den nötigen Geistesblitz bekommen und mein Programm läut. Ich werde nun das Ganze noch an die Gegebenheiten wie 2fach Relais- 2fach Rollosteuerung umsetzen. Beim Rollo mit softwaremäßen gegenseitigen Verriegelung.
Mein 4fach Hutschienemodul läuft und davon wird es abgeleitet.

Nockmal vielen Dank an Elkokiller

Stromi
05.11.2006, 14:12
@PiCus
Was haste denn im Relay-Programm geändert?
Würde mich interessieren.
MfG

PiCus
06.11.2006, 12:40
Ganz einfach,
beim Rollomodul muss ich dafür sorgen dass die Relais gegeneinander Verriegelt sind, beim Relaismodul muss das nicht sein. Die Überlegung geht dahin, dass ich das Platinenlayout so Anlege dass es keine Verwechselung gibt, oder nur eine Platine für beide, und die Verriegelung müsste dann verdrahtet werden.

Und Programmtechnisch eben auch eine Tastenverriegelung, so dass ich entweder durch einen Tastendruck erstmal alle Ausgänge auf Null setze und dann die nächste Funktin einleite, oder die zuerst eingeleitete Funktion mit der gleichen Taste zurücknehmen muss bevor ich eine andere Taste betätige. Bei Relais soll ja immer beim Tastendruck der Zustand geändert werden.

Wenn sonst noch Fragen, immer her damit