Forum: Mikrocontroller und Digitale Elektronik Zeit / wegmessung in Bascom verwirklichen


von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

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

von herth (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von herth (Gast)


Lesenswert?

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

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

Hi,

Es befindet sich immer  nur ein Auto im Messbereich.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

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

von Peter R. (peterfido)


Lesenswert?

Interessant wäre noch das Ausgangssignal der Hallsensoren und welcher 
AVR es werden soll.

von Peter R. (peterfido)


Lesenswert?

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

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

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

von Peter R. (peterfido)


Lesenswert?

Marcel Pieroth schrieb:
> Beim Sensor wird GND durchgeschaltet.

Dann sollte schon alles passen. Der kurze Impuls wird im Beispiel auf 
eine Sekunde verlängert.

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

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

von wendelsberg (Gast)


Lesenswert?

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

von Marcel P. (Firma: Mapi Modellbau) (mapi)


Lesenswert?

Hi,

Stimmt !

von Peter R. (peterfido)


Lesenswert?

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
Noch kein Account? Hier anmelden.