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
Multiplexen. Die drei Signale mit drei UND Gatter nacheinander an den INT0 schalten und nacheinander messen
Ihr habt noch die Input Capture Unit als Interrupt faähigen Eingang zur Verfügung.
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.
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.
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.
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.
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
Ich vermute mal, dass es reichen wird die Eingänge abzutasten. Die Flankenauswertung kann man nach ggf. notwendiger Entprellung mit einem XOR erledigen.
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.