Forum: Mikrocontroller und Digitale Elektronik Analog Komperator (ATMega 8)


von Jugels (Gast)


Lesenswert?

Hi,

ich möchte den internen Analogkomperator für eine Spannungsüberwachung 
benutzen. Wird die Spannung zu groß, soll eine bestimmte LED leuchten. 
Bei meinem Testaufbau mit Verwendung der internen Referenzspannung, die 
bei 1,3V liegen soll, leuchtet bei mir immer die LED (egal, ob ich den 
Eingang auf Masse oder Vcc lege). Da ich mich erst seit kurzen mit C und 
Mikrokontroller auseinander setze, brauche ich mal eure hilfe. Ich 
vermute mal, das bei der Abfrage etwas nicht stimmt.

mfg zoran

#include <avr/io.h>

DDRB = 0b11000011;   //Ein- und Ausgänge an Port B definieren
DDRD = 0b00100000;   //Ein- und Ausgänge an Port D definieren
ACSR = 0b01000000;      // interne Referenzspannun an


while (1)
{
  if (ACSR & (1<<ACO)) //Abfrage Komperator
  {
  PORTB |= (1<<PB0); //LED Störung an
  }
  else
  {
  PORTB &= ~(1<<PB0); //LED Störung aus

}
return 0;

von Jonny O. (-geo-)


Lesenswert?

Wenn ich jetzt nichts vergessen habe, musst du grob das hier abklappern:


ACSR &= ~(1<<ACIE); // Comparator Interrupt ausschalten

ACSR |= (1<<ACIS1)|(1<<ACIS0); //steigende Flanke aktivieren (nur 
Beispiel)

ADCSRA &= ~(1<<ADEN); // AD Wandler auschalten --> muss sein

ADMUX &= ~ ( (1<<MUX0)|(1<<MUX1)|(1<<MUX2)); // hängt davon ab mit 
welchem ADC Kanal verglichen wird und ist hier nur ein Beispiel

SFIOR |= (1<<ACME); // Analog Comparator Enable Bit setzen

ACSR |= (1<<ACIE); // Comparator Interrupt Enable setzen damit Interrupt 
aktiv



ISR(ANA_COMP_vect)
{
//Hier kommt der Code rein, was passieren soll wenn Analogkompevent. 
sei() vorher nicht vergessen
}

gruß
jonny

von Jugels (Gast)


Lesenswert?

Hi,

habs hinbekommen, größtes Problem war, das ich mit AVR Studio arbeite, 
und wenn man auf den Controller schreiben will, muss man vorher angeben, 
welches HEX File man brennen möchte, hatte natürlich nicht daran gedacht 
und immer den alten Mist gebrannt ;) Das Problem sitzt oft vorm PC ...

@ Jonny
danke für den Code. Hardwaretechnisch habe ich das schon so verdrahted, 
das ich die AIN0 und AIN1 Eingänge benutzen möchte, möchte Später die 
Referenzspannung über einen Poti einstellen können. Die ADC Eingänge 
könnte man dafür ja auch benutzen, aber ich weiß nicht, ob dann ein 
Interupt gesetzt wird.

mfg zoran


Damit funktionert es (ohne Interupt programmiert)

#include <avr/io.h>

void main (void)
{
DDRB = 0b11000011;   //Ein- und Ausgänge an Port B definieren
DDRD = 0b00100000;   //Ein- und Ausgänge an Port D definieren
ACSR = 0b01000000;  //analog Komperator interne Referenzspannung

while (1)
{
  if (ACSR & (1<<ACO)) //Abfrage Komperator
  {
  PORTB |= (1<<PB0); //LED Störung
  }
  else
  {
    PORTB &= ~(1<<PB0); //LED Störung
  }

}
return 0;
}

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
Noch kein Account? Hier anmelden.