- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 30

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

  1. #11
    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich hab noch ein bischen getestet und man kann jetzt einen Port über den Bus wunderbar schalten:

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

    Config Portd = Output

    Config Debounce = 100
    Set Portb.1

    Do
    Debounce Pinb.1 , 0 , Schalter , Sub
    Loop

    Schalter:

    Portd.2 = 1
    Waitms 10
    Print "111"
    Waitms 10
    Portd.2 = 0
    'Waitms 10

    Return

    End



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

    Config Portb = Output
    Dim Empfangen As String * 3

    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts

    Portd.2 = 0

    Do
    If Len(empfangen) > 2 Then 'wenn mehr als 2 Zeichen empfangen

    'If Empfangen = "111" Then

    Waitms 200
    Toggle Portb.1

    Empfangen = "" 'löschen

    'End if
    End If
    Loop
    End

    Onrxd:
    Empfangen = Empfangen + Chr(udr)
    Return


    Ein gewisses Problem scheint es trotzdem noch zu geben, ich würde gerne statt If Len(empfangen) > 2 Then (also mehr als 2 Zeichen empfangen) lieber 'If Empfangen = "111" Then verwenden, aber der Wert von Empfangen scheint nicht gleich zu sein obwohl so gesendet.

    Möglicherweise ein Formatproblem das evt. von ASCII auf String gewandelt werden muß ?

    Was ich auch noch vermute das die Zeichen nicht sauber gesendet wird, der Sendepuffer beim Sensor noch irgendwelchen Schrott mitsendet ?
    Wie kann man den Sendepuffer löschen bevor ich meine Zeichen übertrage ?

    Mfg, Jürgen

  2. #12
    Hallo,

    ich hab jetzt den Code noch mal komplett überarbeitet
    und es funktioniert, allerdings nur bei sehr kurzer Leitung, bei langer
    Leitung nicht.

    Sind die 485 LTCs empfindlich also ich hab die 120 Ohm an beiden Enden +
    jeweils 4,7k einmal gegen + und GND sollte doch gehen.

    Was müßte man am Code ändern um die Sende - Empfangsqualität zu verbessern ?

    Mfg Jürgen

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

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

    Config Debounce = 70
    Set Portb.1

    Do
    Debounce Pinb.0 , 0 , Schalter1 , Sub
    Debounce Pinb.1 , 0 , Schalter2 , Sub
    Loop

    Schalter1:
    Waitms 30
    Print "!10"
    Waitms 30
    Return

    Schalter2:
    Waitms 30
    Print "!11"
    Waitms 30
    Return

    End



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

    Config Portb = Output
    Dim A As String * 3
    Dim Z As String * 1
    Dim B As String * 3

    On Urxc Onrxd
    Enable Urxc
    Enable Interrupts

    Portd.2 = 0

    Do
    If Len(a) > 2 Then
    B = A
    Z = Mid(a , 1 , 1 )
    If Z = "!" Then
    B = Mid(a , 1 , 3)
    If B = "!10" Then

    Toggle Portb.0
    A = ""

    Elseif B = "!11" Then

    Toggle Portb.1
    A = ""

    End If
    End If
    End If

    Waitms 100

    Loop
    End

    Onrxd:
    A = A + Chr(udr)
    Return

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    4800 baud ist nicht viel, daran hängts bestimmt nicht.
    kann an der Außenbeschaltung der 485 Bausteine hängen ...
    dreh die Pullup-Pulldown mal andersrum, möglich das Du die
    vertauscht hast.

    dann noch:
    Print "!10"

    Du sendest so automatisch nicht nur 3, sondern 5 Zeichen, nämlich als
    Abschluss CR + LF, also im ASCII-Code das Zeichen 10 und 13.
    Durch Ergänzung eines Semikolons am Ende kann man das unterdrücken.

    Print "!10";
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Männer, hier spricht euer mod.

    Nehmt doch bitte "code"-Tags. Das wird ja total unübersichtlich, ausserdem sieht Source-Code im Autoformat sehr bescheiden aus.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15

    Final Code !

    Hallo,

    es läuft jetzt perfekt hier nun mein finaler Code, die wichtigen Punkte sind:

    - Config Print verwenden

    - print mit Strichpunkt hinten damit nur das wirkliche Zeichen gesendet wird

    - Config Serialin = Buffered verwenden, da kommt es sehr auf die richtige Einstellung an

    - Als Byte empfangen mit Inkey + Ischarwaiting

    - und sehr viel Geduld !!


    Code:
    'Sensor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    Portb = &B11111111
    
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Print = Portd.2 , Mode = Set
    Config Pind.2 = Output
    
    Config Debounce = 30
    
    Waitms 300
    
    
    Do
    Debounce Pinb.0 , 0 , Schalter1 , Sub
    Debounce Pinb.1 , 0 , Schalter2 , Sub
    Debounce Pinb.2 , 0 , Schalter3 , Sub
    Debounce Pinb.3 , 0 , Schalter4 , Sub
    Debounce Pinb.4 , 0 , Schalter5 , Sub
    Debounce Pinb.5 , 0 , Schalter6 , Sub
    Debounce Pinb.6 , 0 , Schalter7 , Sub
    Debounce Pinb.7 , 0 , Schalter8 , Sub
    Loop
    
    
    Schalter1:
    Print "!10";
    Return
    
    Schalter2:
    Print "!11";
    Return
    
    Schalter3:
    Print "!12";
    Return
    
    Schalter4:
    Print "!13";
    Return
    
    Schalter5:
    Print "!14";
    Return
    
    Schalter6:
    Print "!15";
    Return
    
    Schalter7:
    Print "!16";
    Return
    
    Schalter8:
    Print "!17";
    Return
    
    End

    Code:
    'Aktor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    
    Dim A As String * 5
    Dim Z As String * 1
    Dim B As String * 5
    Dim C As Byte
    
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Serialin = Buffered , Size = 6
    Config Portb = Output
    
    Enable Interrupts
    
    Portd.2 = 0
    
    
    Do
    
    C = Ischarwaiting()
      If C = 1 Then
       C = Inkey()
       A = A + Chr(c)
    End If
    
    
    If Len(a) > 2 Then
    B = A
    Z = Mid(a , 1 , 1 )
    End If
    
    
    If Z = "!" Then
    B = Mid(a , 1 , 5)
    End If
    
    
    If B = "!10" Then
    Toggle Portb.0
    A = ""
    
    Elseif B = "!11" Then
    Toggle Portb.1
    A = ""
    
    Elseif B = "!12" Then
    Toggle Portb.2
    A = ""
    
    Elseif B = "!13" Then
    Toggle Portb.3
    A = ""
    
    Elseif B = "!14" Then
    Toggle Portb.4
    A = ""
    
    Elseif B = "!15" Then
    Toggle Portb.5
    A = ""
    
    Elseif B = "!16" Then
    Toggle Portb.6
    A = ""
    
    Elseif B = "!17" Then
    Toggle Portb.7
    A = ""
    
    End If
    
    Waitms 10
    
    Loop
    
    End
    Mfg Jürgen

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von Bammel
    Registriert seit
    11.12.2004
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.400
    bitte wie der moderator schon sagte die code-tags benutzen "[code.]der quellcode[code/.]" die punkte in den tags entfernen

    das ganze wird dann übersichtlicher.

    kann man den UART port eigentlich auch frei auf andere ports setzten? da wäre für nen kleiner projekt von mir recht wichtig weil ich leider die UART ports anderweitig belegen musste.

  7. #17
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Zitat Zitat von Bammel
    bitte wie der moderator schon sagte die code-tags benutzen "[code.]d

    kann man den UART port eigentlich auch frei auf andere ports setzten? da wäre für nen kleiner projekt von mir recht wichtig weil ich leider die UART ports anderweitig belegen musste.
    Moin moin.

    Ja, Wenn Du die Hardware UART ausschaltest ($Baud) weglassen,
    kannst Du ( auch mehrmals) software UART verwenden. Dort kannst
    Du (Config serial) die Port Pins selber wählen. Beispiele gibt es wie
    immer in der sehr guten Bascom Hilfe. Man sollte! wenn mal etwas
    Zeit übrig ist, die Bascomhilfs Beispiele alle nacheinander einmal
    ausprobieren, das kann sehr sehr Lehrreich sein. Außerdem ist
    man angenehm überrascht was man mit Bascom so alles machen kann!

    Gruß Richard

  8. #18
    Hallo,

    hab über die Feiertage meinen 485 Bus-Aktor überarbeitet und in meine Hausinstallation integriert, im Moment zur Steuerung der Terrassen und Außenbeleuchtung.

    Es gibt jetzt 6x von einander unabhängige Comfort Zeitschaltungen (Ein - Aus wie Tasterschaltung), 2x Stromstoßschaltungen und eine Zentral Ein/Aus Steuerung.

    Eine ausführliche Dokumentation des Projektes hab ich hier
    http://juergen151.bplaced.net/

    Mfg Jürgen

    Code:
    'Aktor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    
    Dim A As String * 5
    Dim Z As String * 1
    Dim B As String * 5
    Dim C As Byte
    Dim B0 As Integer
    Dim B1 As Integer
    Dim B2 As Integer
    Dim B3 As Integer
    Dim B4 As Integer
    Dim B5 As Integer
    Dim B6 As Integer
    Dim B7 As Integer
    
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Serialin = Buffered , Size = 6
    Config Portb = Output
    
    Enable Interrupts
    
    Portd.2 = 0
    
    B0 = 6000
    B1 = 6000
    B2 = 32000
    B3 = 32000
    B6 = 2
    B7 = 2
    
    
    Do
    
    C = Ischarwaiting()
      If C = 1 Then
       C = Inkey()
       A = A + Chr(c)
    End If
    
    
    If Len(a) > 2 Then
    B = A
    Z = Mid(a , 1 , 1 )
    End If
    
    
    If Z = "!" Then
    B = Mid(a , 1 , 5)
    End If
    
                                          ' 6x von einander unabhängige Comfort Zeitschaltungen 2x Stromstoßschaltungen
                                          ' Achtung Zähler Integer nur bis 32700 
    
    If B = "!10" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
    If Portb.0 = 0 Then
    Set Portb.0
    B0 = 6000
    Else
    Reset Portb.0
    End If
    A = ""
    End If
    
    If B = "!11" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
    If Portb.1 = 0 Then
    Set Portb.1
    B1 = 6000
    Else
    Reset Portb.1
    End If
    A = ""
    End If
    
    If B = "!12" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
    If Portb.2 = 0 Then
    Set Portb.2
    B2 = 32000
    Else
    Reset Portb.2
    End If
    A = ""
    End If
    
    If B = "!13" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
    If Portb.3 = 0 Then
    Set Portb.3
    B3 = 32000
    Else
    Reset Portb.3
    End If
    A = ""
    End If
    
    If B = "!14" Then          'Stromstoßschaltung
    If Portb.4 = 0 Then
    Set Portb.4
    Else
    Reset Portb.4
    End If
    A = ""
    End If
    
    If B = "!15" Then        'Stromstoßschaltung
    If Portb.5 = 0 Then
    Set Portb.5
    Else
    Reset Portb.5
    End If
    A = ""
    End If
    
    If B = "!16" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
    If Portb.6 = 0 Then
    Set Portb.6
    B6 = 2
    Else
    Reset Portb.6
    End If
    A = ""
    End If
    
    If B = "!17" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
    If Portb.7 = 0 Then
    Set Portb.7
    B7 = 2
    Else
    Reset Portb.7
    End If
    A = ""
    End If
    
    If B = "!18" Then          'Funktion Zentral Ein
    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3
    Set Portb.4
    Set Portb.5
    Set Portb.6
    Set Portb.7
    A = ""
    End If
    
    If B = "!19" Then          'Funktion Zentral Aus
    Reset Portb.0
    Reset Portb.1
    Reset Portb.2
    Reset Portb.3
    Reset Portb.4
    Reset Portb.5
    Reset Portb.6
    Reset Portb.7
    A = ""
    End If
    
    
    Decr B0
    If B0 = 0 Then
    Reset Portb.0
    B0 = 6000
    End If
    
    Decr B1
    If B1 = 0 Then
    Reset Portb.1
    B1 = 6000
    End If
    
    Decr B2
    If B2 = 0 Then
    Reset Portb.2
    B2 = 32000
    End If
    
    Decr B3
    If B3 = 0 Then
    Reset Portb.3
    B3 = 32000
    End If
    
    
    
    Decr B6
    If B6 = 0 Then
    Reset Portb.6
    B6 = 2
    End If
    
    Decr B7
    If B7 = 0 Then
    Reset Portb.7
    B7 = 2
    End If
    
    
    
    
    Waitms 20          '10 bis max 20 ms
    
    Loop
    
    
    End

  9. #19
    Hallo,

    beim Anschluß eines zweiten Sensor-Moduls hab ich festgestellt das es nicht richtig läuft bzw. der Aktor-Controller stürzt nach kurzer Zeit ab.

    Nehme ich den zusätzlichen Sensor wieder weg vom Bus funktioniert wieder alles !

    Die Hardware hab ich schon sehr genau geprüft ist ok, ich glaube fast es ist ein Softwareproblem des Sensors, kann es sein das beim Anschluß des zweiten Sensors, beide nicht mehr richtig senden können ?

    Vielleicht hat jemand einen Tip woran es liegen könnte !

    Mfg Jürgen

    Code:
    'Sensor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    Portb = &B11111111
    Portd = &B1100000                'PullUp
    
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Print = Portd.2 , Mode = Set
    Config Pind.2 = Output
    
    Config Debounce = 30
    
    Waitms 300
    
    
    Do
    Debounce Pinb.0 , 0 , Schalter1 , Sub
    Debounce Pinb.1 , 0 , Schalter2 , Sub
    Debounce Pinb.2 , 0 , Schalter3 , Sub
    Debounce Pinb.3 , 0 , Schalter4 , Sub
    Debounce Pinb.4 , 0 , Schalter5 , Sub
    Debounce Pinb.5 , 0 , Schalter6 , Sub
    Debounce Pinb.6 , 0 , Schalter7 , Sub
    Debounce Pinb.7 , 0 , Schalter8 , Sub
    Loop
    
    
    Schalter1:
    Print "!10";
    Return
    
    Schalter2:
    Print "!11";
    Return
    
    Schalter3:
    Print "!12";
    Return
    
    Schalter4:
    Print "!13";
    Return
    
    Schalter5:
    Print "!14";
    Return
    
    Schalter6:
    Print "!15";
    Return
    
    Schalter7:
    Print "!16";
    Return
    
    Schalter8:
    Print "!17";
    Return
    
    
    End


    Code:
    'Aktor
    $regfile = "attiny2313.dat"
    $crystal = 3579545
    $baud = 4800
    
    Dim A As String * 5
    Dim Z As String * 1
    Dim B As String * 5
    Dim C As Byte
    Dim B0 As Integer
    Dim B1 As Integer
    Dim B2 As Integer
    Dim B3 As Integer
    Dim B4 As Integer
    Dim B5 As Integer
    Dim B6 As Integer
    Dim B7 As Integer
    
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    Config Serialin = Buffered , Size = 6
    Config Portb = Output
    
    Enable Interrupts
    
    Portd.2 = 0
    
    B0 = 6000
    B1 = 6000
    B2 = 32000
    B3 = 32000
    B6 = 2
    B7 = 2
    
    
    Do
    
    C = Ischarwaiting()
      If C = 1 Then
       C = Inkey()
       A = A + Chr(c)
    End If
    
    
    If Len(a) > 2 Then
    B = A
    Z = Mid(a , 1 , 1 )
    End If
    
    
    If Z = "!" Then
    B = Mid(a , 1 , 5)
    End If
    
                                          ' 6x von einander unabhängige Comfort Zeitschaltungen 2x Stromstoßschaltungen
                                          ' Achtung Zähler Integer nur bis 32700 
    
    If B = "!10" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
    If Portb.0 = 0 Then
    Set Portb.0
    B0 = 6000
    Else
    Reset Portb.0
    End If
    A = ""
    End If
    
    If B = "!11" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
    If Portb.1 = 0 Then
    Set Portb.1
    B1 = 6000
    Else
    Reset Portb.1
    End If
    A = ""
    End If
    
    If B = "!12" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
    If Portb.2 = 0 Then
    Set Portb.2
    B2 = 32000
    Else
    Reset Portb.2
    End If
    A = ""
    End If
    
    If B = "!13" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
    If Portb.3 = 0 Then
    Set Portb.3
    B3 = 32000
    Else
    Reset Portb.3
    End If
    A = ""
    End If
    
    If B = "!14" Then          'Stromstoßschaltung
    If Portb.4 = 0 Then
    Set Portb.4
    Else
    Reset Portb.4
    End If
    A = ""
    End If
    
    If B = "!15" Then        'Stromstoßschaltung
    If Portb.5 = 0 Then
    Set Portb.5
    Else
    Reset Portb.5
    End If
    A = ""
    End If
    
    If B = "!16" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
    If Portb.6 = 0 Then
    Set Portb.6
    B6 = 2
    Else
    Reset Portb.6
    End If
    A = ""
    End If
    
    If B = "!17" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
    If Portb.7 = 0 Then
    Set Portb.7
    B7 = 2
    Else
    Reset Portb.7
    End If
    A = ""
    End If
    
    If B = "!18" Then          'Funktion Zentral Ein
    Set Portb.0
    Set Portb.1
    Set Portb.2
    Set Portb.3
    Set Portb.4
    Set Portb.5
    Set Portb.6
    Set Portb.7
    A = ""
    End If
    
    If B = "!19" Then          'Funktion Zentral Aus
    Reset Portb.0
    Reset Portb.1
    Reset Portb.2
    Reset Portb.3
    Reset Portb.4
    Reset Portb.5
    Reset Portb.6
    Reset Portb.7
    A = ""
    End If
    
    
    Decr B0
    If B0 = 0 Then
    Reset Portb.0
    B0 = 6000
    End If
    
    Decr B1
    If B1 = 0 Then
    Reset Portb.1
    B1 = 6000
    End If
    
    Decr B2
    If B2 = 0 Then
    Reset Portb.2
    B2 = 32000
    End If
    
    Decr B3
    If B3 = 0 Then
    Reset Portb.3
    B3 = 32000
    End If
    
    
    
    Decr B6
    If B6 = 0 Then
    Reset Portb.6
    B6 = 2
    End If
    
    Decr B7
    If B7 = 0 Then
    Reset Portb.7
    B7 = 2
    End If
    
    
    
    
    Waitms 20          '10 bis max 20 ms
    
    Loop
    
    
    End
    [/code]
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken 485-bus_avr_2313_sensor_aktor_-_stk200_seite_1.jpg  

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.555
    Hmmm, irgendwie blicke ich nicht wie Du mit Deinem Programm
    eine RS 485 Schnittstelle realisierst??? RS 485 ist eine Differenz
    Schnittstelle und braucht passende Treiber IC´s, z.B. SN75176 oder
    ähnlich. Das Lesen/Schreiben muss dann über Software Protokoll
    realisiert werden oder man nimmt eine 4 Draht Übertragung,
    2 Leitungen fürs Senden 2 Leitungen zum Empfangen. Dabei ist das
    Protokoll dann einfacher. Dafür ist dann auch die Leitungslänge
    bis ca 1200 m kein Problem.

    Gruß Richard

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen