Hallo,
ich möchte die max. Geschwindigkeit eines Autos auf der Carrera-Bahn
messen mittels zweier Lichtschranken. Der Impuls ist ca. 0,15s - 0,22s
lang.
Dieser geht auf den Eingang PD.0 vom ATMega48 mit einem LCD-Display.
Habe mir dann dazu ein kleines Programm in Bascom gebastelt. Leider
funktioniert es so nicht und ich finde meinen Denkfehler nicht.
Zur Funktion:
Timer wird bei der pos. Flanke (1. IF-Anweisung) auf null gesetzt und
läuft dann los. Hilfsmerker ist dann 1!
Timer wird bei der neg. Flanke (2. IF-Anweisung) ausgelesen und
Hilfsmerker ist wieder 0!
Wenn Hilfsmerker Null ist läuft auch der Timer nicht (3. IF-Anweisung)!
Interrupt-Routine ist nur da, dass LED leuchtet wenn Timer überläuft
(Auto zu langsam = Fehlmessung).
Hier das vorläufige Programm:
'***************************************************************
'Test Pulsmessung >> 1 Kanal mit Timer
'Chip type : ATMega48V
'***************************************************************
$regfile = "m48def.dat" 'ATMega48V
$crystal = 8000000 'intern Osz. 8MHz, DivClock=Off
Config Lcdpin = Pin , DB4 = Portb.0 , DB5 = Portb.1 , DB6 = Portb.2
Config Lcdpin = Pin , DB7 = Portb.3 , E = Portb.5 , RS = Portb.4
Config Lcd = 16x2 'configure lcd screen
DDRD =&B00100000 'PortB.5-Ausgang, Rest-Eingang
PortD = &B11011111 'PullUp an den Eingängen
Dim Puls1 As Word
Dim Puls2 As Word
Dim HM1 As Bit
LED Alias Portd.5
Config Timer1 = Timer, Prescale = 64
On Timer1 T1_Sub
Enable TIMER1
Enable Interrupts
Cursor off
Cls
LED = 0
Waitms 200
Do
If PinD.0 = 1 And HM1 = 0 Then
HM1 = 1
Timer1 = 0
LED = 0
End IF
If PinD.0 = 0 And HM1 = 1 Then
HM1 = 0
Puls1 = Timer1
End IF
If HM1 = 0 Then
Timer1 = 0
End IF
Locate 1, 1
LCD Puls1
LCD " "
Loop
End
T1_Sub:
LED = 1
Return
Vielleicht liegt es auch an dem LCD-Display?
Danke
Maik
Mr.Unklar schrieb:> mit einem LCD-Display
Also einem Liquid Crystal Display Display, sozusagen
ein Display im Display. Schicke Sache das ....
Mr.Unklar schrieb:> Vielleicht liegt es auch an dem LCD-Display?
Ja vielleicht schon.
Mr.Unklar schrieb:> Der Impuls ist ca. 0,15s - 0,22s lang.
Dann solltest du nicht während dieser Messzeit am Display
herumschrauben, denn die Zugriffe darauf können sich ganz hübsch in die
Länge ziehen...
> Leider funktioniert es so nicht
Was davon funktioniert denn nicht?
Was passiert, wenn du mal das probierst:
1
:
2
:
3
Do
4
5
IfPinD.0=1AndHM1=0Then'steigendeFlanke
6
HM1=1
7
Timer1=0
8
LED=0
9
EndIF
10
11
IfPinD.0=0AndHM1=1Then'fallendeFlanke
12
HM1=0
13
Locate1,1
14
LCDTimer1
15
LCD" "
16
EndIF
17
18
Loop
19
End
20
:
21
:
Zur Fehlersuche ürde ich mal sowas probieren:
1
:
2
:
3
Do
4
5
IfPinD.0=1AndHM1=0Then'steigendeFlanke
6
HM1=1
7
LED=1'->LEDan
8
EndIF
9
10
IfPinD.0=0AndHM1=1Then'fallendeFlanke
11
HM1=0
12
LED=0'->LEDaus
13
EndIF
14
15
Loop
16
End
17
:
18
:
Dann könnte ich an der LED sehen, ob wenigstens der Portpin richtig im
Programm ankommt.
Mr.Unklar schrieb:> Leider> funktioniert es so nicht
Da freut sich aber der Monteur in der Autowerkstatt, weil er 1000%
aufschlagen kann. Er muß ja erstmal alles gründlich untersuchen, was
denn nun nicht funktionieren soll.
Wenn man aber konkret sagen würde, Rückfahrlicht geht nicht, müßte er
nur die Sicherung wechseln und könnte nur wenige € berechnen.
Da es im Forum aber keine € gibt, hat man bei absolut nichtssagender
Fehlerbeschreibung schlechte Karten.
Allgemein: Ständig sich überschreibende LCD-Ausgaben kann man nicht
erkennen. Man sollte schon Pausen fürs Ablesen einbauen.
Danke Lothar,
habe mal gemessen wie lange das Display benötigt. Ganze 14ms! Und um
diesen Wert schwanken auch die Messwerte. Mit Deiner Änderung habe ich
jetzt einigermaßen Stabile Messwerte.
Jetzt muss ich nur noch eine Lösung finden, wenn die 2. Bahn
gleichzeitig gemessen wird.
Mr.Unklar schrieb:> Jetzt muss ich nur noch eine Lösung finden, wenn die 2. Bahn> gleichzeitig gemessen wird.
Ich würde da für die Pulsdauerermittlung auf Pinchange-Interrupts gehen
und die gesamte Timerverwaltung im Interrupt machen. Dann ist es
schnurzegal, wie langsam das Display aktualisiert wird.
Dann ist es hilfreich, den Timer nicht zurückzusetzen, sondern ihn
einfach durchlaufen zu lassen, sich dann den Startzeitpunkt zu merken
und letztlich diese Startzeit vom Endzeitpunkt anzuziehen.
Hallo zusammen,
also Peter D. mein Autoschrauber ist ein ehrlicher Typ und dem kann Mann
schon mal das Auto anvertrauen. Du warst schon mal besser in Deinen
anderen Beiträgen.
Und für den "lesestolperer", wie der Name schon sagt, noch der Hinweis,
dass es auch LED- oder Grafik-Displays gibt!!! Wäre schön gewesen, wenn
er auch etwas beigetragen hätte.
Wieso hat der Moderator denn das Problem gleich erfasst? Ist wohl doch
nicht der Anfänger wie andere mit einem Halbwissen oder permanente
Nörgeler.
Die Frage ist aber immer noch was passiert, wenn die beiden Fahrzeuge
wirklich gleichzeitig gemessen werden sollen.
Schönes WE noch und Gruß vom
Andree
Samstagsgast schrieb:> also Peter D. mein Autoschrauber ist ein ehrlicher Typ
Ein ehrlicher Typ ist aber kein Hellseher. Wenn Du ihm keine
Fehlerbeschreibung gibst, braucht er deutlich mehr Zeit, das Auto zu
untersuchen. Und diese zusätzliche Zeit will er natürlich von Dir
bezahlt haben.
Samstagsgast schrieb:> Die Frage ist aber immer noch was passiert, wenn die beiden Fahrzeuge> wirklich gleichzeitig gemessen werden sollen.
Wurde doch schon gesagt. Einfach mal die Beiträge lesen.
Guten Morgen,
geht leider doch nicht so einfach. Habe (zwar sehr selten) den Fehler,
dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer
kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x
abgefragt wird.
Aber das ist, denke ich, lösbar.
Danke noch mal und schönen Sonntag
Maik
Mr.Unklar schrieb:> Habe (zwar sehr selten) den Fehler,> dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer> kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x> abgefragt wird.
M.W. gibt es dafür in Bascom den vorzeichenlosen Datentyp Word.
Mr.Unklar schrieb:> Habe (zwar sehr selten) den Fehler,> dass ich einen hohen negativen Wert erhalte und zwar dann wenn der Timer> kurz vor 65535 abgefragt wird, überläuft und das nächste mal bei 0+x> abgefragt wird.> 8MHz> 0,15s - 0,22s
Auf wie viele Timer-Takte kommt man mit diesen Zahlen?
Dei Methode, einen Zähler mit begrenztem Zahlenumfang auf 0 zurück zu
setzen, ist äußerst unpraktisch.
Man subtrahiert einfach die Zeitpunkte der Flanken voneinander und lässt
den Timer munter vorsichherlaufen.
Mr.Unklar schrieb:> Dieser geht auf den Eingang PD.0
Deine Autos sind also alle gleich lang?
Geschwindigkeiten misst man zwischen zwei Punkten in einem definierten
Abstand. Das würde den ganzen Spaß auch massiv vereinfachen.
Nein Mr. STK500. Die Länge der Autos ist egal. Es sind zwei
Lichtschranken, die ein RS-FlipFlop setzen und rücksetzen. Deshalb nur
ein Eingang.
Aber das war nicht das Thema.
Das Prinzip des ständigen Laufens des Timers wurde ja schon von Lothar
M. so vorgeschlagen. Trotzdem besteht das Problem mit der Messung
innerhalb des Überlaufs vom Timer.
Mr.Unklar schrieb:> Trotzdem besteht das Problem mit der Messung> innerhalb des Überlaufs vom Timer.
Dann zählt man in der Überlauf-ISR deren Auftreten.
Mr.Unklar schrieb:> Es sind zwei> Lichtschranken, die ein RS-FlipFlop setzen und rücksetzen. Deshalb nur> ein Eingang.
umständlich...
Mr.Unklar schrieb:> Trotzdem besteht das Problem mit der Messung> innerhalb des Überlaufs vom Timer.
Nö, bei nur einem Überlauf besteht weiterhin kein Problem (Differenzen
stimmen immer).
Erst bei mehreren Überläufen je Messung muß man sie synchron
mitzählen:
Beitrag "AVR Timer mit 32 Bit"
STK500-Besitzer schrieb:>> 8MHz>> 0,15s - 0,22s> Auf wie viele Timer-Takte kommt man mit diesen Zahlen?
Die Frage ist mMn noch offen.
Als nächstes: Wie viele Überläufe deines Timer-Registers treten auf?
Mr.Unklar schrieb:> Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny!
Was nu? ATTiny oder ATmega?
Ein ATmega hat im Normalfall eine Input-Capture-Unit. Die erledigt sowas
in Hardware.
Ein Tiny hat die eher nicht.
STK500-Besitzer schrieb:> Ein ATmega hat im Normalfall eine Input-Capture-Unit. Die erledigt sowas> in Hardware.> Ein Tiny hat die eher nicht.
STK500 ist veraltet!
ATtiny44, 861, 2313, ..., ATtiny212+++
Alle haben eine Capture-Einheit zu einem Timer.
Peter D. schrieb:> Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.
Das ist doch weder für Dich noch für mich ein ernsthaftes Problem -
Capture hin oder her.
> Ein Tiny hat die eher nicht.
Diese Information ist veraltet und unzutreffend.
m.n. schrieb:> STK500 ist veraltet!> ATtiny44, 861, 2313, ..., ATtiny212+++> Alle haben eine Capture-Einheit zu einem Timer.
Danke für die Info.
Ich bin inzwischen nicht mehr mit AVR (oder anderen achtbittern)
unterwegs...
Peter D. schrieb:> Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.
Nee, eben nicht. Die beiden Eingänge sollen mittels Flip-Flop
zusammengefasst werden (was ich schon als "umständlich" bezeichnet
hatte).
Nö!!!
Peter D. schrieb:
> Nö, bei nur einem Überlauf besteht weiterhin kein Problem (Differenzen> stimmen immer).
Wenn Timer normal läuft dann z.B. TW2 = 20000, TW1 5000 dann Wert = TW2
- TW1 = 15000!
Wenn Timer überläuft bei gleichem Abstand von 15000 dann z.B. TW2 =
5000, TW1 = 55535 dann Wert TW2 - TW1 = -50535!
STK500-Besitzer schrieb:
> > Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.>Nee, eben nicht. Die beiden Eingänge sollen mittels Flip-Flop>zusammengefasst werden (was ich schon als "umständlich" bezeichnet>hatte).
Es sind nach meiner Meinung zwei unabhängige Eingänge, da es ja 2 Spuren
sind, oder???
Andree
Nochmal für den STK500-Besitzer!
Es sind pro Spur 2 LS verbaut, die auf einen 4027 gehen. Dieser Aufbau
ist ca. 20 Jahre alt und funktioniert immer noch sehr gut, weil er mir
einen sauberen pos. Impuls liefert. Gemessen habe ich damals mit einem
RFT-Zähler (kann nur den negativen Impuls messen).
Zur Zeit ist ein ATMega in Funktion als Versuchsaufbau. Später wird es
ein ATTiny 24! Auch liebäugele ich mit dem neuen ATTiny1624! Und einer
LCD-Anzeige (einstellig und 8 Zeichen)! Jetzt läuft nur der
Rundenzähler. Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert
auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535
und bremst dadurch mein ganzes Programm aus.
Und der Mittwochs-Gast hat das Problem mit dem Überlauf erkannt. Habe
ganz ähnliche Werte.
Aber das war hier nicht das Thema. Bin immer bemüht, das Problem so weit
wie möglich einzugrenzen.
Danke nochmals
Mittwochs-Gast schrieb:> Wenn Timer normal läuft dann z.B. TW2 = 20000, TW1 5000 dann Wert = TW2> - TW1 = 15000!> Wenn Timer überläuft bei gleichem Abstand von 15000 dann z.B. TW2 => 5000, TW1 = 55535 dann Wert TW2 - TW1 = -50535!
Die Rechnung muß man natürlich unsigned machen (uint16_t).
Peter D. schrieb:> Die Rechnung muß man natürlich unsigned machen (uint16_t).
Das sollte selbstverständlich sein.
Mr.Unklar schrieb:> Nochmal für den STK500-Besitzer!> Es sind pro Spur 2 LS verbaut, die auf einen 4027 gehen. Dieser Aufbau> ist ca. 20 Jahre alt und funktioniert immer noch sehr gut, weil er mir> einen sauberen pos. Impuls liefert. Gemessen habe ich damals mit einem> RFT-Zähler (kann nur den negativen Impuls messen).> Zur Zeit ist ein ATMega in Funktion als Versuchsaufbau. Später wird es> ein ATTiny 24! Auch liebäugele ich mit dem neuen ATTiny1624! Und einer> LCD-Anzeige (einstellig und 8 Zeichen)! Jetzt läuft nur der> Rundenzähler. Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert> auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535> und bremst dadurch mein ganzes Programm aus.> Und der Mittwochs-Gast hat das Problem mit dem Überlauf erkannt. Habe> ganz ähnliche Werte.> Aber das war hier nicht das Thema. Bin immer bemüht, das Problem so weit> wie möglich einzugrenzen.
Tolle Salamitaktik.
Normalerweise verwendet man einen Mikrocontroller mit zwei Eingängen pro
Spur.
Warum man privat etwas unbedingt mit irgendwelchen Minimalschaltungen
realisiern muss, bleibt mir ein Rätsel.
Dann sollte man auch gleich in Assembler tätig werden.
> Danke nochmals
Da nicht für.
Mr.Unklar schrieb:> Eine Messung mit dem BASCOM-Befehl PULSEIN funktioniert> auch aber wenn kein Impuls ansteht läuft die Variable immer bis 655535> und bremst dadurch mein ganzes Programm aus.
Die vorgefertigten Legosteinchen können eben nur das, was sich jemand
vorher mal ausgedacht hat.
Wenn man das ganze Interrupt basiert macht, wird nichts ausgebremst. Der
Interrupt meldet irgendwann, daß was gemessen wurde oder ein Timeout
erfolgte und das Main zeigt es nur noch an.
Mit dem Interrupt der Startflanke kann man eins der Compareregister auf
den Timeout setzen und somit für beide Meßsignale je ein Timeout
generieren. Sollen die Timeouts >65536 sein, kann man sie auch mit einer
Zählvariablen erweitern.