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;
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.