Ich habe von meinem Dozenten folgende Aufgabe erhalten und keine Ahnung von Tuten und blasen bzw. von Assemblerprogrammierung (in C++ und Java sieht es dann anders aus:-) Könnt ihr mir weiterhelfen? Für ein Fußballprojekt soll die Geschwindigkeit des Balles gemessen werden, Hierzu wurde ein Lichtschranke im Abstand von 1m aufgebaut. Erstellen sie ein Programm zur Messung der GEschwindigkeit. Verwenden sie für die Messung Port 4. Richten sie Ihre Programm so ein, dass nach Start (Taste Start) die Messung beginnt, wenn ein Signal am 1. Empfänger der Lichtschranke auftrittt. Zur besseren Absicherung des Ergebnisses wiederholen sie die Messung mehrere Male und bilden darüber einen MIttelwert. Das Ende der Messreiehe wird durc Betätigten der Taster Stopp ausgelöst. Speichern sie Ihre Ergebnisse (einzelne Messergebnisse und MIttelwert) im exteren Specher ab der Adresse 9000H. Eine Auflösung von 1 km/h wird erwartet. Berechnen sie die Messzeit hierzu und geben sie Grenzwerte an. Die ANzeige des Ergebnisses (Mittelwert) erfolgt über ein Display. Die Befehle hierfür werden vorgeben. Messbedingugen: Messbeginn: Taste Start( PortPin 4.0) betätigt Lichtschranke EMüfänger 1 PortPin 4.1 Lichtschranke Empänger 2 PortPin 4.2 Messung der Geschwindigkeit nach Auslösung Empfänger Geschwindigkeitsauflösung 1 km/h Anzeige Display Ende der MEssung durch Taste Stopp PortPin 4.3 Mittelwertbildung nach der Anzahl der Messungen
Welchen µC musst du verwenden? Wie sieht die Hardware aus? ISt die schon fertig oder musst die auch noch machen? Kennst du das Buch"Mikroprozessortechnik"?Ich glaube da ist so ein ähnliches Beispiel in ASM drin.
Nein das Buch kenne ich nicht ich mus denn INtel 8051 verwenden. Das ganze ist eine reine fiktive Programmierung. Sprich wir programmieren mit Keil µVision3
Andreas Roth "Das Mikrocontroller Kochbuch" - sozusagen die deutsche Bibel der 8051er. In welchem Bereich liegen denn so die Geschwindigkeiten eines Fussballs?
Interessantes Projekt, hört sich nicht allzu schwer an. BTW: Ich denke die Frage nach dem Buch ist nicht gestellt worden, weils Schoasch so interessiert ob du es kennst, sondern eher um dich darauf hinzuweisen es auch zu lesen... Gruß Andreas
Das Ganze ist eine Variante einer Frequenzmessung Lichtschranke1 öffnet ein fiktives 'Tor', Lichtschranke 2 schliesst es wieder. Während das Tor geöffnet ist, werden die Impulse einer bekannten konstanten Frequenz gezählt (Hinweis: zb. ein Timer generiert sowas). Nachdem sich das Tor wieder geschlossen hat, wird abgelesen wieviele Pulse seit dem Öffnen des Tores vergangen sind, daraus (wir kennen ja die Frequenz) ergibt sich, wieviel Zeit vergangen ist und daraus lässt sich wiederum die Geschwindigkeit berechnen. Wenn du also alles was du hier um Forum und am Web zum Thema Freqenzmessung findest, dann sollte dich das in die richtige Richtung bringen. Aber Achtung: Es gibt 2 gängige Methoden zur Frequenzmessung, dich interessiert nur die Methode die ein 'Tor' mit Zälung einer bekannten Frequenz einsetzt.
Das ist doch eher eine Periodendauermessung. Das "Tor" ist doch egal. Man misst die Zeit zwischen zwei Impulsen, und muß die dann in eine Frequenz/Geschwindigkeit umrechnen. Würde die Controller-Familie nicht schon feststehen (und in der Überschrift genannt sein), dann würde ich einen Mega-AVR mit ICP vorschlagen. So mußt du es halt zufuß machen... Mit dem Kontakt der ersten Lichtschranke startet man einen Timer, mit dem Kontakt der zweiten hält man ihn wieder an. Gleichzeitig zählt man die Anzahl der Schüsse und bildet den Mittelwert. Anzeige: aktuelle Geschwindigkeit, Durchschnittsgeschwindigkeit, Anzahl der Schüsse. Dann braucht man nur noch eine Taste, die die Anzeigen auf Null zurücksetzt, um eine neue Runde zu starten. Warum machen (wollen es)die Leute das immer so kompliziert...
Nachtrag: Frequenzmessung, wäre, wenn man für eine gewisse Zeit (z.B. 90 Minuten) 2 Tore aufmachen würde und dann die Anzahl der Flanken, die der Ball erzeugt, wenn er von vor der Torlinie hinter diese bewegt wird, zählen würde und dann diese Ereignis-Anzahl durch die Zeit teilen würde. Eine Art Torfrequenz würde man dann haben...
DIe GEschwindigkeiten eines Fußballes leigen zwischen 10 und 180 km/h wenn ich auf die sichere Seite gehe liegt diese Seite bei 200 km/h
"Dozent" klingt irgendwie nach Studium... Und da bekommt Ihr Aufgaben gestellt, deren Grundlagen noch nie behandelt wurden? :) "Zur besseren Absicherung des Ergebnisses wiederholen sie die Messung mehrere Male und bilden darüber einen MIttelwert." Den möchte ich sehen der den Ball immer mit der gleichen Geschwindigkeit schießen kann^^ Aber das Prinzip sollte eigetlich klar sein... Ball kommt durch erste Lichtschranke - Zeitmessung beginnt Ball kummt durch zweite Lichtschranke - Zeitmessung endet Entfernung zwischen den beiden Lichtschranken ist bekannt Entfernung/Zeitdifferenz = m/s = viola :) Mittelwert=Summe der Zeitdifferenzen/Versuche Der Rest ist Software die Du am besten selber schreiben (und verstehen) solltest für den Fall, dass der Dozent auf die dumme Idee kommt Fragen zu stellen was in dieser oder jener Zeile gemacht wird...
"ist eine reine fiktive Programmierung" Ich denke die Programmierung ist reell, nur das Projekt ist fiktiv /* Klugscheiß ende */ :) "Sprich wir programmieren mit Keil µVision3" Aber Du bist Dir sicher dass es in Assembler sein soll?
Na es soll für den Intel 8051 sein und wir Programmieren mit Keil µVision 3 Also sprich der Mikroprozessor soll programmiert werden.
Sehe ich das richtig? 200km/h sind für den Lichtschranken-Abstand 18ms und 10km/h 360ms? Da langweilt sich der Controller aber ziemlich... Sollte aber mit der OVerflow-Auswertung problemlos machbar sein... Viel Erfolg!
"Also sprich der Mikroprozessor soll programmiert werden." Wie jetzt? Fiktiv oder nicht?
Ja genau, der Mikroprozessor. Es wird nirgendswo real angewendet. Es wird lediglich mit der Software getestet. Es ist ein fiktives Problem!
Sorry, aber wenn es ein fiktives Problem ist, wozu willst du dann den Mikrocontroller programmieren, da reicht auch simulieren... einen Mikrocontroller zu programmieren find ich persönlich eher ziemlich real.... /* nitpick ende */
Ob ich das jetzt Programmiere und auf den Prozessor draufschmeise oder ob ich das Simuliere ist doch jetzt Pfennigfuchserei - Das Problem ist doch ein ganz anderes!
>Das Problem ist doch ein ganz anderes!
Genau!
Hast du schon einen Plan, wie du das lösen willst?
So wie Rahul das geschrieben hat passt das schon. Interrupt bei Lichtschranke 1: Timer starten Interrupt bei Lichtschranke 2: Timer stoppen Timerwert im Speicher ablegen Register inkrementieren um die Anzahl der Messungen aufzunehmen Die Geschwindigkeit hast du dann ja aus der bekannten Entfernung der Lichtschranken wie es Manos geschrieben hat. Zur Mittelwertbildung die abgelegten Werte ab der Anfangsadresse auslesen und aufaddieren. Danach noch durch die Anzahl der Messungen (inkrementiertes register) teilen und fertig.
Schreibs in C, wenn ihr schon Keil verwenden dürft. Wird wahrscheinlich einfacher für dich, wenn du schon C++ und Java kannst. Der Simulator von Keil funktioniert ganz gut, wobei ich mich frage, wie du eine fiktive Displayausgabe programmieren willst (UART? Parallel? ...)
Was ohne Lichtschranke. Habe mal mit dem Entwickler geredet. Das geht Schall aber genauer wollte er es nicht erklären. http://www.unitron.ch/kickstar.html
Das bringt mir halt nichts ich kann ja die Vorgaben nicht einfach umkrämpeln - Sprich mir ist Lichtschranke vorgegeben. Und auf der Seite steht ja nichts von ProgCoder oder?
Wenn Du möglicherweise jetzt doch mit C und nicht Assembler programmieren darfst - gibt es dann jetzt noch Verständnisprobleme zu Deiner Aufgabe oder meinst Du das reicht schon für einen Programmierversuch? Wenn nicht - wo genau sind noch Unklarheiten? @Hornet Der "Kickstar" ist aber leider kein fiktives Projekt :D Ich denke mal, dass das System über den Doppler-Effekt mißt. Es gibt auch noch andere Messverfahren (z.B. Radar oder Laser) aber hier war halt nach der simpelsten gefragt.
Na ich denke für einen ersten Programmierbeginn reicht es, werde mich ansonsten wieder melden. Fühle mich hier relativ kompetent beraten ;-) Vielen Dank!
>Fühle mich hier relativ kompetent beraten
Danke für die Blumen...
Das ist natürlich völlig an der Praxis vorbei, weil der Ball ja dadurch immer genau mit seiner Mittelachse durch die Lichtschranke sausen müsste. Die Rundung des Balls würde sonst das Ergebnis verfälschen. Klar, oder? Man könnte eine Lichtschranken"mauer" aufbauen, aber dann ist immer noch der Ball-flug-winkel von Bedeutung, der das Ergebnis bei 0° <-> 45° um faktor 1.42 verfälschen würde. Also, Theorie + lernen: fein Praxis: untauglich
@Gernot: Man könnte auch einfach die Lichtschranken so dicht beieinander positionieren, dass der Fehler nicht ins Gewicht fällt. Dann würde sich der Mikrocontroller auch nicht so langweilen... Da das sowieso nur eine Programmieraufgabe ist, ist der Sinn / die Praxis wohl eher unwichtig. Man hätte als Beispiel auch eine Kanonenkugel nehmen können. (das mögen Pazifisten aber nicht so gerne...) Oder Hamster, Lemminge ... Wenn es einfach nur darum geht, sich als Übung mit einem Problem zu beschäftigen, dann ist der praktische Nutzen / die praktische Funktion eher nebensächlich, oder?
Wie schnell stürzen die Lemmings von der Klippe? Cool! Ich wollt's ja nur gesagt haben. Nicht das nacher einer kommt und meckert ;)
"Wie schnell stürzen die Lemmings von der Klippe?" Im Vacuum würde er mit 9,81 m/s beim Fallen beschleunigen. Da die Klippen auf unserer Erde für gewöhnlich noch in der Atmosphäre befinden wird hier der Fall durch die Luftreibung gebremst bis zu einem v-max wo dann die Größe und Gewicht des Lemmings wieder einen Einfluß drauf haben - siehe auch Fallschirmspringer (Lemminge mit Rucksack^^).
9,81m/s²
>Lemminge mit Rucksack
Das sind doch eher Base-Jumper, oder?
Ich dachte auch eher an Hamstertreten...
So Leute, nun mal im Ernst: Man legt ja das High Byte und das Low Byte des timers im speicher ab, aber wie bekommt man dann aus dieser zeit km/h wenn der lichtschranken abstand 1 Meter ist?? Hab nämlich dasselbe Problem da ich eine Geschwindigkeitsmessung für meine Rennbahn baue.
Na, der Timer wird doch mit einer gewissen Frequenz getaktet, oder? Nehmen wir mal einen Takt von 1 kHz an, dann entspricht ein Zählerstand von 1 einer Messdauer von 1 ms. 1 m in 1 ms entspricht 1000 m in 1 s Das ist recht schnell, nämlich 3600 km/h Ein Zählerstand von 10 entspricht folglich 360 km/h, einer von 100 läuft dann auf 36 km/h hinaus, und einer von 1000 entspricht einem Fußgänger mit 3.6 km/h Eine Rennbahn (Carrera?) wird wohl irgendwo im Bereich des Fußgängers liegen. Solange der Zähler in einer Messung nicht überläuft, ist alles in Ordnung. Bei 1 kHz Takt würde der Zähler erst nach mehr als einer Minute überlaufen - das schafft fast schon eine Weinbergschnecke.
Hi, Wie jetzt? Du hast die Zeit gemessen. Du hast die Strecke. Geschwindigkeit ist Strecke/Zeit. Ist Dir nicht ganz klar wieviel m ein km ist? Oder 8µs-Einheiten im Timer und Du weisst nicht wie Du das in Stunden umrechnest? Wo ist das Problem? Gruß, Norbert
Hallo Sebastian, einen Teil Deiner Aufgabe habe ich in meinem Tacho Projekt für den 89C2051 (8051 kompatibel) schon gelöst, und auch ein paar Erklärungen dazu geschrieben. Ist in Assembler geschrieben, aber vielleicht hilft Dir das ja weiter. http://www.mikrocontroller-projekte.de/RC-Elektronik/Tester/Tacho/Tacho.html Der Geschwindigkeitsbereich ist bis 255 Km/h. Das Projekt von mir ist allerdings schon etwas älter, verschone mich bitte von Programmierungsanfragen, ich hab schon ewig nichts mehr für 8051 gemacht ;-) ... Viele Grüße, Klaus
Der Mikrocontroller wird mit einer Taktung von 12 MHz getaktet. Wie setzt sich dann die Rechnung zusammen???
Der "klassische" 8051 teilt die Taktfrequenz durch 12... Für solche Sachen ist das "Mikrocontroller Kochbuch" von Andreas Roth gut...
Sofern Du den vollen Takt auf dem Timer hast (ohne Teiler) ersetzt Du einfach in obiger Rechnung die 1kHz durch 12MHz. Wichtig ist natürlich, dass der Timer nicht überläuft bei der Messung. Sollten Deine Lichtschranke nicht 1m auseinanderstehen (davon gehe ich mal aus) mußt Du auch diesen Wert entsprechend anpassen. Willst Du den Wert noch was schönrechnen kannst Du auch noch den Modellmaßstab mit einbeziehen (z.B. Geschwindigkeit x 32 bei Carrera Universal)
Kann mir das mal bitte jemand erklären?? Wenn ich einen Takt von 12Mhz habe und mein Timer 50000µs zählt bis der Interrupt kommt.
>Kann mir das mal bitte jemand erklären?? Wenn ich einen Takt von >12Mhz
habe und mein Timer 50000µs zählt bis der Interrupt kommt.
Was soll man dir da erklären?
Wie schon erwähnt: viele 8051er teilen die Oszillatorfrequenz durch 12
(deswegen auch 12MHz-Quarze).
Intern läuft das Ding dann mit 1MHz. Wenn man den Timer entsprechend
konfiguert (anhand irgendwelcher Bit in irgendwelchen Registern...),
dann wird dieser Timer mit 1MHz betrieben. Somit dauert ein Überlauf
65,536 ms bei einem 16Bit-Timer.
Wie du auf die 50000µs kommst, müsstest du uns erklären.
das mit den 50,000ms ist ja ganz einfach indem ich den timer einfach vorlade und zwar th0 mit 3c und tl0 mit af dann steht der timer auf 15535 und läuft dann bis 65535, das sind dann 50ms.
> Kann mir das mal bitte jemand erklären?? Wenn ich einen Takt > von 12Mhz habe und mein Timer 50000µs zählt bis der > Interrupt kommt. Ich geh mal aus dass du meinst: ... und mein Timer bis 50000 zählt bis der Interrupt kommt. Nun ja. Das ist Grundschulmathematik. So nach dem Muster 1 Apfel kostet 1 Euro, wieviel kosten 25 Äpfel. Also: Bei 12 Mhz und einem Teiler von 12, zählt dein Timer in 1 Sekunde bis 1000000. Wieviel Zeit ist also vergangen, wenn er nur bis 50000 zählt? 1000000 ...... 1 Sekunde 50000 ...... x ----------------------------- 1 * 50000 x = ------------- = 0.05 Sekunden 1000000 D.h. der Ball braucht 0.05 Sekunden um eine Strecke von 1 Meter zu durchfliegen. Grundkurs Physik: Weg 1 Geschwindigkeit = ------ = ------ = 20 m/s Zeit 0.05 Jetzt noch die Umrechnung von m/s auf km/h 20 * 3.6 = 72 km/h
> das mit den 50,000ms ist ja ganz einfach indem ich den timer > einfach vorlade Woher weisst du denn, mit welchem Wert du den Timer vorladen musst. Machs doch nicht so kompliziert: Wird die erste Lichtschranke betätigt, beginnt der Timer bei 0 zu zählen. Wird die zweite Lichtschranke betätigt, wird der Timer wieder gestoppt.
ja ok, aber wie bekomm ich dann die ms weil der timer ist ja in high und low byte geteilt.
Wenn du ihn als unsigned int (16bit breites Datendingsbums) ausliest, hast du es... dann mußt du dich nur noch mit 16bit-Arithmetik auseinandersetzen...
Die nachvollziehbarste Methode wäre einfach die 8 Bit aus dem High-Register * 256 + dem Low-Register in eine min. 16 Bit breite Variable. In C gibt es auch schnellere Methoden mit shiften, aber auf Zeit kommt es in dieser Auswertung nicht an.
wie bring ich dann das high * 256 wieder in ein 16 bit register?
*ja, sachlich richtig, hätt ich nicht schöner ausdrücken können* @Gstina Wo drückt denn der Schuh? Lass uns doch teilhaben an Deinem Problem... Wir kauen das gerne noch mal Durch wenn Du uns sagst, wo Du nix checkst - aber eigentlich dachte ich die Logik wäre soweit klar gewesen...
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.