- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 17

Thema: Einfacher ADC-interrupt

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    Code:
    #define GREEN_LED_on		PORTA |= (1<<PA3)
    #define GREEN_LED_off		PORTA &= ~(1<<PA3)
    Code:
    int main()
    {
    
    DDRA &= ~((1<<PA7));	// Pin PA7 auf Eingang setzen, da hängt der Botton dran
    ADCSRA = 0x8F;                 // ADC und Interrupts aktivieren
    ADMUX |= ((1<<MUX0)|(1<<MUX1)|(1<<MUX2));  // Auf ADC7 setzen
    sei();
    ADCSRA |= 1<<ADSC;      //starten
    
    	
    	while(1){}
    }
    
    
    ISR(ADC_vect){
    	GREEN_LED_ON(); // Macro, schaltet LED für 1 sek an, dann wieder aus
    }
    Code:
    void GREEN_LED_ON(void)
    {
    GREEN_LED_on;
    _delay_ms(1000);
    GREEN_LED_off;
    }

    Dein Beispiel würde ja einen Interrupt auslösen, wenn der ADC fertig mit der Arbeit ist. Ich bräuchte aber irgendwie eine Möglichkeit, dass der ADC ständig guckt, ob sich was ändert und im Falle einer Änderung einen Interrupt wirft. Also so ne Art externer Interrupt bei Benutzereingabe. Ist sowas möglich? Also gibts es ne Möglichkeit, den ADC dauerhaft laufen zu lassen und nur bei einer Änderung einen Interrupt zu generieren?

    ich habe dann mal auf den Tip von weiter oben gehört und mir den Komparator angeguckt. Der sollte ja 2 Eingänge überprüfen können und mir dann sagen, ob sich was geändert hat. Führt man den auch nur einmal aus,sprich gibt es nur eine Überprüfung oder wird der dauerhaft betrieben?
    Geändert von RumpelHumpel (28.02.2013 um 15:12 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.716
    Blog-Einträge
    133
    Zitat Zitat von RumpelHumpel
    Ich bräuchte aber irgendwie eine Möglichkeit, dass der ADC ständig guckt, ob sich was ändert und im Falle einer Änderung einen Interrupt wirft. Also so ne Art externer Interrupt bei Benutzereingabe. Ist sowas möglich? Also gibts es ne Möglichkeit, den ADC dauerhaft laufen zu lassen und nur bei einer Änderung einen Interrupt zu generieren?
    Geht mit dem ADC nicht.

    Zitat Zitat von RumpelHumpel
    Der sollte ja 2 Eingänge überprüfen können und mir dann sagen, ob sich was geändert hat. Führt man den auch nur einmal aus,sprich gibt es nur eine Überprüfung oder wird der dauerhaft betrieben?
    Der Analog Comparator wird dauerhaft betrieben.

    Warum nimmst du nicht INT0,1 oder 2? Bist du da auf den PA7 festgenagelt?

    Welche Spannungsänderungen verursacht denn der Button?

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

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

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

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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.716
    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

  7. #7
    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.

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress