mikrocontroller.net

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


Autor: Unterbrecher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Düsendieb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Multiplexen.
Die drei Signale mit drei UND Gatter nacheinander an den INT0 schalten 
und nacheinander messen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: oldmax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Vuvuzelatus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.