- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Optischen Drehencoder auswerten ohne Interrupt?!

  1. #11
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    Anzeige

    E-Bike
    Doch habe ich. verstehe allerdings nur "Bahnhof"...

    Wo ist bei dir denn die Auswertung der "Phasen" ?

    - - - Aktualisiert - - -

    Doch habe ich. verstehe allerdings nur "Bahnhof"...

    Wo ist bei dir denn die Auswertung der "Phasen" ?
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  2. #12
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Zitat Zitat von Janiiix3 Beitrag anzeigen
    Doch habe ich. verstehe allerdings nur "Bahnhof" ... Wo ist ... die Auswertung der "Phasen" ?
    Was hast Du denn gelesen?
    Ciao sagt der JoeamBerg

  3. #13
    Benutzer Stammmitglied Avatar von Janiiix3
    Registriert seit
    29.11.2010
    Ort
    Hannover
    Alter
    33
    Beiträge
    48
    // === Nicht unterbrechbare ISR für timer2 =================================== */ // Routine zählt hoch im Takt 20 kHz = 50 µs. Der Zählerwert wird von den ISR für // EXT_INT0 und -INT1 ausgelesen ISR(TIMER2_COMPA_vect) // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { // Izeit_1 --; // ###>>> Izeit_1 ist aktuell int16_t ==>> // Izeit_1 bleibt bis 32000 in der int16-Grenze tupUM0 ++; // Tupsicounter für Umdrehungsmessung(en) tmrE0 ++; // Encodertimer hochtickern tmrE1 ++; // Encodertimer hochtickern //RCzeit1 ++; // Tupsicounter uint16_t für RC-5-Decoding if ( Izeit_1 ) // Interrupt-Timer = 1 ... 20 000 ... (1 sec blink) { } // WENN Izeit_1 =|= Null => wahr => Anweisung ausgeführen else // Izeit_1 = Null = unwahr, daher "else" ausführen { // Eine Sekunde ist voll => Izeit_1 = Izthrznt; // ansonsten: Rückstellen auf Zeithorizont ToggleBit (PgLED, L1g); // gnLED toggeln HEARTBEAT <<####, aktuell PC1 Isecundn ++; // Sekundenzähler hochtackern, max 9 Std } // Ende if (Izeit_1 ) if (tmrE0 > 2000) // Grenzwert für Stillstand // ... usf
    __________________________________________________ _________________
    /*Ich möchte gerne die Welt verändern, doch Gott gibt den Quelltext nicht frei.*/
    ( <-- Das ist Glubschie, er ist nett )

  4. #14
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    Wenn du das ganze in [code] tags packst, bleibt es lesbar

  5. #15
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.687
    Da steht aber nur was von Encodertimern. Nimm mal die Zeilen:
    Code:
    //      Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen
      Iz_diff0  = tmrE0;    // Abspeichern Zeit seit dem letzten ISR-Aufruf
      tmrE0     =    0;     // Resetten ##>> IN der ISR ohne CLI/SEI möglich
      Iencdr0 ++;           // Incrementiere Encodercounter, zählt NUR aufwärts
      if (IsBitSet (PIND, 4)) IencB0++;     // Rad treibt vorwärts,  math. negativ
      else                    IencB0--;     // Rad treibt rückwärts, math. positiv
    in dem Fenster wo drüber steht: "Die vollständige ISR für (m)einen Encoder bei Archie ..." - das ist GENAU das Vorgehen wie weiter oben mit der Kanalskizze beschrieben.
    Ciao sagt der JoeamBerg

  6. #16
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von Janiiix3 Beitrag anzeigen
    Nun habe ich das Problem, die Drehrichtung richtig auszuwerten.
    Kann mir dort jemand weiterhelfen?
    Code:
    Enc_State_new = (PIND & 0b00000011);
    
    unsigned char changedBits = Enc_State_old^Enc_State_new;
    if(changedBits) { 
    	if (Enc_State_new & 1)
    		if (changedBits == 1) Enc_Counter++;
    		else Enc_Counter--;
    	else
    		if (changedBits  == 1) Enc_Counter--;
    		else Enc_Counter++;
    
    	Enc_State_old = Enc_State_new;
    }
    Geändert von Sisor (14.09.2014 um 20:40 Uhr)

Seite 2 von 2 ErsteErste 12

Ähnliche Themen

  1. Interrupt ohne return (PICAXE)
    Von rudikx im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 29.03.2012, 11:02
  2. Interrupt Routine ohne automatische Register Sicherung
    Von Space im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 20.07.2010, 18:16
  3. A/D Wandler freerun ADC0 und ADC1 ohne Interrupt
    Von guenter1604 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 14.12.2009, 13:01
  4. Drehencoder auswerten
    Von MartinFunk im Forum C - Programmierung (GCC u.a.)
    Antworten: 11
    Letzter Beitrag: 16.05.2007, 17:05
  5. Timer-Interrupt ohne Funktion ?
    Von Technikus im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 08.08.2006, 10:37

Berechtigungen

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

Labornetzteil AliExpress