Forum: Mikrocontroller und Digitale Elektronik 3 Interruptquellen auswerten am ATmega8, wie ?


von Unterbrecher (Gast)


Lesenswert?

Für ein kleines Schulprojekt in der Elektronik AG haben wir (Die Klasse) 
uns vor den Ferien alle das myAVR Board bestellt. In der Zwischenzeit 
ist das geliefert worden und mein Vater hat mir beim Zusammenlöten 
geholfen.

Mein Vater hat so einen 1:5 Monstertruck und hat irgendwo im Internet 
gelesen, das man auch mit dem Mikrocontroller so eine Onboardstarter 
Einheit bauen kann. Oder Licht  Bremslicht  Blinker.

Jetzt sind wir schon seit Stunden dabei nach Source Code (c soll es 
sein) Beispielen zu suchen, wie man 3 Zeiten über 3 PIN am ATmega8 
misst.

Mit PIN INT0 und INT1 haben wir da schon einen Teilerfolg gehabt. 
Irgendwie ging das zwar nicht richtig wegen den 3,6864MHz und den 
Taktteilern für die Timer aber wir glauben das wir verstanden haben wie 
das geht.

Wie kriegen wir jetzt aber 3 Signale aus 3 einzelnen Empfängerkanälen 
mit dem ATmega8 gemessen ?

- Timer0 laufenlassen
- Timer1 laufenlassen
- Signal kommt an INT0 --> Wert merken
- INT0 auf gehendes Signal umstellen
- Signal geht an INT0 --> Wert merken
- Timer0 reset
- Signal kommt an INT1 --> Wert merken
- INT1 auf gehendes Signal umstellen
- Signal geht an INT1 --> Wert merken
- Timer1 reset

Das klappt bis auf ein paar Aussetzer wegen des Taktes.

Wie machen wir das nun mit dem 3. Signal ?
Welcher PIN ?
Welcher Timer ?

Helft uns da mal bitte. Das grosse Datenblatt ist da irgendwie im 
Kapitel Interrupt auch nicht so hilfreich.

Der Unterbrecher

von Düsendieb (Gast)


Lesenswert?

Multiplexen.
Die drei Signale mit drei UND Gatter nacheinander an den INT0 schalten 
und nacheinander messen

von Karl H. (kbuchegg)


Lesenswert?

Ihr habt noch die Input Capture Unit als Interrupt faähigen Eingang zur 
Verfügung.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Müssen immer alle Pulsdauern von den Signalen A, B und C gemessen 
werden? Dann wird's knifflig. Wenn die Pulse nacheinander gemessen 
werden können (und damit ein paar Pulse der jeweils anderen Linien 
verloren gehen dürfen) dann geht das einfach mit dem IC (InputCapture).

Als Eingang des IC kann der Ausgang des Input-MUX des ADC verwendet 
werden falls der ADC nicht gebraucht wird, d.h. das Signal läuft so:

A -> Input-Mux -> InCapt
B ->
C ->

A, B, C werden nacheinander abgearbeitet. Dies erlaubt bis zu 9 
Eingangsleitungen (bis zu 8 vom InMUX des ADC und ein InCapt-Pin).

Bei "gleichzeitiger" Messung wird man ein Signal per InCapt einlesen und 
auswerten, für die anderen beiden eine PinChange-IRQ bzw INT0/1 
verwenden. Probleme wird es dann geben, wenn der Timer kurz vor oder 
nach seinem Überlaufwert ist. Dann muss nämlich so programmiert werden, 
daß man die Reihenfolge von INT0/1 und Timer-Überlauf richtig erkennt. 
Wenn diese zB nur 2 Ticks auseinanderliegen, braucht man etwas 
Hirnschmalz um dies immer richtig zuzuordnen.

BTW: Mit einem ATmega88 ist's vielleicht was konfortabler, da der im 
Gegensatz zum ATmega8 PinChange-IRQ kennt.

von Thorsten (Gast)


Lesenswert?

Die Frage ist ja eigentlich wie genau soll eure Zeitmessung sein? Man 
könnte auch einen Timer-Interrupt (z.B. alle 1 ms) nehmen und drei Pins 
innerhalb der ISR abfragen.

von Lutz (Gast)


Lesenswert?

Habe ich bzw. wir das jetzt richtig verstanden: Ihr wollt an z.B. 3 Pins 
Signalzeiten messen?
Bei extrem kurzen Zeiten wurde schon die Capturefunktion der Timer 
genannt. Gibt es aber auch leider nicht so viele von und werden 
vielleicht auch noch anderweitig benötigt.
Bei "längeren" Zeiten und mehr Meßkanälen würde ich es so machen: Eine 
Zeitreferenz permanent durchlaufen lassen und per Pinchangeinterrupt in 
der zugehörigen ISR Zeitstempel machen. Diese Zeitstempel dann außerhalb 
der ISR weiterverarbeiten.

von Michael (Gast)


Lesenswert?

Lutz schrieb:
> Pinchangeinterrupt

Hat aber der Atmega8 nicht, dann muss der TE den Atmega88 nehmen der 
glücklicherweise jedoch Pin-kompatibel zum Atmega8 ist. Ich denke aber 
auch, dass das Vorhaben des TEs auch mit dem Atmega8 geht. Aber warten 
wir doch mal auf den TE bis er mehr dazu sagt, z.B. wie die Signale 
aussehen, auf die der Atmega reagieren soll.

von oldmax (Gast)


Lesenswert?

Hi
Warum nicht die drei Signale auf normale Eingänge und über ein Und-Glied 
zusammengefasst auf Int0 schalten ( wenn Eingänge nach 0 geschaltet 
werden) oder über Dioden zusammenfassen ( Wenn Eingänge nach 1 
schalten).
In der ausgelösten ISR prüfst du die Eingänge und reagierst 
entsprechend.
Gruß oldmax

von Simon K. (simon) Benutzerseite


Lesenswert?

Ich vermute mal, dass es reichen wird die Eingänge abzutasten. Die 
Flankenauswertung kann man nach ggf. notwendiger Entprellung mit einem 
XOR erledigen.

von oldmax (Gast)


Lesenswert?

Hi
@ Simon
Ok, in der Regel gebe ich dir recht, auch ich kenne nur wenige 
Anwendungen, wo Eingänge über Interrupt erfasst werden müssen. Aber es 
wird von Zeitmessung gesprochen. Da die Art der Signalgeber nicht 
bekannt ist, ist's durchaus möglich, das die Eingänge der Genauigkeit 
wegen über eine ISR erfasst werden müssen.
Gruß oldmax

von Falk B. (falk)


Lesenswert?

Jaja, und schon wieder fabuliert man über des Kaisers neue Kleider.

Kleiner Tip an den OP und alle Hilfsphilosophen: Netiquette.

Beschreibe dein VORHABEN klar und deutlich.

MFG
Falk

von Vuvuzelatus (Gast)


Lesenswert?

>wie man 3 Zeiten über 3 PIN am ATmega8 misst.

Das hängt stark davon ab, in welcher Größenordnung diese Zeiten liegen, 
und mit welcher Auflösung und Genauigkeit gemessen werden soll.

(Nein, "Zeiten möglichst kurz und Auflösung + Genauigkeit möglichst hoch 
bei gleichzeitig möglichst einfachem Messverfahren, möglichst kleiner 
Platine und möglichst geringen Kosten" ist keine sinnvolle Forderung!)

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.