- 12V Akku mit 280 Ah bauen         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Einfacher ADC-interrupt

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    Anzeige

    Praxistest und DIY Projekte
    Ich wurde leider drauf festgenagelt und muss den PA7 benutzen. Wenn er gedrückt wird, liegt keine Spannung mehr an.
    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;	
    }
    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.
    Geändert von RumpelHumpel (28.02.2013 um 16:31 Uhr)

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    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

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    Endlich vielen vielen Dank, genau das wars!

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    Blog-Einträge
    133
    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

  5. #15
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

  6. #16
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    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?

  7. #17
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    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.

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Interrupt nach Aktivierung auslösen...
    Von Flario im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 08.10.2009, 14:35
  2. Einfacher Befehl um nach Variablenderung einmalig ausführen
    Von mirco99 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 06.11.2008, 11:00
  3. Eingabe als Interrupt? Geht das
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 20.08.2008, 10:58
  4. [gelöst] Variable löscht sich nach Interrupt?
    Von robodriver im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 14.11.2007, 12:26
  5. Rücksprungposition nach einem ext.Interrupt
    Von lejcko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 27.01.2006, 17:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test