mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog Comparator des ATMega8 konfigurieren und in C verwenden


Autor: Christian W. (christian_w)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich werd leider über die Suche nicht fündig, wie ich nun genau 
den Analog Comparator vom ATMega8 verwende. Konkrete C-Beispiele gibts 
im technischen Datenblatt zum AC ja auch nicht. Zuviele verstreute Infos 
überall ;-)

Nun zum Thema:

Funktioniert der angehängte C-Code so, um den AC abfragen zu können?

Das spätere Programm läuft auf einem ATMega8L-8PU.

Danke

Christian
// Abfragen auf steigende Flanke
ACSR |= (1<<ACIS1);
ACSR |= (1<<ACIS0);

// Analog Comparator ein
ACSR |= (1<<ACD);

// Status vom AC abfragen
if ( (ACSR & (1<<ACO)) )
{
  // ...  
}

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hatte das mal mit Interrupt gemacht. Als pos. Vergleichsspannung 
hatte ich die intere Bandgap benutzt, einfach um für das Beispiel nicht 
zwei Spannungen anlegen zu müssen
http://www.mikrocontroller.net/articles/Pollin_Fun...

In deinem Code macht mich die Zeile
> ACSR |= (1<<ACD);
stutzig. ACD heisst Analog comparator disable

Autor: Christian W. (christian_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hoppla, es sollte natürlich heißen:
// Abfragen auf steigende Flanke
ACSR |= (1<<ACIS1);
ACSR |= (1<<ACIS0);

// Analog Comparator ein
ACSR &= ~(1<<ACD);

// Status vom AC abfragen
if ( (ACSR & (1<<ACO)) )
{
  // ...  
}

geht das dann so?

die interne referenzspannung zu verwenden ist mir etwas zu unsicher da 
ich schon öfter gelesen habe dass die nicht immer gleich ist, mal bei 
1,23 und dann mal wieder anders...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausprobieren.

Zwei Potis im 10K Bereich (unkritisch) jeweils zwischen 5V und GND, 
Schleifer an AIN0 und AIN1. Schleiferstellung vorher ausmessen und 
Hilfsskala anzeichen, damit du weisst, welche Spannung in etwa an den 
Pins anliegt. Oder Multimeter benutzen.

Eine LED mit Vorwiderstand an einen freien Pin. In die IF-Abfrage eine 
Anweisung zum Einschalten der LED und in den else-Fall eine Anweisung 
zum Ausschalten der LED.

Wenn alles funktioniert, Programm mit kurzer Beschreibung in den Artikel 
http://www.mikrocontroller.net/articles/AVR-GCC-Tu... 
posten (DANKE ;-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADD: Ich denke dass du die Flankentriggerung nur hast, wenn du mit dem 
Interrupt arbeitest. Ohne Interrupt hast du über das ACO-Bit einen 
statischen Vergleichswert IST<SOLL oder IST>SOLL. Ausgabe bei IST=SOLL 
müsste im Datenblatt spezifiziert sein (ACO-Bit 1?).

Autor: Christian W. (christian_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
klingt verständlich das mit dem interrupt. aber ich muss nicht zwischen 
steigender oder fallender flanke unterscheiden, sondern nur einen status 
wissen. außerdem: so zeitkritisch ist es bei mir nicht, dass es auf die 
mikrosekunde genau geht. eine abfrage alle paar millisekunden über eine 
if-schleife reicht da völlig aus. ich mach mal einen versuchsaufbau und 
werde berichten ;))) hab auch noch etwas angst vor interrupts, die hab 
ich bisher noch nicht verwendet, ist neuland.

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

Bewertung
0 lesenswert
nicht lesenswert
Dann gewöhn dich als Allererstes daran, dass ein if keine Schleife ist.
Das Wesen einer Schleife besteht darin, dass etwas wiederholt wird. 
Daher auch der Name. Klebt man ein Tonband zu einer Schleife zusammen 
und lässt es abspielen, so wird dieselbe Musik wieder und immer wieder 
wiederholt.
In einem if wird nichts wiederholt, sondern eine Auswahl aus 2 
Möglichkeiten getroffen. Daher ist der Ausdruck 'Schleife' hier nicht 
angebracht.

Autor: Christian W. (christian_w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß was eine if abfrage ist aber ich kann leider hier in diesem 
forum meine beiträge nicht mehr bearbeiten. warum auch immer!????

außenrum (im code oben nicht sichtbar) ist noch eine while-SCHLEIFE.

grins

Christian

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.