Analog Comparator des ATMega8 konfigurieren und in C verwenden

OP #1946851
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
1
// Abfragen auf steigende Flanke
2
ACSR |= (1<<ACIS1);
3
ACSR |= (1<<ACIS0);
4

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

8
// Status vom AC abfragen
9
if ( (ACSR & (1<<ACO)) )
10
{
11
  // ...  
12
}
Angehängte Dateien:
Persönliche Seite #1946904
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_Funk-AVR-Evaluationsboard#Analog_Comparator

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

hoppla, es sollte natürlich heißen:
1
// Abfragen auf steigende Flanke
2
ACSR |= (1<<ACIS1);
3
ACSR |= (1<<ACIS0);
4

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

8
// Status vom AC abfragen
9
if ( (ACSR & (1<<ACO)) )
10
{
11
  // ...  
12
}

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...
Persönliche Seite #1947019
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-Tutorial#AC_.28Analog_Comparator.29 
posten (DANKE ;-)
OP #1947135
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.
#1947153
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren