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
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.
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.
Die Zeiten, in denen man in Basic nur unformatierten Spaghetticode schreiben konnte, sind rum!
Relais ohne Freilaufdiode zu schalten ist auch nicht anzuraten.
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
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
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
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
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
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
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
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
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
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
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 |
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
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.
BMP in PNG umbenannt was? Denkt auch an die GSM Nutzer, nicht jeder hat eine 50Mbit Anbindung
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
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
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.