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 | If PinD.0 = 1 And HM1 = 0 Then 'steigende Flanke |
6 | HM1 = 1 |
7 | Timer1 = 0 |
8 | LED = 0 |
9 | End IF |
10 | |
11 | If PinD.0 = 0 And HM1 = 1 Then 'fallende Flanke |
12 | HM1 = 0 |
13 | Locate 1, 1 |
14 | LCD Timer1 |
15 | LCD " " |
16 | End IF |
17 | |
18 | Loop
|
19 | End
|
20 | :
|
21 | :
|
Zur Fehlersuche ürde ich mal sowas probieren:
1 | :
|
2 | :
|
3 | Do
|
4 | |
5 | If PinD.0 = 1 And HM1 = 0 Then 'steigende Flanke |
6 | HM1 = 1 |
7 | LED = 1 '-> LED an |
8 | End IF |
9 | |
10 | If PinD.0 = 0 And HM1 = 1 Then 'fallende Flanke |
11 | HM1 = 0 |
12 | LED = 0 '-> LED aus |
13 | End IF |
14 | |
15 | Loop
|
16 | End
|
17 | :
|
18 | :
|
Dann könnte ich an der LED sehen, ob wenigstens der Portpin richtig im Programm ankommt.
:
Bearbeitet durch Moderator
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.
1 | :
|
2 | :
|
3 | PinchangeINT0_sub: |
4 | If PinD.0 = 1 And HM1 = 0 Then 'steigende Flanke |
5 | HM1 = 1 |
6 | Start1 = Timer |
7 | End IF |
8 | If PinD.0 = 0 And HM1 = 1 Then 'fallende Flanke |
9 | HM1 = 0 |
10 | Pulse1 = Timer - Start1 |
11 | End IF |
12 | |
13 | If PinD.1 = 1 And HM2 = 0 Then 'steigende Flanke |
14 | HM2 = 1 |
15 | Start2 = Timer |
16 | End IF |
17 | If PinD.1 = 0 And HM2 = 1 Then 'fallende Flanke |
18 | HM2 = 0 |
19 | Pulse2 = Timer - Start2 |
20 | End IF |
21 | Return
|
22 | :
|
23 | :
|
:
Bearbeitet durch Moderator
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.
Naja, der Wert 65535 ist schon vom Format Word! Bei Int wäre es +/- die Hälfte!
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...
Umständlich STK500-Besitzer??? Das solltest Du mir erklären!!!! Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny!
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"
Mr.Unklar schrieb: > Ich spare dadurch 2 Ein-/Ausgänge bei dem kleinen ATTiny! Dafür aber (mindestens) einen Bautstein mehr.
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.
m.n. schrieb: > Alle haben eine Capture-Einheit zu einem Timer. Nur sollen hier ja 2 Eingänge unabhängig gemessen werden.
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.
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.