Hallo Leute, ich habe ein Problem beim Bau einer Lichtschranken-Stoppuhr. Ich habe die 7Segment-Anzeige laut dem Tutorial gebaut (http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige) und habe auch schon die Lichtschranken fertig gelötet. Wenn die Lichtschranken nicht unterbrochen sind fließt kein Strom und wenn sie unterbrochen werden fließen 5V. Ich habe 2 identische gebaut. Ich wollte die Stoppuhr durch die erste Lichtschranke starten und durch die zweite Stoppen. Die Interrupt Eingange des ATmega8 liegen jedoch an PD2 und PD3 und dort ist aber schon die Multiplex-Anzeige angeschlossen. Kann ich die externen Interrupt auch an einem anderen Port auslösen? Grüße Christan
Gibt es die Möglichkeit den ATmega8 zu tauschen? Der Pinkompatible ATmega88 verfügt nämlich über Levelchange Interrupts an den Pins. Bei diesem uC könntest du also die Signale deiner Lichtschranken an anderen Pis anschließen und dann im Level Change Interrupt abfragen von welcher Lichtschranke das Signal gekommen (der ATmega88 hat nämlich nur eine globale Level Change ISR für alle Pins). Ansonsten wäre die Frage offen ob PD2 UND PD3 von der Multiplex Anzeige verwendet werden, oder nur einer? Dann gäbe es nämlich noch eine weitere Möglichkeit.
Hey Albert, erstmal Danke für deine Antwort. Tauschen würde ich nur im Notfall, falls es wirklich nicht anders geht. Das ganze gibt eine Facharbeit für die Schule und ich habe nur den ATmega8 zuhause. Den Atmega88 müsste ich dann erst wieder bestellen. Die Ports PD0 bis PD7 werden alle durch die 8 Anschlüsse der 7Segment-LEDs belegt. (Schaltplan habe ich angehängt). Wenn es garnicht anders geht könnte ich den Anschluss für den Dezimalpunkt weglassen und hätte somit einen Interrupt-Eingang frei. Ich hätte aber gerne zwei Lichtschranken angeschlossen. Gibt es eine Möglichkeit die Interrupts an Port B abzufragen, denn dieser wird garnicht benutzt? Grüße Christian
Christian schrieb: > Gibt es eine Möglichkeit die Interrupts an Port B abzufragen, denn > > dieser wird garnicht benutzt? Nein. Aber du kannst die Eingänge pollen. Du könntest einen Timer nehmen und bei jedem Interrupt liest du den Port ein. Oder du setzt das in die Hauptprogrammschleife. mfg.
Vielleicht kannst Du die 7-Segment LEDs auch an den PB Port anschliessen ? Oder zumindest PD2 und PD3 freimachen ?
Thomas Eckmann schrieb: > Nein. > Aber du kannst die Eingänge pollen. > Du könntest einen Timer nehmen und bei jedem Interrupt liest du den Port > ein. Oder du setzt das in die Hauptprogrammschleife. > > mfg. Das klingt sehr gut. Dann hätte ich einen Timer der die Zeit für die Stoppuhr liefert, einen der die Multiplex Frequenz bereitstellt und einen der PB0 und PB1 ständig ausließt und bei einer Änderung die Stoppuhr startet bzw. stoppt. Aber hat der ATmega8 überhaupt so viele Timer die das auch bewerkstelligen können? Kai S. schrieb: > Vielleicht kannst Du die 7-Segment LEDs auch an den PB Port anschliessen > ? > > Oder zumindest PD2 und PD3 freimachen ? Die 7-Segment LED braucht mit Dezimalpunkt 8 Anschlüsse. Port D ist der einzigste Port der auch aus 8 Anschlüssen (PD0-PD7) besteht. Ich weiß nicht ob es möglich ist nur PD0-PD1 und PD4-PD7 zu nehmen und die anderen fehlenden anschlüsse auf PB0 und PB1 zu legen. Normalerweise würden die Anschlüsse dann alle schon am Port D liegen und anders muss ich die Ausgabe irgenwie splitten damit sie an Port B gelangt. Über die 8 Anschlüsse werden nämlich die Segmente die leuchten sollen an und aus geschaltet. Grüße Christian
>Ich weiß nicht ob es möglich ist nur PD0-PD1 und PD4-PD7 zu nehmen und >die anderen fehlenden anschlüsse auf PB0 und PB1 zu legen. Das ist Null Problem und sogar eher der Normalfall. Man hat selten alle acht Pins eines Ports für die direkte Ausgabe auf einen 8-Bit-Bus zur Verfügung. Es gibt immer irgendwelche Pins, deren Sonderfunktionen man nutzen möchte, oder es scheitert an den Weniger-als-acht-Pins-Ports (z. B. Port C beim ATmega8). >...anders muss ich die Ausgabe irgenwie splitten damit sie an Port B gelangt. Ja, aber das ist mit ein paar Zeilen Code kurz und schmerzlos erledigt. Ist doch für die Bewertung Deiner Arbeit vielleicht ganz positiv, wenn Du zeigen kannst, mit diesem Problem gut fertig geworden zu sein.
Christian schrieb: > Dann hätte ich einen Timer der die Zeit für die Stoppuhr liefert, einen > der die Multiplex Frequenz bereitstellt und einen der PB0 und PB1 > ständig ausließt und bei einer Änderung die Stoppuhr startet bzw. > stoppt. > Aber hat der ATmega8 überhaupt so viele Timer die das auch > bewerkstelligen können? Der ATmega8 hat insgesamt 3 Timer (Timer 0/1/2). Was du auch machen könntest wäre die Multiplex Frequenz und die Feststellung welche Lichtschranke aktiviert wurde in einen Timer packen. Natürlich unter der vorraussetzung das deine Multiplex Frequenz hoch genug ist. Auch muss die zeitliche Verzögerung von auftreten der Signaländerung durch deine Lichtschranke bis es durch den Timer festgestellt wird (im worst case eine Pulsperiode) für dich tolerierbar sein. Ansonsten eben einen seperaten Timer für die Lichtschranken. Diese Lösung hat den Vorteil das du dann sehr eifnach weitere Lichtschranken hinzufügen kannst/könntest. Oder du befreist dir PD2 und PD3 und setzt diese Pins auf PORTB. Wenn du damit Probleme haben solltest kanst du ja noch einmal fragen. Ein kurzes Code-Schnipsel sollte dann genügen.
Vuvuzelatus schrieb: >>Ich weiß nicht ob es möglich ist nur PD0-PD1 und PD4-PD7 zu nehmen und >>die anderen fehlenden anschlüsse auf PB0 und PB1 zu legen. > > Das ist Null Problem und sogar eher der Normalfall. Man hat selten alle > acht Pins eines Ports für die direkte Ausgabe auf einen 8-Bit-Bus zur > Verfügung. Es gibt immer irgendwelche Pins, deren Sonderfunktionen man > nutzen möchte, oder es scheitert an den Weniger-als-acht-Pins-Ports (z. > B. Port C beim ATmega8). > >>...anders muss ich die Ausgabe irgenwie splitten damit sie an Port B gelangt. > > Ja, aber das ist mit ein paar Zeilen Code kurz und schmerzlos erledigt. > Ist doch für die Bewertung Deiner Arbeit vielleicht ganz positiv, wenn > Du zeigen kannst, mit diesem Problem gut fertig geworden zu sein. Moin, ich habe mal ein bisschen gelötet und habe jetzt die Anzeige fertig. (oben links werden mit Transistoren die LED-Bausteine an und aus geschaltet; ganz rechts wird + angeschlossen; unten links wird das anzuzeigende Muster für die Segmente bereitgestellt.) Ich muss nur moch die Kabel für die Verbindung mit dem µC fertig machen. Die Lichtschrnaken habe ich mit + und Masse mit der Olimax-Platine verbunden. Hier fehlen nur noch die Signalleitungen. Ich habe das ganz mit Steckverbindungen gemacht damit ich die Stoppuhr auch leicht in die Schule zum Kolloquium transportieren kann. Ich werde es nun so machen das ich die Ports PD0-PD1, PD4-PD7 und PB0-PB1 als Anschlüsse für die LED verwenden. Port C (PC0-PC4) steuert die Transistoren und an PD2 und PD3 schließe ich die Signalleitungen von den Lichtschranken an. Somit habe ich einen Timer für die Multiplexfrequenz und einen für die Stoppuhr. Durch den ersten Intterupt wird die Stoppuhr gestartet und durch den zweiten gestoppt. Bei der Programmierung werde ich mich an den Tutorialen von dieser Seite orientieren. Albert ... schrieb: > Oder du befreist dir PD2 und PD3 und setzt diese Pins auf PORTB. Wenn du > damit Probleme haben solltest kanst du ja noch einmal fragen. Ein kurzes > Code-Schnipsel sollte dann genügen. Ich denke so werde ich es auch machen. Stellt euch schonmal darauf ein das noch ein paar Fragen folgen werden :) Vielen Dank nochmals für eure tollen Antworten. Grüße Christian
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.