Ich glaub da fehlt noch das ACME Bit in SFIOR um den MUX für den Analog Comparator zu aktivieren.
Gruß
Searcher
Ich wurde leider drauf festgenagelt und muss den PA7 benutzen. Wenn er gedrückt wird, liegt keine Spannung mehr an.
Das habe ich soweit rausgesucht, um mittels Comparator vergleichen zu können. Nach meinem Verständnis nach vergleicht er jetzt die Referenzspannung 2.56V mit der Spannung am PA7 ( ADC7) und sollte bei einer steigenden Flanke (Button gedrückt) einen Interrupt generieren und die grüne LED für 1 sek leuchten.Code:#define GREEN_LED_on PORTA |= (1<<PA3) #define GREEN_LED_off PORTA &= ~(1<<PA3) int main() { DDRA &= ~(1<<PA7); //PA7 als Eingang cli(); // Interrupt deaktivieren ADCSRA&=~(1<<ADEN); // ADC deaktivieren ACSR |= (1<<ACIE); // Enable analog comparator interrupt ADMUX |= ((1<<MUX1)|(1<<MUX2)|(1<<MUX0)); // Multiplexer auf ADC7 setzen ACSR |= (1<<ACIS1); // Interrupt soll bei steigender Flanke auslösen ACSR |= (1<<ACIS0); ACSR |= (1<<ACBG); // Auf Referenzspannung 2.56V setzen sei(); // Interrupt aktivieren while(1){} } // Grüne LED für 1 Sek leuchten lassen ISR(ANA_COMP_vect){ GREEN_LED_on; _delay_ms(1000); GREEN_LED_off; }
Geändert von RumpelHumpel (28.02.2013 um 16:31 Uhr)
Ich glaub da fehlt noch das ACME Bit in SFIOR um den MUX für den Analog Comparator zu aktivieren.
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Endlich vielen vielen Dank, genau das wars!
Wenn du Probleme mit prellenden Kontakten hast, kannst du vor Ende der ISR noch das ACI in ACSR vorsorglich durch Schreiben einer 1 löschen. (Wenn der Button prellt, was er sehr wahrscheinlich macht, könnte nach Einsprung in die ISR das Interruptflag sofort wieder gesetzt werden und steht bei Rücksprung aus der ISR wieder neu an. Effekt: ISR wird sofort wieder ein zweites Mal ausgeführt).
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Weg zu einigen meiner Konstruktionen
Das Löschen des Interrupt-falgs wäre einer erster Versuch gegen Prellen, aber bei einer kurzen ISR wird das Vermutlich nicht wirklich helfen. Die konsequente Lösung um mehrere Interrupts durch eine Flanke zu vermeiden wäre eine Verzögerung per Timer: als in der Komparator ISR einen Timer so programmieren das nach etwa 1 ms ein Interrupt kommt, und dann erst einmal den Komparator Interrupt ausschalten. In der Timer ISR wird dann der Komparator wieder scharf gemacht, und dafür der Timer deaktiviert.
Danke für die Hinweise, werde ich einbauen.
Ist es auch möglich, mit dem Komparator mehrere Eingänge zu übermachen z.B: ABC5-ABC7 und eine "pin-spezifischen" Interrupt zu generieren, wenn einer dieser Pins seinen Zustand ändert? Also das selbe, wie mein Codebeispiel weiter oben nur mit mehreren Eingängen?
Der Komparator kann immer nur einen Pin zur Zeit überwachen. Je nach µC gibt es einen PIN Change Interrut, der einen ganzen Port oder ggf. auch einen Teil davon überwachen kann, und dann einen Interrupt auslöst wenn sich einer Pins als Digitaler Eingang ändert. Welcher Pin dann der Auslöser war muss man in Software in der ISR bestimmen.
Lesezeichen