-
        

Ergebnis 1 bis 4 von 4

Thema: GP1A030 Drehgeber - Auswertung mit "C-Programm"

  1. #1
    Neuer Benutzer
    Registriert seit
    28.04.2008
    Ort
    München
    Beiträge
    3

    GP1A030 Drehgeber - Auswertung mit "C-Programm"

    Anzeige

    Hallo zusammen,

    bisher konnte ich alle Fragen zum RN-Control im Wiki oder Forum beantworten, jetz brauch ich aber eure Hilfe, da ich nicht recht weiterkomme.

    Den Sensor hab ich jetz nach folgender Anleitung "verlötet":



    Anschließen würde ich den Ausgang an PD2 und PD3 des µControllers am RN-Control.

    Nun aber die Frage, wie ich darauf zugreifen kann. Programmieren tu ich mit AVR-Studio in "C". Das "C-Beispielprogramm" hab ich mir schon angeschaut, bin aber nicht recht schlau geworden, wie ich den Port D auslesen soll.

    Ich hoffe ihr könnt mir helfen

    Gruss
    Phoenix2k
    Geändert von Frank (07.04.2011 um 13:45 Uhr) Grund: bild link repariert

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Hallo Phoenix2k,

    na ja, so richtig erzählst Du leider nicht, was Du machen willst. Da muss man sich schon was dazudenken. Hoffentlich ists richtig. Leider hast Du auch nicht geschrieben, welche Lichtschranke das ist. Aber bei der Portangabe in Deiner Zeichnung steht ja offensichtlich alles was Du wissen willst. (6) scheint der Signalausgang der Schranke zu sein. Den klemmst Du an einen Pinn vom Microcontroller, der als externer Interrupt extINTx definierbar ist - beim M32/M16 ist das der PD2 oder der PD3. Dort triggerst Du auf eine Flanke - steigende oder fallende - und holst Dir bei jedem Interrupt das Ereignis in der Interrupt-Service-Routine (ISR) ab, indem Du beispielsweise einen Zähler hochzählst. In der Hauptroutine kannst Du dann mit einem Signal von einem Timer die verbrauchte Zeit zwischen zwei Interrupts ausrechnen. Natürlich kannst Du Dir die verbrauchte Zeit auch in der ISR abholen - aber es ist eben gut, diese Routinen so kurz wie möglich zu halten.
    Ciao sagt der JoeamBerg

  3. #3
    Neuer Benutzer
    Registriert seit
    28.04.2008
    Ort
    München
    Beiträge
    3
    Hallo oberallgeier,

    es handelt sich um eine GP1A030. Ich möchte damit die Drehzahl des Antriebs von meinem Roboter messen.
    Interrupt etc. sagt mir im Moment leider noch nicht viel
    Da muss ich mich noch schlau machen.

    Am liebsten wäre mir ein link zu nem Beispielprogramm in "C" gewesen, damit ich sehe wie man das Ganze programmieren muss.

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Sorry für meine Blindheit, die Typenbezeichnung steht ja im Titel *brrrrrrrr*.

    Zitat Zitat von Phoenix2k
    ... Interrupt etc. sagt mir im Moment leider noch nicht viel ...
    Das ist schlecht.
    Zitat Zitat von Phoenix2k
    ... Da muss ich mich noch schlau machen ...
    Das klingt gut.
    Zitat Zitat von Phoenix2k
    ... Am liebsten wäre mir ein link zu nem Beispielprogramm in "C" gewesen, damit ich sehe wie man das Ganze programmieren muss.
    Das kann ich mir vorstellen .

    Das hier
    Code:
    /* >> 
     ===================================================================================
      Target MCU        : M168
      Target Hardware   : m168D   Direktor für R2D03
      Target cpu-frequ. : In der Quelle wählbar
     ===================================================================================
    ....
     ================================================================================ */
    
      
    /* ============================================================================== */
    /* ===  Initialisierung fuer EXT_INT0/1 auf Pin 16+17/mega168  =====================
    $002 jmp SIG_INTERRUPT0 ; IRQ0 Handler   _VECTOR(1)
    $004 jmp SIG_INTERRUPT1 ; IRQ1 Handler   _VECTOR(2)               */
    void XTI_0_1_init( void )	
    {                               //Initialisiere beide Interrupts auf rising edge
                                    //  d.h. EICRA ISC00,01,10+11 auf 1 (doc,S68)
        EICRA  |= (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00);
        EIMSK  |= (1<<INT1)|(1<<INT0);	//  und erlaube diese I´s in EIMSK
    }
    /* ============================================================================== */
    
    
    /* ============================================================================== */
    /* ===  Nicht unterbrechbare ISR für EXT_INT1 auf Pin 17/PD3/mega168  =========== */
    /* Routine setzt einfach einen Zähler hoch.
        Sonst wie ISR für EXT_INT0 für Motor li,re und PWM/Geschw.     */
    ISR(SIG_INTERRUPT1)
    {
        Iencdr2 ++;				//zähle Counter/encoder2 hoch
        Iz_yseci2 = Izeit_1;		//Weise Iz_ysec2 dem akt. Timerwert zu
        Iz_diff2 = Iz_yseci2-Iz_ysecv2;	//Neue Zeit-Differenz2 ausrechnen
        Iz_ysecv2 = Iz_yseci2;		//der aktuelle Zeitwert wird "Alter"
    }
    /* ============================================================================== */
    /* ============================================================================== */
    ist für (m)einen mega168 und sorgt bei diesem Antrieb für die Messwerterfassung. Die hier genannten Variablen sind wohl alle volatile uint16_t.

    Hilft das?
    Ciao sagt der JoeamBerg

Berechtigungen

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