mikrocontroller.net

Forum: Haus & Smart Home Master Slave Verbindung mit AVR2313 und 485-Bustreibern ?


Autor: Jürgen Jürgen (juergen151)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

in deinem Emfangsprogramm ist ein kleiner Fehler und zwar in dem 
Prüfungs-sub, der Ausdruck "A = Mid(s , 1 , 6)" muss vor dem Sprung zur 
Auswertung stehen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schaltest du die Transistoren nur über die internen Pullups ein, oder 
indem du den Pin aktiv auf 1 setzt? In letzerem Fall hast du ohne 
Vorwiderstand einen soliden Kurzschluss über die BE-Strecke.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Zeiten, in denen man in Basic nur unformatierten Spaghetticode 
schreiben konnte, sind rum!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Relais ohne Freilaufdiode zu schalten ist auch nicht anzuraten.

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gast, Hallo A.K.,

Danke für die Hinweise, bitte nach Möglichkeit den hobbymäßigen Aufbau 
vernachläsigen, die Transistoren / Relais benutz ich gar nicht.

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

'Sensor
$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




'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 ?

Mfg, Jürgen

Autor: BEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jup durch Enable Urxc und S = Chr(udr)
emfängst du alles an einen Stück in der Variable S (7 Strings)

Nun, die Auswertung muß anders erfolgen:

(Zeichen für Zeichen)
D.h. Entweder:

Startzeichen vorhanden??
Und/Oder auch:

Länge des Empfangskette überprüfen (String)

Dann erst erfolg die genaue Auswertung

  If Len(s) > 3 Then - Empfangskette = 3 Strings ?
    A = S            - Speichere in A
      S = ""         - Leere Empfangsspeicher
    Goto Pruefung    - Sprung
   End If
Goto Main

Onrxd:
  S = S + Chr(udr)   - Lese Empfang Buchstabe für Buchstabe und in S 
speichern
Return

Pruefung:
Z = Mid(s , 1 , 1 )  - Startzeichen Lesen
If Z = "!" Then      - Z ist ! ? dann handelt es sich um ein Befehl
                       springe zur Befehlsauswertung
Goto Auswerter
A = Mid(s , 1 , 6)
Else
S = ""               - Speicher löschen
End If


Für nähere Infos habe ich jetzt keine Zeit. Hoffe diese helfen Dir ein 
wenig weiter.

Gruss
BEN

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ben,

Danke für deine ausführliche Erklärung, ich habs probiert geht aber 
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

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: BEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

Das ist und/oder mit ein Timing Problem.
Jeder Befehl brauch seine Verarbeitungszeit. Auch mit Bascom muß man 
etwas darauf achten.

Gerade bei der Empfangsroutine darauf achten!

TIP:


macvh das mit char und while oder for Schleife!

definiere Puffer als Char
definiere Empfangsvariable als String mit einer bestimmten Länge
1. Empfangszeichen prüfen z.B. "!"   --- OK ?
2. Empfangen und speichern (Empfangsvariablevariable (String)+ Puffer 
(Char))
3. Länge auswerten --- 0k ?
4. Auswerten mit der gewünschten Empfangsnachricht

NachSchleife immer Buffer löschen

So spart man sich Fehlermeldungen und Probleme.

Empfangen = Empfangen + Chr(udr) ist zwar OK, übersichtlicher funk. es 
nach meiner Methode.

Also
Chr als Byte Variable ->
und diese zu einer String zusammenführen.

Grüße

BEN

Autor: BEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachrag:
we duach den Startzeichen fragst ist diese schonmal weg.
D.H. diesen musst du in der nachfolgenden Zeichenkette ausschliessen 
bzw. zur Empfangsvariable hinzufügen und dann auswerten.

Im Empfangspuffer steht nämlich nur die letzte Zeichekette zur Verfügung

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Ben,

Danke für die Hinweise, ich hab jetzt den Code noch mal umgeschrieben 
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.

Wie wolltest Du das mit dem Byte machen ? Also als Byte senden ist 
besser als String ?

Kannst Du meinen Code mal entsprechend Deiner Methode anpassen ? Wäre 
nett, dann versuch ich es noch mal mit der langen Leitung !

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

Autor: BEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

> Wie wolltest Du das mit dem Byte machen ? Also als Byte senden ist
besser als String ?

Nein, ruhig als String übertragen.
Aber zum empfangen:

Onrxd:
A = A + Chr(udr)
Return

Verbesserung:
besser die inkey funktion benutzen
weg mit

On Urxc Onrxd
Enable Urxc
Enable Interrupts
usw.

z.B. X  Byte

inkey Zuweisung an x
....
nach erster Auswerung zusammenfügen
Beispiel
a = a + Chr(x)
....



weiterhin auch zu verbessern:

Config Debounce = 70
Versuch erstmal ohne Tastenentprellungsvariab. ansonsten Wert Debounce = 
30 nehmen.

Keine SUBS verwenden!

zur sicheren Datenübertragung (Waitms) folgende Werte z.B. versuchen.
Schalter1:
Waitms 50
Print "!10"
Waitms 10
Return


Gruss
Ben


http://members.home.nl/bzijlstra/software/communic...

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 !!



'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




'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

Autor: BEN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Glückwunsch!

zur weiteren Optimierung

Sendercode schreibst Du:
Config Print = Portd.2 , Mode = Set
Config Pind.2 = Output


1.Die Zuweisung der automatische Datenrichtungsumschaltung für den 
Half-Duplex Modus an Portd.2 für Steuerleitung des "485 Treibers".
Sollte auch am Empfänger (Aktor) funktionieren!

Starten mit
While A <> "!"
  B = Inkey()

usw.

a)Prüfe Länge der Nachricht (LEN)
b)Prüfe Ende der Nachricht z.B. "*"
c)Werte Nachricht aus.
d)String a z b - den richtigen wert zuweisen.

Somit überflüssig:

- Serialin
und
- ischarwaiting

Viel Spaß
BEN

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
'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

Autor: Jürgen Jürgen (juergen151)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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


'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





'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

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Du mußt den von Dir "Sensor" genannten Teilnehmer nach dem Senden auf 
Empfang stellen, sonst kann der zweite nicht auf den RS485-Bus zugreifen 
-> zwei Sender aktiv == Kollision mit Datenmüll.

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BMP in PNG umbenannt was? Denkt auch an die GSM Nutzer, nicht jeder hat 
eine 50Mbit Anbindung

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Route & Thomas,

ja das mit dem Umschalten von Senden auf Empfangen hatte ich ganz 
vergessen, so ist es halt wenn man sich nur alle 6 Monate mit damit 
beschäftigt.

Ein Protokoll wollte ich unbedingt vermeiden um das Ganze nicht unnötig 
kompliziert zu machen, mit einem Sender + einem Empfänger hats ja bisher 
auch wunderbar funktioniert.

Ich hab mir den Code des Senders jetzt schon mal angesehen und 
abgeändert für Umschaltung Senden/Empfangen, bin aber noch nicht dazu 
gekommen das ganze zu probieren.

Ich meine aber es sollte funktionieren, wenn man davon ausgeht das 
verschiedene Taster nicht gleichzeitig gedrückt werden, obwohl wenn man 
bedenkt wie kurz diese Zeiten sind wird man das wohl kaum schaffen genau 
gleichzeitig zu drücken.

Wie seht Ihr das ist das so lauffähig ?

Mfg Jürgen

@Thomas / Es ist ein PNG nichts umbennant und ich habe auch nur 3 MBit


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

$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:
Portd.2 = 1
Waitms 50
Print "!10";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter2:
Portd.2 = 1
Waitms 50
Print "!11";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter3:
Portd.2 = 1
Waitms 50
Print "!12";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter4:
Portd.2 = 1
Waitms 50
Print "!13";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter5:
Portd.2 = 1
Waitms 50
Print "!14";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter6:
Portd.2 = 1
Waitms 50
Print "!15";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter7:
Portd.2 = 1
Waitms 50
Print "!16";
Waitms 50
Portd.2 = 0
Waitms 50
Return

Schalter8:
Portd.2 = 1
Waitms 50
Print "!17";
Waitms 50
Portd.2 = 0
Waitms 50
Return


End

Autor: Jochen S. (jochen_s)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schön zu sehen, dass Projekte, die man vor Jahren veröffentlicht und 
schon seit längerem nicht mehr verfolgt noch leben und weiter optimiert 
werden...


Die Daten in der ersten Zip sind alle von mir.... aber ich habe es 
damals veröffentlicht also alles kein Problem. Ich komme hier nur drauf 
weil ich zwischendurch umgezogen bin und nun wieder anfange mir einen 
Bus aufzubauen.....

Danke an alle die an der Optimierung mitgearbeitet haben..

Gruß
Jochen

Autor: Jürgen Jürgen (juergen151)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jochen,

dein Projekt hat mich praktisch dazu gebracht den 485-Bus umzusetzen.

Ich habs nun ausführlich getestet, vergesst meinen Code vom letzten 
Posting, es ist wohl tatsächlich so wenn ein Dritter Bus-Teilnehmer dran 
ist gehts nicht ohne Software-Protokoll, ich war bisher immer der 
Meinung das der RS485 Chip dies bereits hardwaremäßig tut.

Wie schwierig ist es wohl das Protokoll in meinen biherigen Code 
einzufügen ? Geht das überhaupt mit Bascom ? Jochen vielleicht kannst Du 
das mal probieren, wäre nett ! Oder gerne auch ein anderer 
Bascom-Experte !

Mfg Jürgen

Autor: Ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht schon mit Bascom!

Mal zwei Fragen:

Wie sieht dein Versuchsaufbau aus?


Tipps von mir:

a) Wenn möglich keine Subs verwenden!

Weiterhig je nach subs und sprungadressen weret optimieren
$hwstack = 32
$swstack = 10
$framesize = 40


b)
Beispiel:
Print "!15";
Waitms 50  <--- Wartezeit eventuell optimieren
(Diese muss hier nicht so hoch) sein! -)
Sonst entstehen vielleicht Timing Probleme.

c)Empfangspuffer immer löschen, solange du den Versuchsaufbau hast 
viellecht sogar Übertragungsdaten über Terminal visualisieren.

d) Programm strukturieren. zb Init: Main: usw. damit nicht nur return 
angegeben wird. sonder zb. main.

e) neuer Aufbau mit Atmega8 auf 1mhz ohne quarz schwingen lassen.

f)Programm klein halten, Versuchsaufbau mit den 3 Modulen realisieren, 
testen. Schritt für Schritt (Wichtig Visualisierung der empfangenen 
daten aller 3 Module , damit man sieht wo es hackt oder stehen bleibt.

Es geht, nur Mut.

Beispiel: http://www.kaypohl.privat.t-online.de/kayib.html (nicht von 
mir)
http://home.arcor.de/dirk.milewski/seite75.html

Ben

Autor: Robert L. (lrlr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ich war bisher immer der
>Meinung das der RS485 Chip dies bereits hardwaremäßig tut.

naja, NOCH ist das ja keine problem,

aber wenn das ding mal im haus ist, mit 50 teilnehmern, sind solche 
"och, ich war der meinung dass geht schon" momente (die dann vielleich 
zu tagen werden) wohl unangenehmer..

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.