Hallo, Bin neu hier und hoffe hier einen Gedankenanstoß zu bekommen, Mein Vorhaben. Auf eine Modellbahn fahren Autos einen Magnetband entlang ( Carsystem) Jedes Auto hat einen Akku an Board. Diese Autos werden über eine PC Software angesteuert und somit über die Anlage gelenkt. soweit dazu. Da das ganze ja automatisch läuft sollen die Autos nun auch je nach Ladeszustand des Akkus in einen Bereich gebracht werden zu Aufladen. Ich würde dazu gerne eine Strecke auf der Anlage mit einer festen länge zB. 50 cm definieren.Am Anfang und ende der Stecke ist jeweils ein Hallsensor verbaut. Bei auslösen des ersten Sensores sollte die Zeitmessung beginnen und bei Auslösen des Zweiten Stoppen. Die gemessene Zeit muss dann mit einer Zeit verglichen werden welche ich vorher ermitteln muss und diese dann fest in der Programmierung eingtragen ist. Wenn die gemessene Zeit kürzer ist als die eingetragene sollte ein Ausgang zuschalten. Dieser gibt dann meine Software den Befehl zum Ladepause für das Auto. Ich würde mich freuen wenn jemand so eine Ähnliche Programmierung kennt; hat oder mir auch nur einen Gedankenanstoß geben könnte. lg marcel
Bei t = ∞ ist der Akku jedenfalls leer ;) Wäre es nicht sinvoller die Spannung des Akkus zu messen und dann zu entscheiden ob geladen werden soll?
Marcel Pieroth schrieb: > Auf eine Modellbahn fahren Autos einen Magnetband entlang ( Carsystem) > Jedes Auto hat einen Akku an Board. > Diese Autos werden über eine PC Software angesteuert und somit über die > Anlage gelenkt. Das heißt, jedes Auto hat auch einen kleinen µC mit an Bord? (Ist soweit auch logisch, denn wie käme sonst BASCOM da mit ins Spiel) > Da das ganze ja automatisch läuft sollen die Autos nun auch je nach > Ladeszustand des Akkus in einen Bereich gebracht werden zu Aufladen. Soweit klar. > Ich würde dazu gerne eine Strecke auf der Anlage mit einer festen länge > zB. 50 cm definieren.Am Anfang und ende der Stecke ist jeweils ein > Hallsensor verbaut. > Bei auslösen des ersten Sensores sollte die Zeitmessung beginnen und bei > Auslösen des Zweiten Stoppen. Das ist grundsätzlich nicht so schwer, wenn du mit Timern umgehen kannst. Allerdings: wäre es nicht einfacher, die Akkuspannung ganz einfach direkt zu messen und wenn die unter einen Grenzwert fällt, dann merkt das Auto auch so, dass es zum Laden drann ist? Einziges Problem, wie kriegt der PC mit, dass das Fahrzeug zum Laden fährt. Ist natürlich ein Argument, das allerdings lösbar wäre, wenn man den Autos mehr Autonomie zugesteht. Der PC könnte das Auto zb in eine spezielle Strecke steuern lassen, in der das Auto mittels Infrarot-Übertragung seine Kennung samt aktuellen Akku-Spannungszustand an den PC übermittelt, der es dann in die Ladestrasse einplant. > Die gemessene Zeit muss dann mit einer Zeit verglichen werden welche ich > vorher ermitteln muss und diese dann fest in der Programmierung > eingtragen ist. > Wenn die gemessene Zeit kürzer ist als die eingetragene sollte ein > Ausgang zuschalten. Und was passiert dann, wenn ein Ausgang zuschaltet? > Dieser gibt dann meine Software den Befehl zum Ladepause für das Auto. Wer genau macht das? Das Auto selber, oder die PC-Software. Denn das ist jetzt nicht ganz unerheblich. Wer muss die Fahrzeit auf der Teststrecke deiner Meinung nach messen? Überhaupt hängt in dem ganzen Szenario jetzt sehr viel daran, wie die Aufgabenteilung zwischen PC und Auto zur Zeit aussieht, bzw. wie sie weiter aussehen soll.
Falls die Autos keine µC an Board haben sollten, könnte man aller x Runden trotzdem in die "Box" fahren und dann dort die Spannung messen. Die Ladekontakte sind ja wohl 1:1 mit dem Akku verbunden, dann könnte man auch dort messen. Blos irgendwie muss der Motor ja gesteuert werden, sonst fährt das Auto ja wieder aus der Box raus..
Hi, danke für die Schnelle Antwort. Der µc sollte nicht im Auto sitzen sodern in einer kleinen Elektrnik unter der Straße welch nur die Sensoren abfragt. Deswegen kann ich die Akuspannung nicht dirket abfragen. Da ich auch die Autos nicht umbauen möchte fällt der µc an Board auch flach. Der Ausgang welcher geschaltet werden soll hat ein kleines Relais angeschlossen.Im Bereich Modellbahn gibt es Rückmeldedecoder. An denen wird an einem Eingang + angelegt und der Rückmeldeeingang Schaltet auf ein wenn dort Masse anliegt. Das wird dann weiter an die Steuerungssoftware geleitet. Die Software schaltet dann eine Weiche in der Straße und das Auto Fährt in ein Parkhaus.Dort kann es dann von hand zum Laden angesteckt werden. Dies soll auch von hand passieren und nicht automatisch da man so das Auto dirket vom Dreck befreien kann. Mit Timern kann ich noch nicht wirklich umgehen da ich erst am anfang meine Bascom Laufbahn stehe ;-) Ich hoffe das erklät auch die Aufgabenteilung PC /Auto. Man muss das ganze in 2 Systeme unterteilen welche eingentlich nicht miteinander zu tun haben. System 1 PC Software Steuert das Auto über die Strecke. Schaltet Weichen für Straßenkreuzungen etc. Das Messen soll das zweite System darstellen das so arbeitet we oben beschrieben. Das Auto löst dann die Sensoren mittel eines kleinen Magneten aus. Der Ausgang welcher das Relais schaltet verbindet die zwei Systeme in sweit das der PC eine Weiche schaltet und das Auto abbiegt. Ich hoffe das erklärt die Fragen lg marcel
Marcel Pieroth schrieb: > Der µc sollte nicht im Auto sitzen sodern in einer kleinen Elektrnik > unter der Straße welch nur die Sensoren abfragt. > Deswegen kann ich die Akuspannung nicht dirket abfragen. > Da ich auch die Autos nicht umbauen möchte fällt der µc an Board auch > flach. ok. wichtige Information. > Der Ausgang welcher geschaltet werden soll hat ein kleines Relais > angeschlossen.Im Bereich Modellbahn gibt es Rückmeldedecoder. > An denen wird an einem Eingang + angelegt und der Rückmeldeeingang > Schaltet auf ein wenn dort Masse anliegt. > Das wird dann weiter an die Steuerungssoftware geleitet. Ah. ok. Dieses 'Ausgang schalten' ist die Rückmeldung an den PC. Ebenfalls eine wichtige Information. > Die Software schaltet dann eine Weiche in der Straße und das Auto Fährt > in ein Parkhaus. Alles klar. Ab jetzt zeichnet sich da auch ein Bild ab, wie du dir das vorstellst. > Mit Timern kann ich noch nicht wirklich umgehen da ich erst am anfang > meine Bascom Laufbahn stehe ;-) Dann musst du das eben lernen. So schwer ist das nicht. Moment. Ist sicher gestellt, dass immer nur 1 Auto in der Messstrecke ist, oder können das auch mehrere sein. Wenn es nur eines ist, dann kann man auch eine Lösung, die auf Wartezeiten beruht, von einem Neuling akzeptieren. Denn wenn man nach dem überfahren des Startsensors alle 10 Millisekunden nachsieht, ob der Endesemsor überfahren wurde, und dabei mitzählt wie oft man nachsehen musste, bis das der Sensor überfahren wurde, dann kann man daraus natürlich auch die zeit berechnen. Wurde die Schleife 3000 mal wiederholt, ehe das Ausfahrtssignal kam, dann lagen zwischen Einfahrt und Ausfahrt 3000 mal 0.01 Sekunden oder eben 30 Sekunden. Und die 10 Millisekunden kannst du ja (schauder) mit einem WAITMS leicht erreichen.
Hi, Es befindet sich immer nur ein Auto im Messbereich.
Karl Heinz Buchegger schrieb: > Wenn es nur eines ist, dann kann man auch eine Lösung, die auf > Wartezeiten beruht, von einem Neuling akzeptieren. Denn wenn man nach > dem überfahren des Startsensors alle 10 Millisekunden nachsieht, ob der > Endesemsor überfahren wurde, und dabei mitzählt wie oft man nachsehen > musste, bis das der Sensor überfahren wurde, dann kann man daraus > natürlich auch die zeit berechnen. Wurde die Schleife 3000 mal > wiederholt, ehe das Ausfahrtssignal kam, dann lagen zwischen Einfahrt > und Ausfahrt 3000 mal 0.01 Sekunden oder eben 30 Sekunden. Und die 10 > Millisekunden kannst du ja (schauder) mit einem WAITMS leicht erreichen.
1 | DO |
2 | warte auf Einfahrtssignal |
3 | |
4 | Zeit = 0 |
5 | wiederhole bis Ausfahrtssignal anspricht |
6 | WAITMS 10 |
7 | Zeit = Zeit + 1 |
8 | ende wiederhole |
9 | |
10 | if Zeit > grenzwert |
11 | setze Rückmeldeausgang |
12 | |
13 | warte ein wenig |
14 | lösche Rückmeldesignal |
15 | |
16 | LOOP |
ist zwar nicht ganz die feine englische Art, aber wenn der µC ausser dieser Messung sowieso nichts zu tun hat, ist es vertretbar, das so zu machen.
Hi, super danke! das ist mal ein Anfang für mich. Ich versuche das mal so in Bascom zu schreiben wie es ,hoffe ich, richtig ist. lg marcel
Ungetestet während der Werbepause hingeschmiert:
1 | $regfile = "atTiny13.dat" |
2 | $crystal = 1000000 |
3 | |
4 | $hwstack = 32 |
5 | $swstack = 12 |
6 | $framesize = 10 |
7 | |
8 | |
9 | Halleinfahrt Alias Pinb.0 'Hallsensor Beginn Messung |
10 | Hallausfahrt Alias Pinb.1 'Hallsensor Ende Messung |
11 | Ausgangpc Alias Portb.5 'Ausgang für Meldung an den PC |
12 | Programmiertaste Alias Pinb.4 'Länge des Tastendrucks programmiert die Maxzeit |
13 | |
14 | Config Ausgangpc = Output |
15 | Portb = &B00010011 'Pullups für Hallsensoren und Taster. Diese müssen dann auf GND ziehen |
16 | |
17 | Config Timer0 = Timer , Prescale = 64 '10Millisekunden |
18 | |
19 | On Timer0 Timer0_irq |
20 | |
21 | Const Timervorgabe = 100 '10Millisekunden |
22 | Const Meldezeit = 100 '1 Sekunde lan an den PC melden |
23 | |
24 | Dim Zeit As Word 'reicht für 65 Sekunden |
25 | Dim Maxzeit As Word |
26 | Dim Dummy As Eram Byte 'Byte 0 nutze ich nicht. |
27 | Dim Emaxzeit As Eram Word 'Eprom wird benutzt, Fuse Preserve Eprom aktivieren |
28 | Dim Programmierzeit As Word |
29 | Dim Meldung As Byte '1 Sekunde |
30 | Dim Modus As Byte '0=nichts, 1=Zeitmessung, 2=Programmieren |
31 | |
32 | Maxzeit = Emaxzeit ' Aus Eprom einlesen |
33 | |
34 | Enable Timer0 |
35 | Enable Interrupts |
36 | |
37 | Do |
38 | If Halleinfahrt = 0 Then |
39 | Modus = 1 |
40 | End If |
41 | |
42 | If Hallausfahrt = 0 Then |
43 | Modus = 0 |
44 | End If |
45 | |
46 | If Programmiertaste = 0 Then |
47 | Modus = 2 |
48 | Else |
49 | If Modus = 2 Then |
50 | Emaxzeit = Programmierzeit 'In Eprom speichern |
51 | Maxzeit = Programmierzeit |
52 | Modus = 0 |
53 | End If |
54 | End If |
55 | |
56 | If Meldung >= 1 Then |
57 | Set Ausgangpc |
58 | Else |
59 | Reset Ausgangpc |
60 | End If |
61 | |
62 | Loop |
63 | End |
64 | |
65 | Timer0_irq: |
66 | Timer0 = Timervorgabe |
67 | |
68 | If Meldung > 0 Then |
69 | Decr Meldung |
70 | End If |
71 | |
72 | If Modus = 1 Then 'Durchfahrt des Autos |
73 | Incr Zeit |
74 | If Zeit > Maxzeit Then |
75 | Meldung = Meldezeit |
76 | Modus = 0 |
77 | End If |
78 | Else |
79 | Zeit = 0 |
80 | End If |
81 | |
82 | If Modus = 2 Then 'Zeitprogrammierung |
83 | Incr Programmierzeit |
84 | Else |
85 | Programmierzeit = 0 |
86 | End If |
87 | |
88 | Return |
Hi, danke für die Zeilen !! Sollte ein tiny 13 werden ! das ist schon super so. Die Hallsensoren die TLE4905 und schalten nur einen kurzen Impuls. Beim Sensor wird GND durchgeschaltet. Das Progrsamm muss ich mir mal auseinanderpfücken da ich mich noch nicht so gut in Bascom auskenne. Vielen dank
Marcel Pieroth schrieb: > Beim Sensor wird GND durchgeschaltet. Dann sollte schon alles passen. Der kurze Impuls wird im Beispiel auf eine Sekunde verlängert.
Hi @ Peter, so nun hatte ich mal Zeit zum testen. ich habe mal deine Zeilen aud nen Tiny13 aufgespielt. Über das STK 500 angeschlossen mit Taster und LED als Ausgang zum testen. aber leider passiert nichts . Mein ablauf wie ich getestet habe. Den tasten für die Zeit zu Programmieren ca 1 sec gedrückt. Dann den Tasten Halleinfahrt gedrückt ca 2 sek gewartet Dann den Hallausfahrt gedrückt. Nun solllte die LED Leuchten aber leider ohne erfolg. Woran könnte es liegen konnte an der Verdrahtung keinen Fehler feststellen und im Programm habe ich mit meinen Kentnissen auch nichts finden können. Kannst Du mir auf die Sprünge helfen?! lg marcel
Marcel Pieroth schrieb: > Wenn die gemessene Zeit kürzer ist als die eingetragene sollte ein > Ausgang zuschalten. > > Dieser gibt dann meine Software den Befehl zum Ladepause für das Auto. Das ist m.E. falsch. Es sollte wohl heissen: Wenn die gemessene Zeit laenger ist als die eingetragene sollte... wendelsberg
Eben mal auf dem Pollinboard mit einem M32 getestet, da ich keinen anderen da habe.
1 | $regfile = "M32def.dat" |
2 | $crystal = 1000000 |
3 | $hwstack = 32 |
4 | $swstack = 10 |
5 | $framesize = 40 |
6 | $baud = 9600 |
7 | |
8 | |
9 | Halleinfahrt Alias Pind.2 'Hallsensor Beginn Messung |
10 | Hallausfahrt Alias Pind.3 'Hallsensor Ende Messung |
11 | Ausgangpc Alias Portd.5 'Ausgang für Meldung an den PC |
12 | Programmiertaste Alias Pind.4 'Länge des Tastendrucks programmiert die Maxzeit |
13 | Led Alias Portd.6 |
14 | Config Ausgangpc = Output |
15 | 'Portb = &B00010011 'Pullups für Hallsensoren und Taster. Diese müssen dann auf GND ziehen |
16 | Config Led = Output |
17 | Config Timer0 = Timer , Prescale = 64 '10Millisekunden |
18 | |
19 | On Timer0 Timer0_irq |
20 | |
21 | Const Timervorgabe = 100 '10Millisekunden |
22 | Const Meldezeit = 100 '1 Sekunde lan an den PC melden |
23 | Const Ohnepullups = 1 |
24 | |
25 | Dim Zeit As Word 'reicht für 65 Sekunden |
26 | Dim Maxzeit As Word |
27 | Dim Dummy As Eram Byte 'Byte 0 nutze ich nicht. |
28 | Dim Emaxzeit As Eram Word 'Eprom wird benutzt, Fuse Preserve Eprom aktivieren |
29 | Dim Programmierzeit As Word |
30 | Dim Meldung As Byte '1 Sekunde |
31 | Dim Modus As Byte '0=nichts, 1=Zeitmessung, 2=Programmieren |
32 | Dim Flag As Byte |
33 | |
34 | Maxzeit = Emaxzeit ' Aus Eprom einlesen |
35 | |
36 | Enable Timer0 |
37 | |
38 | Enable Interrupts |
39 | 'Start Timer0 |
40 | |
41 | Do |
42 | If Halleinfahrt = Ohnepullups Then |
43 | If Modus = 0 Then |
44 | Modus = 1 |
45 | End If |
46 | Programmierzeit = 0 |
47 | End If |
48 | |
49 | If Hallausfahrt = Ohnepullups Then |
50 | If Modus = 2 Then |
51 | Maxzeit = Programmierzeit |
52 | Emaxzeit = Maxzeit 'In Eprom speichern |
53 | Reset Led |
54 | End If |
55 | Modus = 0 |
56 | End If |
57 | |
58 | If Programmiertaste = Ohnepullups Then |
59 | Modus = 2 |
60 | Set Led |
61 | End If |
62 | |
63 | |
64 | If Flag > 0 Then |
65 | Decr Flag |
66 | |
67 | If Meldung >= 1 Then |
68 | Decr Meldung |
69 | Set Ausgangpc |
70 | Else |
71 | Reset Ausgangpc |
72 | End If |
73 | |
74 | If Modus = 1 Then 'Durchfahrt des Autos |
75 | Incr Zeit |
76 | If Zeit > Maxzeit Then |
77 | Meldung = Meldezeit |
78 | Modus = 0 |
79 | End If |
80 | Else |
81 | Zeit = 0 |
82 | End If |
83 | |
84 | If Modus = 2 Then 'Zeitprogrammierung |
85 | Incr Programmierzeit |
86 | End If |
87 | End If |
88 | |
89 | Loop |
90 | End |
91 | |
92 | Timer0_irq: |
93 | Timer0 = Timervorgabe |
94 | ' Toggle Led |
95 | Incr Flag |
96 | |
97 | Return |
Jetzt brauch man den Programmiertaster nur kurz drücken, dann wird die Zeit automatisch genommen. Anschließend der Wert gespeichert. Die Ports musst du dir wieder anpassen. Die Konstante Ohnepullups muss bei dir auf 0. Die LED signalisiert den Programmiermodus. Hast Du keine, dann das auskommentieren.
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.