- Akku Tests und Balkonkraftwerk Speicher         
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

    Einfacher ADC-interrupt

    Hi zusammen,

    ich habe ein wahrscheinlich relativ einfaches Problem, aber komme leider nicht weiter.
    Ich verwende einen ATmega32L.
    Am PINA7 ist ein einfacher Knopf angebracht, der beim Drücken einen Interrupt auslösen soll. Ich habe dann ins Datenblatt des ATmega32L geguckt und da steht neben dem PINA7 (ADC7).
    Wie gesagt, ich weiß leider echt nicht viel von Interrupts, habe mir dann einige Tutorials angeguckt und da bisschen was abgeguckt:

    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
    }
    Er springt beim Starten des Programms rein, aber danach nicht wieder ( also reagiert allgemein nicht auf den Button).
    Kann mir da wer helfen?


    Vielen Dank und sry, dass ich eine wahrscheinlich simple Frage habe.
    Geändert von RumpelHumpel (28.02.2013 um 07:41 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Hallo,

    und das ist der ganze Code?

    Ich bin der Meinung Du beschreibst gut was Du machen willst, aber das Programm sieht etwas merkwürdig aus. Ich gebe zu ich habe noch nicht viel in C programmiert...aber ich denke das man nicht über einen ADC-Eingang gleichzeitig auch einen Interrupt erhalten kann. Was man bekommen könnte bzw daraus machen könnte wäre eine Schaltschwelle...

    Einen Pin auf Ausgang zu setzen der als Eingang benutzt werden soll (- da hängt der Button dran), macht ziemlich wenig Sinn.
    Prüfe auch mal ob "ADCSRA |= 1<<ADSC; " so richtig wäre. Hier vermute ich zumindest einen dreher...
    Mit xxMUX stellt man soweit ich weiß die Widerstände intern ein...was 0, 1, 2 genau mit ADC7 zu tun hat würde ich gerne wissen?

    Ich fürchte für Dich ist es nicht getan ein paar Tutorials anzusehen und schon läuft die Sache. C ist etwas komplizierter in solchen Dingen asl z.B. Bascom.
    Geändert von HeXPloreR (27.02.2013 um 16:47 Uhr)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    Sry, war falsch kommentiert. Sollte eigentlich "Pin auf Eingang setzen" heißen

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    jo, das mit dem ADMUX scheint auf jedenfall schon mal irgendwie dazu zu gehören, und ist so auf "7" eingestellt - mein Fehler, irgendwie mit irgendwas verwechselt.

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    ... springt beim Starten des Programms rein, aber danach nicht wieder ...
    Woher weißt Du, dass die ISR nicht wieder angesprungen wird? Ich nehme in solchen Fällen in der ISR meist ein zusätzliches Statement, mit dem ich nen Ausgang (üblicherweise ne LED) toggle. Damit kann man etwas sehen oder bei schnellen Zyklen evtl. auf dem Oskar verfolgen.

    Code: ... wait{} ... ISR { ... GREEN_LED_ON;} ...
    Setzen wir mal voraus, dass das GREEN_LED_ON ein Makro ist, das auch den Ausgang so setzt, dass die LED angeht. Und wo bitte geht die wieder aus?!?!? Ich seh nur die leere wait{}. Dein Codefenster enthält 1. nicht den ganzen Code - siehe das fehlende Makro, 2. eine ISR mit einer einzigen Funktion und 3. eine leere wait-Schleife die keine Änderung des einmal hergestellten Zustandes bewirkt.

    Heilung evtl. durch ein Statement in der while-Schleife: delay_ms ( 1000); LED_OFF; delay_ms ( 1000); ... Das delay evtl. als die übliche Compilerroutine oder eine eigene Konstruktion - oder irgendeine Bremsschleife . . .

    Viel Erfolg
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der ADC wird für eine Wandlung gestartet, entsprechend wird auch nur eine Wandlung fertig und löst einen Interrupts aus.
    Der ADC kann nicht dazu genutzt werden um direkt bei einer Änderung am Eingang einen Interrupt auszulösen. Das ginge mit dem analogen Komparator, und über den MUX vom ADC könnte man hier auch den PIN PA7 als Eingng wählen.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    27.02.2013
    Beiträge
    7
    Das GREEN_LED_ON schaltet eine grüne LED für 1 Sek an, dann wieder aus, sry, habe ich nicht erklärt.
    Ok, danke für die Info. Ich dachte, wenn ich ADMUX vom ADC auf PIN PA7 stelle merkt der, wenn da eine Änderung passiert. Dann werde ich mir den Komparator mal angucken.

Ähnliche Themen

  1. Interrupt nach Aktivierung auslösen...
    Von Flario im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 08.10.2009, 13: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, 10:00
  3. Eingabe als Interrupt? Geht das
    Von hunni im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 20.08.2008, 09: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, 11:26
  5. Rücksprungposition nach einem ext.Interrupt
    Von lejcko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 27.01.2006, 16:21

Berechtigungen

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

12V Akku bauen