-         

Ergebnis 1 bis 10 von 10

Thema: Interrupts auf Pin 2 und 3

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    6

    Interrupts auf Pin 2 und 3

    Anzeige

    Hallo zusammen,
    ich bin neu hier und beschäftige mich noch nicht sooo lange mit Microcontrollern. Eigentlich bin ich Informatiker und hatte zuletzt auf dem TG vor über 20 Jahren einen Lötkolben in der Hand.
    Zur Frage: ich möchte die Drehzahl zweier Rotoren über eine Lochscheibe mit Gabellichtschranke messen (Interrupt gesteuert). Das Ausgangssignal der Lichtschranke pimpe ich über einen Transistor auf ca 4V High.
    Pin3 habe ich über einen 470KOhm Widerstand auf Masse gelegt um ein sauberes LOW zu bekommen. Ein kleines Programm schaltet über eine ISR die LED an Pin 13 ein und aus. So weit funktioniert das ganz gut.

    Was ich nicht verstehe: Ich kann ohne das Programm zu ändern die Lichtschranke auch auf Pin2 legen und das Ding schaltet trotzdem. Soll heißen: der Interrupt wird trotzdem ausgelöst und Pin 3 wird high gelesen obwohl dieser gar nicht belegt ist. Irgendwie scheinen die Potentiale der beiden Ports zusammenzuhängen ??
    kann mir das jemand erklären ?

    const byte LED = 13;
    const byte pin = 3;
    volatile int state;

    // Interrupt Service Routine (ISR)
    void pinChange ()
    {
    state = digitalRead (pin);
    if (state == HIGH)
    digitalWrite (LED, HIGH);
    else
    digitalWrite (LED, LOW);
    } // end of pinChange

    void setup ()
    {
    pinMode (LED, OUTPUT); // so we can update the LED
    pinMode (pin, INPUT);
    Serial.begin(9600);
    //digitalWrite (pin, LOW);
    // internal pull-up resistor
    attachInterrupt (1, pinChange, CHANGE); // attach interrupt handler
    } // end of setup

    void loop ()
    {
    // loop doing nothing
    }

  2. #2
    RN-Premium User Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Leipheim / Donau
    Beiträge
    53
    Hallo,
    ich weis ja nicht welche Controller du verwendest, könnte ein Initialisierungsfehler beim PinChange sein.
    Wie gesagt der Controllertyp wäre hilfreich.

    mfg ihle

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    6
    Hallo,
    erst mal danke. Arduino UNO atmega328, denke ich.

  4. #4
    RN-Premium User Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Leipheim / Donau
    Beiträge
    53
    Hallo demwz,

    also PIN2 ist PCINT16, PIN3 ist PCINT17 beide sind im gleichen Maskenregister PCMSK2 organisiert,
    es könnte durchaus sein, dass sie sich gegenseitig stören. Versuchs doch mal mit PIN1 und PIN2
    PIN1 ist im Maskenregister PCMSK1 du musst aber den PCINT1 im Kontrollregister zusätzlich freigeben.

    Frage: warum misst du die Drehzahl nicht mit einem Timer über eine Torzeit?

    mfg ihle

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Unbelegte Eingänge sind sehr empfindlich, da reichen ggf. schon die Kapazitäten der Pins nebeneinander aus damit das Signal auch auf dem offenen Pin erscheint. Ein Widerstand von 470 K ist zu groß für ein sicheres Low, vor allem bei steilen Flanken.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    01.01.2014
    Beiträge
    7
    Zitat Zitat von ihle Beitrag anzeigen
    also PIN2 ist PCINT16, PIN3 ist PCINT17 beide sind im gleichen Maskenregister PCMSK2 organisiert,
    Tut mir leid, aber das ist nicht richtig. Der Threadersteller bezieht sich auf die Arduino Pin-Nummerierung, welche von der Arduino IDE (in der die Arduino Plattform meist programmiert wird ) verwendet wird. Arduino Pin 2 ist demnach PD2 (INT0) und Arduino Pin 3 ist PD3 (INT1). Der Code sieht nach meinem Verständnis korrekt aus. Möglicherweise kommt es allerdings wirklich wie von Besserwessi erwähnt zu einer Einkopplung des Signales auf den benachbarten Pin. Eventuell würde es helfen Pin 2 als Ausgang zu definieren und auf auf einen definierten Wert zu setzen.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    6
    Zitat Zitat von ihle Beitrag anzeigen

    Frage: warum misst du die Drehzahl nicht mit einem Timer über eine Torzeit?
    In Erster Linie will ich gar nicht die Drehzahl sondern den Winkel des Motors (Rades mit 12-Loch-scheibe Maximale Drehzahl 5/s )bestimmen. Das ganze soll zunächst ein einfacher, mit 2 unabhängigen Rädern betriebener Roboter, der vielleicht einmal zum Segway aufsteht werden. Mir erscheint hier eine ISR am zuverlässigsten und auch am einfachsten. Trotzdem lese ich immer wieder Hinweise, dass ein Pollen der Lichtschranken unter Umständen günstiger ist. Ich kann das nicht nachvollziehen, weil ich dazu einen vergleichsweise teuren Algorithmus zur Flankenerkennung brauche im Gegensatz zu einem " n++" in einer ISR. Oder gibt es Aspekte, die ich möglicherweise noch nicht auf dem Schirm habe?

    Das Ding soll ja zwei Räder haben, dementsprechend brauche ich zwei Interrupts und 2 ISR. Was passiert eigentlich wenn die sich übernschneiden?
    schönen Feiertag noch.

  8. #8
    RN-Premium User Stammmitglied
    Registriert seit
    26.01.2005
    Ort
    Leipheim / Donau
    Beiträge
    53
    Tut mir leid, aber das ist nicht richtig
    Hallo Spectre,

    wusste ich nicht, ich hab mich am Datenblatt orientiert.
    sorry

    mfg ihle

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    05.01.2014
    Beiträge
    6
    Nachdem ich nun beide Pins mit einem Pulldown versehen habe scheint es zu funktionieren. Vorher hat schon das berühren des isolierten Kabels gereicht um den Eingang
    Richtung HIGH wandern zu lassen. Schon Krass was es alles neues zu lernen gibt, wenn man sich mal wieder in die Niederungen der Bits begibt. Ein stabiles 1/0 an einer Lichtschranke abzugreifen hat mich jetzt 2 Abende gekostet .
    Ich glaube Ihr werdet noch von mir hören bis bein Segway endlich mal aufsteht.

  10. #10
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    Zitat Zitat von demwz Beitrag anzeigen

    Das Ding soll ja zwei Räder haben, dementsprechend brauche ich zwei Interrupts und 2 ISR. Was passiert eigentlich wenn die sich übernschneiden?
    schönen Feiertag noch.
    Es ist nicht möglich das beide ISR gleichzeitig ausgelöst werden, eine ist immer um einen Takt schneller als die andere. Die ISR-Routine soll natürlich so kurz wie möglich gehalten werden um die nächste, die ja wartet, nicht unnötig zu verzögern.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Ähnliche Themen

  1. Pin-Zustand erkennen und schalten bei dauernd pin=1
    Von mat-sche im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 23.02.2010, 09:27
  2. Atmel 2560 -> Pin Changed Interrupts
    Von AVRbrauns im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 06.05.2008, 14:28
  3. PWM auf pin schalten
    Von molleonair im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 10.07.2007, 17:01
  4. Externe Interrupts an ATMega 32 auf RN-Control... *help*
    Von corone im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 15.04.2007, 19:14
  5. Pin change Interrupts bei Atmega 162
    Von jogijo im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 21.09.2004, 14:31

Berechtigungen

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