-         

Ergebnis 1 bis 8 von 8

Thema: Hex und Dezimal per RS485 senden ?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318

    Hex und Dezimal per RS485 senden ?

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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);
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hallo Vitis,

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

    Code:
    $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/con.../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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken befehle.jpg  

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    05.03.2006
    Beiträge
    10
    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

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    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);
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.02.2006
    Beiträge
    164
    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.

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    nicht dafür, kein Thema
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •