Hallo zusammen, ich bin von Hause aus Entwickler. Hab aber auser Taster und LED Testprogrammen auf dem µController noch nicht viel gemacht. Mein tägliches Brot ist C++ und Java. Nun möchte ich eigentlich schon seid Ewigkeiten ein bißchen was mit µControllern machen. Bisher hat mir immer ein für mich realistisches Ziel gefehlt. Das hat sich nun geändert. Ich denke das folgende ist schön klein und übersichtlich und für den Einstieg geeignet. Wahrscheinlich gibt es ähnliches schon. Das ist nicht so wichtig. Ich möchte es halt selber machen und hoffe - da es für meine Bahn ist - das dadurch die Motivation dieses mal hoch genug ist, das ich es dann auch zuende schaffe. Es gibt 8 Lichtschranken, die in einer Autorennbahn eingebaut sind. Für jede Spur eine Lichtschranke. Außerdem soll es 8 7-Segmentanzeigen geben. Auf den LEDs soll die Plazierung des Fahrers zu sehn sein. Wer also nach dem Start als erster wieder über die Lichtschranke fährt, sieht dort die 1, der nächste die 2, usw. Danach ist die Anzahl der gefahrenen Runden ausschlaggebend - bei Gleichstand ist der schnellere vorne. Es sollen keine Zeiten gemessen werden! Es wird nicht die Anzahl der Runden sondern die Plazierung angezeigt. Ich habe hier ein STK500 Board mit einem Atmega 8515L, vier 7-Segmentanzeigen und einen MAX7219. Die Taster des STK500 sollen erstmal die Lichtschranken ersetzen. Den MAX nutze ich, da der µController später mal noch anderes machen soll und ich so Pins sparen kann. Mein Problem: Mir fehlt die Erfahrung umd das ganze anzugehen. Aus dem täglichen Projektwahnsinn weiß ich, das eine ordentliche Planung ne Menge Arbeit erspart :-) Wie ich den MAX mit den Anzeigen verbinde und das ganze vom ATMEL anspreche weiß ich - dazu gibts hier im Forum ja auch schon einiges. Aber wie gehe ich am besten bei den Eingängen vor? 8 Lichtschranken an 8 Ports finde ich unglücklich? Sicher gibts etwas ähnliches wie den MAX7219 auch für Eingangssignale. Vielleicht ist ja auch ein 74xx165 das richtige. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Schieberegister#Ansteuerung_per_SPI-Modul Wenn ich nun die Lichtschranken an ein Schieberegister anschließe, bekommt mein ATMEL ja nicht automatisch mit, wenn eine Lichtschranke ausgelößt wird. Meine Frage: Wie würde man sowas technisch sauber lösen, ohne das der µController in einer Endlosschleife ständig die Eingänge kontrolliert. Geht das mit nem ext. Interrupt oder eher mit nem Timer? Wie würde man das beschalten? Den ext. Interrupt müsste dann ja jede Lichtschranke auslösen können. Dazu wäre dann sicher etwas externe Schaltung nötig. Gibts sowas schon hier im Forum/Tutorial? Dann braucht das nicht noch mal durchgekaut werden. Ich hab leider nix gefunden. Ich möchte das ganze in C umsetzen. Soweit erstmal meine Einstiegsfragen. Kommt sicher noch mehr. Wäre nett, wenn Ihr mir mit Tipps oder Links auf die Sprünge helft. Bin jetzt erstmal wieder im Tutorial ... Martin
Hi >8 Lichtschranken an 8 Ports finde ich unglücklich? Reicht ein Port ( mit 8 Bit). >Meine Frage: Wie würde man sowas technisch sauber lösen, ohne das der >µController in einer Endlosschleife ständig die Eingänge kontrolliert. Dafür gibt es z.B. PinChange-Interrupts. MfG Spess
aaalso... wie du korrekt erkannt hast braucht der µC eine sehr schnelle reaktionszeit. die anzeigen daher einem anderen controller zu überlassen macht daher sinn, der µC braucht sich dann nur um aktualisierungen kümmern. ohne jetzt irgendwelche spezial-ICs zu kennen würde ich low-current-anzeigen verwenden und diese mit jeweils einem 8bit latch z.b. 74HC573 ansteuern. low-current-anzeigen können die direkt treiben. die datenleitungen aller latches kommen aneinander und die enable-anschlüsse kommen auf einen anderen port. also 16 leitungen insgesamt für 8 anzeigen. bei einer änderungen kommen zuerst die daten auf die datenleitungen und danach wird der enable des entsprechenden latches kurz eingeschaltet. das latch übernimmt die daten vom µC und gibt sie an die anzeige weiter. wenn das enable-signal dann wieder deaktiviert wird bleiben die ausgänge des latches in ihrem zustand egal was auf den datenleitungen am eingang passiert. die erfassung der lichtschranken ist das eigentliche problem. im schlimmsten fall fahren zwei autos absolut gleichzeitig durch die lichtschranken, der µC weiß dann nicht welcher nun vorne lag. außerdem brauchst du auch eine minimale impulslänge damit der µC das mitbekommt. also am besten mit interrupts, dann brauchst du aber für jeden pin einen interrupt. wenn der µC nichts weiter zu tun hat als sich auf die lichtschranken zu konzentrieren würde ich alle lichtschranken an einen port packen, damit kann ich alle mit einem einzigen befehl einlesen und in wenigen takten prüfen ob sich überhaupt was geändert hat. wenn ja kann ich weiterschauen was sich geändert hat und entsprechende änderungen an den anzeigen vornehmen. das muß aber alles schnell genug gehen, daß der µC wieder die lichtschranken abfragt bevor ein anderes auto hindurch gefahren sein kann! ob das in C geht weiß ich nicht, ich programmiere die µCs mit assembler. auf jeden fall einen schnellen µC nehmen, 16-20 mhz. besser zu schnell als zu langsam.
>ohne jetzt irgendwelche spezial-ICs zu kennen würde ich >low-current-anzeigen verwenden und diese mit jeweils einem 8bit latch >z.b. 74HC573 ansteuern. low-current-anzeigen können die direkt treiben. >die datenleitungen aller latches kommen aneinander und die >enable-anschlüsse kommen auf einen anderen port. also 16 leitungen >insgesamt für 8 anzeigen. bei einer änderungen kommen zuerst die daten >auf die datenleitungen und danach wird der enable des entsprechenden >latches kurz eingeschaltet. das latch übernimmt die daten vom µC und >gibt sie an die anzeige weiter. wenn das enable-signal dann wieder >deaktiviert wird bleiben die ausgänge des latches in ihrem zustand egal >was auf den datenleitungen am eingang passiert. Kann man sich wegen des MAXes sparen... >also am besten mit interrupts, dann brauchst du aber für jeden pin einen >interrupt. wenn der µC nichts weiter zu tun hat als sich auf die >lichtschranken zu konzentrieren würde ich alle lichtschranken an einen >port packen, damit kann ich alle mit einem einzigen befehl einlesen und >in wenigen takten prüfen ob sich überhaupt was geändert hat. Hatte Spess schon in ähnlicher Weise geschrieben... Jetzt mein Senf dazu: Wie schnell sind die Autos und wie hoch muss die "Uhr" auflösen? Beim Wintersport ist man soweit ich mich erinnere bei einer 100stel Auflösung. Das wäre ein 10ms-Raster, in dem man die Lichtschranken bafragen müsste. Dazu nimmt man einen Timer, der jede Millisekunde einen Interrupt auslöst, in dessen ISR die Eingänge (am besten einen Port) abgefragt werden, und bei einer Änderung zum vorherigen Zustand ein Flag setzen, das im Hauptprogramm ausgewertet wird. Warum jede Millisekunde abgefragt wird? Einfach, weil sich der Controller bei 1MHz Taktfrequenz bei der Aufgabe schon langweilt... Nebenbei könnte sich der Controller vermutlich auch noch selber um die Anzeigen kümmern, den Rennverlauf regeln und die Ergebnisse mit Rundenzeiten an einen PC übermitteln. Da wird es mit 1MHz zwar schon etwas knapp, aber 1MHz ist eh keine Baudratenkompatible Prozessorfrequenz.
Danke für Eure Hinweise und Tipps. Ich lese mir das heute Abend alles noch mal in Ruhe durch. Dennoch eine Frage in ganz andere Richtung. Die Lösung mit dem Timmer benötigt eine genauere Betrachtung der Zeiten (Geschwindigkeit der Autos, Dauer der Unterbrechung der Lichtschranke, usw ...). Nun bin ich bei AVR auf dieses Dokument gestoßen: http://www.atmel.com/dyn/resources/prod_documents/doc1232.pdf Hier geht man einen anderen Weg. Immer wenn ein Taster gedrückt wird, wird ein ext. Interrupt ausgelöst und man kann dann analysieren, welche(r) Taster es war. Aus meiner Sicht ne saubere Lösung, da jeder Taster diesen Interrupt auslösen kann und nix verloren geht - oder mach ich da einen Denkfehler? Bei echten Tastern müsste man sicher noch entprellen, aber bei Lichtschranken sollte das nicht nötig sein, oder? PCI scheint der 8515 nicht zu haben, daher würde ich darauf erstmal verzichten wollen. Martin
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.