Forum: Mikrocontroller und Digitale Elektronik 8 Lichtschranken & 8 Siebensegmentanzeigen (Plazierungsanzeige)


von Martin B. (methusalem)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Ben _. (burning_silicon)


Lesenswert?

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.

von STK500-Besitzer (Gast)


Lesenswert?

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

von Martin B. (methusalem)


Lesenswert?

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