Forum: Mikrocontroller und Digitale Elektronik Externe Interrupts nur an PD2 und PD3 ?


von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Albert .. (albert-k)


Lesenswert?

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.

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

von Kai S. (zigzeg)


Lesenswert?

Vielleicht kannst Du die 7-Segment LEDs auch an den PB Port anschliessen 
?

Oder zumindest PD2 und PD3 freimachen ?

von Christian (Gast)


Lesenswert?

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

von Vuvuzelatus (Gast)


Lesenswert?

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

von Albert .. (albert-k)


Lesenswert?

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.

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

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