www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 3 Komparatoren AtMega8


Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit!

Ich versuche gerade meinen AtMega8 3 Spannungen zuzuführen die er mit 
einer vierten Spannung vergleichen soll. Nun hat der Mega ja nen AIN0 
nen AIN1 und 5 ADC Eingänge.

Wie kann ich damit nun 3 Komparatoren verwenden? oder muss ich alle 
meine Spannungen mit dem ADC Wandler messen und vergleichen? Wohl nicht 
oder?

Beste Grüße
Phillip H.

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:

> Wie kann ich damit nun 3 Komparatoren verwenden? oder muss ich alle
> meine Spannungen mit dem ADC Wandler messen und vergleichen? Wohl nicht
> oder?

Was ist schlimm daran?

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich hätte gerne immer einen Interrupt direkt ausgelöst sobald eine 
der 3 Spannungen meine vergleichsspannung überschreitet. Das kann ich ja 
so mit nem ADC nicht ?

Autor: Andreas R. (rebirama)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst den Analogmultiplexer sowohl für den ADC als auch für den 
Analogkomparator verwenden. Gleichzeitige vergleiche mit drei 
Spannungen gehen aber mit keiner Variante. Nur nacheinander...

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich kann alle 5 Analogen Eingänge die sonst für ADC genutzt werden, 
auch für den Komparator verwenden und die mit AIN0 vergleichen zb.?

Kann ich das trotzdem mit Interrupts machen, sobald einer der 3 
Spannungen die Vergleichsspannung überschreitet?

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Also ich kann alle 5 Analogen Eingänge die sonst für ADC genutzt werden,
> auch für den Komparator verwenden und die mit AIN0 vergleichen zb.?
>
> Kann ich das trotzdem mit Interrupts machen, sobald einer der 3
> Spannungen die Vergleichsspannung überschreitet?

Nein.
Du musst nach wie vor, zb mit einem Timer den Multiplexer nacheinander 
auf einen der Eingänge schalten.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du nen Interrupt willst, dann nimm doch den des ADC.
In der ISR liest du dann den Wert von aktuellen Kanal aus, schaltest auf 
den nächsten Kanal und startest die Messung. Außerdem führst du die 
Vergleiche der drei Werte durch, und kannst dann entsprechend reagieren.


Und wenn es nur darum geht, ob eine oder mehrere der drei Spannungen die 
Vergleichsspannung überschreitet, dann könntest du auch die drei 
Spannungen über Dioden an einen Eingang des Komparators legen. Das gibt 
allerdings gewisse Ungenauigkeiten durch die Toleranzen der 
Flussspannungen.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Also so wie "kbuchegg" das meinte ist es wohl genauso wie ichs brauch, 
ich möchte gerne in meinem Programmcode sagen, jt soll ADC0 mit AIN0 
vergleichen werden, und nen Interrupt ausgelöst werden wenn er toggelt. 
Danach möchte ich auf ADC1 mit AIN0 vergleichen und wieder auf den 
Interrupt warten.

Nur verstehe ich nicht, wie mein Programmtext auszusehen hat, um den 
Multiplexer der mir die ADCx Eingänge intern richtig schaltet zusammen 
mit dem vergleicher zum AIN0 richtig zu programmieren?

MfG

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:

> Also so wie "kbuchegg" das meinte ist es wohl genauso wie ichs brauch,
> ich möchte gerne in meinem Programmcode sagen, jt soll ADC0 mit AIN0
> vergleichen werden, und nen Interrupt ausgelöst werden wenn er toggelt.

Das würde ich nochmal überdenken.
Da du sowieso einen Timerinterrupt brauchst um den Multiplexer 
durchzuschalten, kannst du auch nach dem Umschalten des Multiplexers 
auch gleich das Ergebnis des Vergleichs ansehen. Ein weiterer 
zusätzlicher Interrupt, den der Comperator auslöst, verkompliziert doch 
hier nur alles.

> Nur verstehe ich nicht, wie mein Programmtext auszusehen hat, um den
> Multiplexer der mir die ADCx Eingänge intern richtig schaltet zusammen
> mit dem vergleicher zum AIN0 richtig zu programmieren?

Dann wirds Zeit, den entsprechenden Abschnitt im Datenblatt zu studieren 
und ein Testprogramm zu machen, bei dem man das einfach mal ausprobiert 
einen einzigen ADC Eingang mit dem COmpareator zusammenzuschalten.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, im laufe meines Programmes schalte ich den Multiplexer auf den 
bestimmten Kanal und warte auf einen Interrupt des Comparators.
Ich kann ja nicht auf irgendeinen Interrupt warten!?

MfG

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Naja, im laufe meines Programmes schalte ich den Multiplexer auf den
> bestimmten Kanal und warte auf einen Interrupt des Comparators.

Denkfehler:
Auf einen Interrupt wartet man nicht.
Der passiert einfach.

Wenn du konzeptionell auf einen Interrupt warten musst, dann ist 
meistens etwas faul.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich warte ja darauf das mein Komparator nen Interrupt liefert, so 
mein ich das.

Also muss ich sehrwohl vorher im Progamm Multiplexer auf meinen Eingang 
umschalten den ich will. danach mach ich was nicht so kritisches. Sobald 
Interrupt da ist, mach ich 2 Zeilen und Schalte auf den nächsten Eingang 
usw.

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du schaltest per Timer-Interrupt reihum alle n Millisekunden auf einen 
anderen Port um. Irgendwann wird dann ein Comparator-Interrupt 
ausgelöst.

Dein Hauptprogramm wartet nun auf diese Flag und legt los, wenn es 
gesetzt ist. Ja, im Prinzip wartest Du auf den Interrupt.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich schalte eigentlich nicht per Timer Interrupt um, denn es ist 
so, sobald ein Comparator Interrupt ausgelöst wurde, Schaltet man in 
diesem Interrupt den Eingangsport weiter und nun wird am nächsten 
Eingang der Interrupt passieren.

Also er schaltet in jedem Interrupt weiter, nicht alle paar ms, sondern 
jenachdem wann der Interrupt kommt, weißt du wie ich meine?

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Naja ich schalte eigentlich nicht per Timer Interrupt um, denn es ist
> so, sobald ein Comparator Interrupt ausgelöst wurde, Schaltet man in
> diesem Interrupt den Eingangsport weiter und nun wird am nächsten
> Eingang der Interrupt passieren.

Und wenn dieser Interrupt nie passiert, wird auch nicht weitergeschaltet 
und aus ists mit deiner Reihum-Überwachung.

> Also er schaltet in jedem Interrupt weiter, nicht alle paar ms, sondern
> jenachdem wann der Interrupt kommt, weißt du wie ich meine?

Dein Konzept ist faul.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja richtig!

Wenn das nicht passiert gibts keine weitere Überwachung !

Das MUSS auch so sein! Solang beim Eingang 1 kein Comparatorinterrupt 
kommt, brauche ich Eingang 2 auch nicht anzusehen! Weil aus meiner 
übrigen Schaltung klar ist das nichts kommen kann bzw. darf!!!!!

MfG

Autor: Di Pi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit einem Hardware-Komparator, der am µC nur einen 
Pin-Change-Interrupt auslöst?

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Ja richtig!

OK

>
> Wenn das nicht passiert gibts keine weitere Überwachung !

Wenns für dich passt.
Dann ist die Sache ja noch viel einfacher.
Einfach im Komperator Interrupt auf den nächsten Multiplexer Eingang 
weiterschalten und fertig.

> Das MUSS auch so sein! Solang beim Eingang 1 kein Comparatorinterrupt
> kommt, brauche ich Eingang 2 auch nicht anzusehen! Weil aus meiner
> übrigen Schaltung klar ist das nichts kommen kann bzw. darf!!!!!

Aha.
Wieder mal so ein Konzept: Weil nicht sein kann, was nicht sein darf :-)

Was, wenn aber doch?
Für mich persönlich würde ich das nicht akzeptieren. Überwachung 
bedeutet: (Im Rahmen der technischen Möglichkeiten) Es wird ständig 
überwacht. Auch wenn der Fall eigentlich gar nicht auftreten kann. Denn 
genau die machen meistens die Probleme: Fälle die gar nicht auftreten 
'können', es aber trotzdem tun :-)

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, nein es hat absolut keinen Sinn das ganze zu überwachen, denn wenn 
es auftritt, verursacht es einen Fehler, und wenn ich das ganze erst 
garnicht überwache, kann auch kein Fehler passieren! Somit ist das 
einfache Multiplexer umschalten in einem Comparator Interrupt um einiges 
besser, da so ein Fehler im Prinzip nicht auftreten kann.

Nur das Problem in den Tutorials findi ich nur wie man AIN0 mit AIN1 
Compariert aber nicht wie ich mit nem Multiplexer auch die ADC Eingänge 
für den Comparator Interrupt nutzen kann.

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SFIOR = (1<<ACME);
ADMUX = 0;
ACSR = (1<<ACIE) | (1<<ACIS0) | (1<<ACIS1);


Hab grad mal einiges durchgelesen und wäre zu dem Ergebnis gekommen.
Müsste das nicht genau das machen was ich möchte ?

ACME aktiviert mir das, dass ich über den Multiplexer die ADC eingänge 
verwenden kann

ADMUX ist meine Kanalauswahl in dem Fall ADC0

ACIE aktiviert Interrupt
und ACIS0 und ACIS1 sind dafür verantwortlich, dass bei steigender 
Flanke ein Interrupt ausgelöst wird.

Nur meine Frage, stimmt das so? und muss ich mit dem "ACD" Bit auch was 
machen? eventuell löschen?

MfG

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hab mal etwas probiert und zwar erstmal nur AIN0 auf die interne Spg. 
Referenz zu geben, und AIN1 hab ich einen Umschalter zw. +5V und GND zum 
ansehen obs funktioniert. Aber es ist an den PORTB nur Masse.
Hat einer eine Idee warum?

#include <avr/io.h>

int main()
{
ACSR = 0x40 ;
char x=0;
DDRB=0xFF;
while(1)
{
  for(int i=0;i<1000;i++)
  asm("nop");
  x=ACO;
  if(x==0)
  PORTB=0x00;
  else if(x==1)
  PORTB=0xFF;

}


}

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, Problem gelöst ;)

if( (ACSR | (1<<ACO)) == ACSR)

Hilft da natürlich weiter

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Ok, Problem gelöst ;)
>
> if( (ACSR | (1<<ACO)) == ACSR)
>
> Hilft da natürlich weiter

Das ist die ungewöhnlichste Art, nachzusehen ob AC0 gesetzt ist, die 
hier im Forum jemals aufgetaucht ist

Warum nicht das kanonische

   if( ACSR & ( 1<<AC0 ) )

Autor: Phillip H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry liegt daran, das wir das in der Schule so doof gelernt haben!

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

Bewertung
0 lesenswert
nicht lesenswert
Phillip H. schrieb:
> Sorry liegt daran, das wir das in der Schule so doof gelernt haben!

Gewöhn dich um und sag deinem Lehrer einen schönen Gruß. Er möge sich 
überlegen was wohl passiert, wenn in ACSR just in dem Moment in dem die 
eine Seite des Vergleichs schon ausgewertet ist, die andere aber noch 
nicht, zufällig noch ein anderes Bit seinen Zustand wechselt.

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.