- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 17

Thema: Einfacher ADC-interrupt

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.698
    Zitat Zitat von RumpelHumpel Beitrag anzeigen
    ... GREEN_LED_ON schaltet eine grüne LED für 1 Sek an, dann wieder aus ...
    Es macht herzlich wenig Sinn, wenn man nur den halben Code einstellt und dann Zeile für Zeile nachbessert. Es macht nur die Lösungssuche ziemlich diffuser. Vor Allem wenn der geheimgehaltene Codeteil ("... LED für 1 Sek ...") möglicherweise den Kern des Problems in sich trägt.

    Zitat Zitat von RumpelHumpel Beitrag anzeigen
    ... dann wieder aus, sry, habe ich nicht erklärt ...
    Wurde ja schon von HeXPloreR angemerkt, dass Du recht wenig Code bereitgestellt hast, vermutlich um unsere Ratemöglichkeiten zu vervielfachen.

    Ich habe nen free running ADC z.B. für die Spannungscontrolle meiner Energieversorgung. Hier mal eine 1:1-Kopie des Codes für den m1284 - vielleicht hilft Dir das als Leitlinie für Deine Lösung. Übrigens siehst Du in der ISR auch zwei Zeilen für LED-Tests (wobei die Zeitmessung NICHT der tatsächliche Zeitbedarf der ISR im Target ist ! ! ! weil dabei der Overhead nicht erfasst wird). Den switch-Abschnitt kannst Du Dir ersatzlos sparen. Und nur als Warnung: keine Garantie für die Funktion - auch wenns bei mir bestens läuft - und abschreiben und experimentell weiterentwickeln hilft meist auch nicht.

    Code:
    // ============================================================================== =
    // ===  Initialisierung fuer ADC    mega1284   MIT Interrupt free running
    // ===    ADC5/PA5 auf 10 Bit,  fertige Wandlung ###>>> löst Interrupt aus
     void ADC_init_10_irupt(void)  // Initialisiere ADC, Kanal5, 10 Bit, MIT Interrupt
     {                         //
      if (adcptnr > 7) adcptnr  = 5;  // Defaultwert adcpnr
    // - - - - - - - - - - - - - - -
      switch (adcptnr)               // Initialisiere je nach ADC Pin Nummer
      {                             //
        case 0: case 1: case 2: case 3: case 4: case 6:     //
          break;                    //
        case 5:                     //
          adc5_cnt = 0;             // ADC-Wert wird x-fach aufaddiert
          adc5tcnt = 1;             //
          adc5_tmp = 0;             // ADC-x-fach-Speicher
          ADC5bMIN  = 1023;         // bisheriges Minimum setzen
          ADMUX  |= (1<<MUX0)|(1<<MUX2);    // Wandlung mit ADC5 (mega1284)   doc S 259
          uputs0 ("\r\tInitialisierung ADC auf ADC5/PA5=Poti\r");   //
          break;                    //
        default:                    //
          uputs0 ("\r\tInitialisierung ADC fehlgeschlagen\r");     //
          break;                    //
      }                             //
    // - - - - - - - - - - - - - - -
      ADMUX  |= (1<<REFS0);         // Referenzspannung ist AVcc                  S 258
      ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);   // Prescaler = clock/128      S 261
                            // Prescaler NUR für system clck 
      ADCSRA |= (1<<ADATE);         // Auto Triggering Enable               S 245 + 260
                    // es wird bei clock 20 Mhz mit ca. 80 µs getriggert
      ADCSRA |= (1<<ADIE);          // ADC Interrupt Enable                   doc S 260
      ADCSRA |= (1<<ADEN);  // ADC Enable
      ADCSRA |= (1<<ADSC);         // starte gleich die erste Wandlung
     }                              //
    // ============================================================================== =
    
    // ============================================================================== =
    // ===  Nicht unterbrechbare ISR für ADC
    // Routine übernimmt ADC-Wert und sichert Minimum
     ISR(ADC_vect)                  // VECTOR 25, Adr $0030
     {                              //
    //ClrBit(PORTC, 7);             // LED C7 ein, Zeitmessung: LED/PIN PC7
      adc5_tmp      = ADC;          // Hole Wert
      adc_status    = 170 + adcptnr; // Setze Flag "ADC-Wert abgeholt
      if (adcptnr == 5)              //
      {if (ADC5bMIN > adc5_tmp) ADC5bMIN = adc5_tmp;}   // Sichere bisheriges Minimum
    //SetBit(PORTC, 7);             // LED C7 aus, Zeitmessung: LED/PIN PC7
     }                              //
    // ============================================================================== =
    Und damit Du mir nicht ne Geheimhaltung von Makros vorhalten kannst:
    Code:
      #define SetBit(ADDR,BIT)       ((ADDR)  |=  (1<<(BIT)))       // Setzt Bit
      #define ClrBit(ADDR,BIT)       ((ADDR)  &= ~(1<<(BIT)))       // Löscht Bit
      #define ToggleBit(ADDR,BIT)    ((ADDR)  ^=  (1<<(BIT)))       // Toogelt Bit
    Geändert von oberallgeier (28.02.2013 um 08:10 Uhr) Grund: Macro nachgetragen (Verzug durch Telefonanruf)
    Ciao sagt der JoeamBerg

Ä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