- Labornetzteil AliExpress         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 30

Thema: Master Slave Verbindung mit AVR2313 und 485-Bustreibern ?

  1. #1

    Master Slave Verbindung mit AVR2313 und 485-Bustreibern ?

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo zusammen,

    bin gerade dabei ein 485-Bussystem bei mir aufzubauen (siehe Tiffs und Bas-Dateien im Anhang), der Controller-Aufbau funktioniert auch den ich hab bereits mit einem Lauflicht-Programm die Funktion getestet.

    Wenn ich aber die Aktor und Sensorsoftware einspiele wie im Anhang geht im Moment nichts. Ich versteh auch nicht ganz wie das Ganze funktioniert also der Aktor hört in die Leitung und reagiert wenn eine passende Zeichenkette empfangen wird ?

    Beim Sensor hab ich an Pin13 PB1 einen Taster angeschlossen der die Masse durchschaltet. Beim Aktor hab ich an Pin13 PB1 eine Leuchtdiode
    angeschlossen gegen +5V, diese geht auch mittels Lauflicht-Programm
    getestet.

    Bei beiden Controllern ist das FuseBit über Bascom auf External gesetzt,
    2xWiderstände 120Ohm Kabelanfang und Ende + 1x 4,7k gegen GBD + VCC an den Buskanälen A / B.

    Wenn ich mittels Multimeter auf dem Bus messe tut sich auch was beim Taster drücken, es wird wohl schon etwas gesendet aber wohl nicht das Richtige !

    Bei der Befehlsstelle versteh ich nicht ganz welche Kombination an den Dipschaltern eingestellt werden muß, PD6 Pin11 hat kein Potential wenn ich messe somit kann er auch nichts über die Dipschalter weitergeben (deshalb hab ich den Taster mal auf Masse gelegt).

    Dann ist da noch ein Anschluß PD5 Pin9 K1 weiß nicht welche Funktion das hat sollen nun +5V draufgeschaltet werden oder nicht ?

    Bei der Software sieht es so aus als ob etwas gesendet und dieses dann noch mal bestätigt wird, der Ablauf scheint mir etwas sehr kompliziert.

    Würde es nicht reichen ich stelle den einen Controller fest auf Empfang und den anderen fest auf senden und schicke nur einen Buchstaben und sage dann höre in den Bus hinein wenn String A kommt schalte Port PB0 auf high, wenn noch einmal String A kommt schalte Port PB0 wieder auf low, und selbes wenn String B kommt dann Port PB1, String C Port PB2 usw. Ein ganz einfacher Code wenn möglich.

    Die Schwierigkeit im Moment liegt bei der Software die vom Sensor zum Aktor wohl nicht ganz zusammen passt, bzw. mir die Funktion nicht ganz klar ist.

    Könntet Ihr mir da noch mal auf die Sprünge helfen und kurz darüber schauen wie die Software zusammenpasst, die Funktion sollte so sein das bei Tastendruck am Eingang Pin13 PB1/Sensor am Ausgang Pin13 PB1/Aktor dieser an geht, beim nächsten Tastendruck aus, dies für alle Ein/Ausgänge des Ports gleich.

    Schon mal vielen Dank im Vorraus !

    Gruß, Jürgen
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Bei den BC107A fehlt am Emitter der GND-Kontakt,
    die Relais haben keine Freilaufdioden ...
    Der Tiny und auch der Max haben nah an den VCC-Anschlüssen gern nochmal
    100nF Stützkondis, am 7805 sieht man auch gern ne Rückwärtsdiode parallel zum
    78er, ne Schutzdiode zum Verpolungsschutz gefällt auch immer

    soweit zur Hardware ...

    zur Software ... sorry, die ist grausam ...
    Goto ohne Ende ... da stelle nsich mir die Haare zu Berge ...
    Schau mal in der Bascom Hilfe nach Gosub - Return ...
    Dann die Programmverzweigungen ... brrrrrrrrrr
    Was den max485 angeht, das kann man unter Bascom schön elegant
    lösen über config print, dann kann man sich die manuelle Umschaltung schenken
    (zumindst im Code)
    Das Problem bei Deinem Protokoll wird sein, dass Du nach den Print-Befehlen
    zu kurz wartest bevor du umschaltest, da Du das TXC-Flag nicht verwendest
    wird Dein letztes Zeichen abgeschnitten.

    Select - Case würde sich für Deine erste Verzweigung im Bett_t-Code anbieten ...

    In deinem Rolladen.bas fehlt vermutlich ein .... brrrr, mich schüttelts ... goto main hinter deiner Pruefung: - Routine
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Hallo Vitis,

    Danke für die Hinweise, den Hardware/ Software-Vorschlag hab ich übers Internet von jemanden bekommen, man muß wohl doch noch einiges tun damit es läuft.

    Etwas Programmiererfahrung hab ich schon, evt. wurden mir schon ein paar Codeschnipsel in Bascom zur Ansteuerung der 485-Treiber reichen um es selbst hin zu bekommen.

    Bisher hab ich bei mir eine Siemens-Logo mit 8xAusgängen im Einsatz, nun gibts aber einige Stellen bei mir im Haus wo ich noch gerne ein paar Schaltstellen hätte, die beste Lösung wäre über dieses einfache 485-Bussystem, nur schade das die AVR 2313 nicht so leicht zu programmieren sind wie die Logo, dann wäre ich schon fertig !

    Mfg Jürgen

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Bascom Hilfe:

    CONFIG PRINT
    Top Previous Next
    Action

    Configure the UART to be used for RS-485


    Syntax

    CONFIG PRINT0 = pin

    CONFIG PRINT1 = pin

    Remarks

    pin
    The name of the PORT pin that is used to control the direction of an RS-485 driver.

    mode
    SET or RESET

    Use PRINT or PRINT0 for the first serial port. Use PRINT1 for the second serial port.

    When you use RS-485 half duplex communication you need a pin for the direction of the data. The CONFIG PRINT automates the manual setting/resetting. It will either SET or RESET the logic level of the specified pin before data is printed with the Bascom print routines. After the data is sent, it will inverse the pin so it goes into receive mode.

    You need to set the direction of the used pin to output mode yourself.


    See also

    CONFIG PRINTBIN

    Code:
     
    
    Example
    
    '------------------------------------------------------------------------------
    
    'name                     : rs485.bas
    
    'copyright                : (c) 1995-2006, MCS Electronics
    
    'purpose                  : demonstrates
    
    'micro                    : Mega48
    
    'suited for demo          : yes
    
    'commercial addon needed  : no
    
    '------------------------------------------------------------------------------
    
    $regfile = "m48def.dat"                                     ' we use the M48
    
    $crystal = 8000000
    
    $baud = 19200
    
     
    
    $hwstack = 32
    
    $swstack = 32
    
    $framesize = 32
    
     
    
    Config Print0 = Portb.0 , Mode = Set
    
    Config Pinb.0 = Output                                      'set the direction yourself
    
     
    
    Dim Resp As String * 10
    
    Do
    
      Print "test message"
    
      Input Resp                                               ' get response
    
    Loop
    in den Plänen hab ich auch mal rumgepinselt ... siehe Anhang
    Angehängte Dateien Angehängte Dateien
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #5
    Hallo Vitis,

    ich hab vorher selber mal getestet, klappt aber noch nicht so recht, und hab versucht den Code zu vereinfachen:

    'Sensor
    Code:
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    Portb = &B11111111
    Portd = &B1100000                                           'PullUp
    
    Main:
    Portd.2 = 1      '485 auf senden
    Waitms 10
    Do
    If Pinb.0 = 0 Then
    Goto 2
    Elseif Pinb.1 = 0 Then
    Goto 2
    Elseif Pinb.2 = 0 Then
    Goto 2
    Elseif Pinb.3 = 0 Then
    Goto 2
    Elseif Pinb.4 = 0 Then
    Goto 2
    Elseif Pinb.5 = 0 Then
    Goto 2
    Elseif Pinb.6 = 0 Then
    Goto 2
    Elseif Pinb.7 = 0 Then
    Goto 2
    End If
    
    Loop
    
    1:
    
    Goto Main
    
    
    2:
    Waitms 10
    Print "100"      ' oder print ? Chr(udr)
    Goto Main

    Code:
    'Aktor Einfacher String-Empfang
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    
    Dim S As String * 7
    Dim A As String * 4
    Dim X1 As Boolean
    Dim X2 As Boolean
    Dim X3 As Boolean
    Dim X4 As Boolean
    Dim Z As String * 1
    
    
    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts
    
    
    Main:
         S = ""
          Goto Auswerter
      Goto Main
    
    
    
    Onrxd:
      S = Chr(udr)     ' Wird hier das Zeichen empfangen ?
    Return
    
    
    
    Auswerter:
    
    If S = "100" Then
    
    Portb.1 = 1                                                 '1 für high
    
    End If
    
    S = ""
    
    Goto Main

    Was ich nicht verstehe ist wie der Aktor die Zeichenkette empfängt ?

    Danke für die Hinweise in der Bascom-Hilfe, schau ich mir dann an ! (der Anhang von Dir fehlt glaub ich )

    Mfg, Jürgen

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Siemens Logo wird nicht programmiert, bestenfalls fast and dirty zusammengeschustert ... mit programmierung hat das nicht viel zu tun, zumindest nicht mit AVRs, die sind nmämlich ungleich mächtiger und auch felxibler einsetzbar. Das hat aber halt den Nachteil, dass man sich für die Programmierung mehr Zeit lassen muss und sich mit der Programmierung auch mehr auseinander setzen muss, damit das auch zuverlässig funktioniert.
    Der erste Tip ... verabschiede dich von GOTO ... es gibt nur sehr sehr wenige Fälle, in denen Goto sinnvoll eingesetzt werden kann und sollte.
    Für den Unterprogramm - Aufruf gibts Gosub und Return, bzw. Call.
    Dann gibts da auch schöne Übergabe-Parameter, die sich, sinnvoll verwendet, deutlich auf die Codegröße und somit auf die Ausführungsgeschwindigkeiten auswirken.
    Das nächste ist, lad dir mal das Datenblatt des verwendeten Bausteins runter auf die Platte. Das kann viele Unklarheiten schnell aufklären. Z.B. was ist UDR ... im PDF gesucht sieht man sofort, USART Data Register.
    Dann überleg Dir mal ein systematisches Protokoll, das man auch "automatisieren" kann ... "!BA1" bis "!CC3" hat kein logisches System ...
    einfacher wärs "!set1", "!set2", "!set3", etc. das kann man dann schön auf pinb.0, pinb.1 etc. beziehen und man kann mit 1/10 Code arbeiten.

    > Was ich nicht verstehe ist wie der Aktor die Zeichenkette empfängt ?

    tja, das ist auch etwas konfus zu erklären ... urxc ist der interrupt, der bei empfangenem zeichen ausgelöst wird. der Haken ist, du liest das UDR-Register aus, das hat aber nur EINEN Wert, keinen String, sondern ein ASCII Zeichen. Dann wandelst DU diesesn Zeichenwert in einen String um mit CHR (Character). Das bedeutet, Du hat als String (S) ein Zeichen, keine Zeichenkette ... Da Du aber die Zeichen nicht anreihst wird die Zeichenkette 100 (3 Zeichen) nie erreicht.


    Der Anhang ist dran, als zip-File, musst aber eingeloggt sein um den ziehen zu können.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Hallo Vitis,

    Deine Meinung zur Logo kann ich so nicht ganz teilen, da werden teilweise schon sehr große Maschinen mit gesteuert.

    Bei meinem 485-Bus geht nichts im Moment, ich werde nachher mal den Hardwareaufbau zum 485-Baustein hin prüfen, es muß wohl was grundlegendes falsch sein da andere Programme auf den Controllern laufen.

    Gibts eigentlich eine einfache Methode (Prog-Einzeiler, ohne Interuppt usw.) um etwas auf den Bus zu senden und gleichzeitig ein einfache Methode für den Empfang, um festzustellen ob überhaupt was drüber geht ?

    Gruß, Jürgen

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    Die Programmierbaren Eigenschaften der Logo sind im Vergleich
    sehr begrenzt ... also im Vergleich zum ATTiny oder ATMega.
    Der Vorteil der Logo ist, man nimmt das Ding, pappts auf die
    Hutschiene und hat ne große Menge an Sorgen aus dem Kreuz.
    Spannungsversorgung, Schaltkontakte etc.. Es ist ne kleine
    SPS ... und das ne Maschine groß ist bedeutet nicht, dass sie
    viel "Hirn" braucht ...
    Ich hab hier große Maschinen im Betrieb die werden per
    Zeitschalter und Schützschaltung gesteuert ... ziemlich "dummes"
    Zeug, aber es funzt.
    Der AVR kann jedes Ereignis mit praktisch jeder Aktion verbinden,
    was die Anwendung sehr viel komplexer gestaltet, das sieht man
    schon am Befehlssatz der verwendeten Sprache, der deutlich
    umfangreicher ist als der der Logo.
    Hab mit beidem gearbeitet, die Logo nehm ich wenns robust sein soll,
    wenig Zeit bleibt und die Aufgabenstellung weniger komplex ist.


    was den Einzeiler angeht, so hatte ich DIr doch den Auszug aus der Bascom Hilfe gepostet.
    erst per config Print den Steuerpin deines 485-Busbeuasteins definieren und dann aeinfach per Print auf den Bus schreiben, das ist alles.
    auf der Gegenseite kannst Du einfach per waitkey() eingehende Zeichen empfangen und dann irgendwie darstellen.
    z.B. als Schaltzustand auf nem Port, z.B.
    Porta=waitkey()
    oder als Echo, natürlich dann auch den Schaltpin festlegen:
    dima as byte

    do

    a=waitkey()
    printbin a

    loop

    einfacher gehts nicht.
    Um den Bus selbst zu debuggen kann ich nur zum Oszilloskop raten,
    mit dem Multimeter wird das nix richtiges.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    12.12.2004
    Ort
    Trier
    Beiträge
    38
    Zitat Zitat von Vitis
    ...
    a=waitkey()
    printbin a
    ...
    einfacher gehts nicht.
    Vorsicht, PRINTBIN unterstützt die automatische Sende/Empfangs-Umschaltung nicht, wie im Anhang zu sehen ist.

    MFG
    Screwdriver
    Angehängte Dateien Angehängte Dateien

  10. #10
    Hallo Vitis,

    Danke für die Tipps, eine Art der Übertragung funktioniert jetzt schon, man kann den Port schalten, jedoch überträgt der Sensor Zeichen solange man den Taster drückt und der Aktor bringt diese auch so auf den Port.

    Wie es geht hab ich bisher nicht verstanden, ich sende ja nur eine 1 und diese wird auf Port B übertragen, meine Ausgangs-Led ist aber an Port B.1 angeschlossen die 1 kann aber eigentlich nur Port B.0 ansteuern ?? Rutschen die da irgendwie durch ?

    'Sensor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    Portb = &B11111111

    Config Portd = Output

    Do

    Portd.2 = 1

    If Pinb.1 = 0 Then
    Waitms 5
    Print "1"
    Waitms 5
    Portd.2 = 0
    Waitms 5
    End If

    Loop



    'Aktor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800

    Config Portb = Output
    Dim S As String * 5

    Portd.2 = 0

    Do

    Portb = Waitkey()

    Loop


    Trotzdem versteh ich nicht ganz warum die anderen Versuche gar nicht liefen, an der Hardware hab ich auch was geändert, die Pullup-Wiederstände zu GND und VSS am Bus hab ich entfernt, der LTC 485 scheint ohne besser zu laufen vielleicht lags auch daran.

    Mfg Jürgen

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test