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


von Jürgen J. (juergen151)


Angehängte Dateien:

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

von Gast (Gast)


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.

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


Lesenswert?

Die Zeiten, in denen man in Basic nur unformatierten Spaghetticode 
schreiben konnte, sind rum!

von (prx) A. K. (prx)


Lesenswert?

Relais ohne Freilaufdiode zu schalten ist auch nicht anzuraten.

von Jürgen J. (juergen151)


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

von BEN (Gast)


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

von Jürgen J. (juergen151)


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

von Jürgen J. (juergen151)


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

von BEN (Gast)


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

von BEN (Gast)


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

von Jürgen J. (juergen151)


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

von BEN (Gast)


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/communication/Benbus.htm

von Jürgen J. (juergen151)


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

von BEN (Gast)


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

von Jürgen J. (juergen151)


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
1
'Aktor
2
$regfile = "attiny2313.dat"
3
$crystal = 3579545
4
$baud = 4800
5
6
Dim A As String * 5
7
Dim Z As String * 1
8
Dim B As String * 5
9
Dim C As Byte
10
Dim B0 As Integer
11
Dim B1 As Integer
12
Dim B2 As Integer
13
Dim B3 As Integer
14
Dim B4 As Integer
15
Dim B5 As Integer
16
Dim B6 As Integer
17
Dim B7 As Integer
18
19
$hwstack = 32
20
$swstack = 10
21
$framesize = 40
22
23
Config Serialin = Buffered , Size = 6
24
Config Portb = Output
25
26
Enable Interrupts
27
28
Portd.2 = 0
29
30
B0 = 6000
31
B1 = 6000
32
B2 = 32000
33
B3 = 32000
34
B6 = 2
35
B7 = 2
36
37
38
Do
39
40
C = Ischarwaiting()
41
  If C = 1 Then
42
   C = Inkey()
43
   A = A + Chr(c)
44
End If
45
46
47
If Len(a) > 2 Then
48
B = A
49
Z = Mid(a , 1 , 1 )
50
End If
51
52
53
If Z = "!" Then
54
B = Mid(a , 1 , 5)
55
End If
56
57
                                      ' 6x von einander unabhängige Comfort Zeitschaltungen 2x Stromstoßschaltungen
58
                                      ' Achtung Zähler Integer nur bis 32700 
59
60
If B = "!10" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
61
If Portb.0 = 0 Then
62
Set Portb.0
63
B0 = 6000
64
Else
65
Reset Portb.0
66
End If
67
A = ""
68
End If
69
70
If B = "!11" Then          'Comfort Zeitschaltung kurz  Ein - Aus wie Tasterschaltung
71
If Portb.1 = 0 Then
72
Set Portb.1
73
B1 = 6000
74
Else
75
Reset Portb.1
76
End If
77
A = ""
78
End If
79
80
If B = "!12" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
81
If Portb.2 = 0 Then
82
Set Portb.2
83
B2 = 32000
84
Else
85
Reset Portb.2
86
End If
87
A = ""
88
End If
89
90
If B = "!13" Then           'Comfort Zeitschaltung Lang  Ein - Aus wie Tasterschaltung
91
If Portb.3 = 0 Then
92
Set Portb.3
93
B3 = 32000
94
Else
95
Reset Portb.3
96
End If
97
A = ""
98
End If
99
100
If B = "!14" Then          'Stromstoßschaltung
101
If Portb.4 = 0 Then
102
Set Portb.4
103
Else
104
Reset Portb.4
105
End If
106
A = ""
107
End If
108
109
If B = "!15" Then        'Stromstoßschaltung
110
If Portb.5 = 0 Then
111
Set Portb.5
112
Else
113
Reset Portb.5
114
End If
115
A = ""
116
End If
117
118
If B = "!16" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
119
If Portb.6 = 0 Then
120
Set Portb.6
121
B6 = 2
122
Else
123
Reset Portb.6
124
End If
125
A = ""
126
End If
127
128
If B = "!17" Then         'Comfort Zeitschaltung kurzer Impuls für externe Ansteuerung
129
If Portb.7 = 0 Then
130
Set Portb.7
131
B7 = 2
132
Else
133
Reset Portb.7
134
End If
135
A = ""
136
End If
137
138
If B = "!18" Then          'Funktion Zentral Ein
139
Set Portb.0
140
Set Portb.1
141
Set Portb.2
142
Set Portb.3
143
Set Portb.4
144
Set Portb.5
145
Set Portb.6
146
Set Portb.7
147
A = ""
148
End If
149
150
If B = "!19" Then          'Funktion Zentral Aus
151
Reset Portb.0
152
Reset Portb.1
153
Reset Portb.2
154
Reset Portb.3
155
Reset Portb.4
156
Reset Portb.5
157
Reset Portb.6
158
Reset Portb.7
159
A = ""
160
End If
161
162
163
Decr B0
164
If B0 = 0 Then
165
Reset Portb.0
166
B0 = 6000
167
End If
168
169
Decr B1
170
If B1 = 0 Then
171
Reset Portb.1
172
B1 = 6000
173
End If
174
175
Decr B2
176
If B2 = 0 Then
177
Reset Portb.2
178
B2 = 32000
179
End If
180
181
Decr B3
182
If B3 = 0 Then
183
Reset Portb.3
184
B3 = 32000
185
End If
186
187
188
189
Decr B6
190
If B6 = 0 Then
191
Reset Portb.6
192
B6 = 2
193
End If
194
195
Decr B7
196
If B7 = 0 Then
197
Reset Portb.7
198
B7 = 2
199
End If
200
201
202
203
204
Waitms 20          '10 bis max 20 ms
205
206
Loop
207
208
209
End

von Jürgen J. (juergen151)



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

von Route_66 (Gast)


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.

von Thomas (kosmos)


Lesenswert?

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

von Jürgen J. (juergen151)


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

von Jochen S. (jochen_s)


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

von Jürgen J. (juergen151)


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

von Ben (Gast)


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

von Robert L. (lrlr)


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..

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.