PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hex und Dezimal per RS485 senden ?



BlaueLed
23.03.2006, 21:27
Hallo,

ich muss über die RS485 Schnittstelle folgendes senden :

1. Startbyte = FF ( hex )
2. Voradresse = C0 ( hex )
3. Adresse = 000 ( dezimal )
4. Befehl = 31 ( hex )
5. Stoppbyte = 7F ( hex )

ich habe nen max485. die "Sender" Leitung hängt an Portb.4

ich habe probiert, mit Print Hex (FF) usw. die daten zu senden. aber das klappt nicht.

könnte mir bitte jemand sagen, wie ich die daten senden muss ?

mfg Kay

Vitis
23.03.2006, 23:33
also,

du verwendest prinzipiell die UART

die UART versendet prinzipiell bis auf Ausnahmen'

1 Startbit, 8 Datenbit und die Stopbit.

das Startbeit z.B. "FF" ist gleich dezimal Zahlenwert 255
oder Binärer Wert 11111111 , also 8 Bit.

Du sendest also ein Zeichen, keine zwei.

Bei der RS485 ist es auch wichtig darauf zu achen, das
auch alle Daten übertragen wurden und nicht noch welche
im Sendepuffer hängen bevor man von schreiben auf Lesen
umschaltet. Die RS485 kann zwar sehr hohe Datenraten,
aber nur Halbduplex (!!) sie kann nicht gleichzeitig senden und
Empfangen (!)

ich hab das so gelöst:

Rw485=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)
Rw485 = 0 (Auf Empfangsbereitschaft)

Wenn Du Zahlenwerte größer als 8Bit (0-255) versenden
willst mußt du den Wer zerlegen in seine Bytewerte
und die dann einzeln versenden und im Empfänger wieder
zusammensetzen.

z.B. Word-Variable
dim x as word
dim y as byte

y=x (die unteren 8 Bit herauskopieren)
print chr(y); (senden)
shift x, right, 8 (das Highbyte an die Lowbyte Position schieben)
y=y(wieder die unteren 8 Bit herauskopieren (ehemals Highbyte nun Lowbyte))
print chr(y); (senden)

Einfacher gehts mit Overlayvariablen.
Dim Wordvariable as word at &H90
dim Lowbyte as byte at &H90 overlay
dim highbyte as byte at &H91 overlay

print chr(highbyte);
print chr(lowbyte);

BlaueLed
24.03.2006, 17:02
Hallo Vitis,

danke für die Antwort. ich habe jetzt folgendermaßen programmiert :



$regfile = "m16def.dat"
$crystal = 10000000
$baud = 9600

Config Portb = Output

'Config Lcd = 16 * 2
'Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portd.5 , Rs = Portd.6
'Cursor Off


Do

Wait 2
Portb.4 = 1
Print Chr(255) ; Chr(192) ; "000" ; Chr(87) ; Chr(127)
Do
Loop Until Ucsra.txc = 1
Set Ucsra.txc
Portb.4 = 0


Loop


Funktioniert nicht. ich habe bei meinem MAX485 gemessen :

Spannungsversorgung = 5 V
Auf der A Leitung habe ich gegen Masse konstant 1,987 V. In dem Moment in dem er sendet tut sich auf dieser Leitung nichts ( kann aber auch sein, das mein Messgerät das nicht schnell genug anzeigt ). Auf der B Leitung das gleiche.

Die Terminierung des Max485 besteht aus 3 Widerständen. 1kOhm und 2x 100 kOhm.


http://www.elektronik-projekt.de/content/images/rs485_bus.gif

Kann ich denn ohne Osziloskop überhaupt rausfinden, ob er sendet ?

Ich will damit einen Digitalen Videorecorder ansteuern. Die Befehlsliste habe ich mit angehängt.

Wäre nett, wenn Du mir nochmal helfen könntest.

mfg Kay

lumilux
24.03.2006, 17:38
Hallo Kay,

das Format für deine Adresse (dez 000) müsste CHR(0) lauten und am Ende der Sendezeile muss auf jeden Fall ein Semikolon sitzen. Ansonsten wird beim PRINT Befehl immer ein CR/LF (CHR(10)/CHR(13)) angehängt.

MfG Frank

Vitis
24.03.2006, 17:52
schaut doch gut aus,

ich glaub nicht, das n gebräuchliches handelsübliches Multimeter
da viel anzeigt wenn die Daten durch gehen, da wirste
um zuverlässig zu prüfen n Oszilloskop für brauchen.

Haste denn die Empfängerseite auch schon probiert?

ach so ... also um es dir leichter zu machen kannste auch die Hexwerte direkt
eingeben, das sieht dann so aus:

print chr(&Hff);chr(&Hc0);

ich glaub das "000" wird nicht stimmen ... wenn die Adresse 000 ist
wirds auf

print chr(&H00);chr(&H00);chr(&H00);

hinauslaufen.

dann den Befehl (Play)
print chr(&H50);

und stopbefehl zum Abschluss

print chr(&H7f);

Zusammengesetzt sähe das dann so aus:


print chr(&Hff);chr(&Hc0);chr(&H00);chr(&H00);chr(&H00);chr(&H50);chr(&H7f);

ich kann mir aber die 3-stellige ID nicht ganz vorstellen, ich glaub das das
n wert von 0 bis 255 sein kann, also ein Byte Länge.
Dann gäbs bei nur einem Rekorder mit der ID 000 nur ein
Adressbyte, also dann:

print chr(&Hff);chr(&Hc0);chr(&H00);chr(&H50);chr(&H7f);

veit
24.03.2006, 18:03
hmmmm kannst auch deine werte in variablen speichern und die mit printbin senden .... müsste aber so auch gehen.
bei mir gehts so

startcommand = 255
printbin startcommand;

das ; schneidet den zeilenumbruch weg.

ansonsten stimmts.

BlaueLed
25.03.2006, 11:43
Hi,

also ich will mich mal bei allen bedanken, besonders bei Vitis. das hier hat den erhofften erfolg gebracht :




Dann gäbs bei nur einem Rekorder mit der ID 000 nur ein
Adressbyte, also dann:

print chr(&Hff);chr(&Hc0);chr(&H00);chr(&H50);chr(&H7f);


Vielen Vielen Dank. es klappt einwandfrei.

juhuuuu

mfg Kay

Vitis
26.03.2006, 09:55
nicht dafür, kein Thema :)