PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupts auf Pin 2 und 3



demwz
05.01.2014, 20:53
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
}

ihle
05.01.2014, 21:40
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

demwz
05.01.2014, 22:24
Hallo,
erst mal danke. Arduino UNO atmega328, denke ich.

ihle
06.01.2014, 07:05
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

Besserwessi
06.01.2014, 08:39
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.

Spectre
06.01.2014, 09:41
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.

demwz
06.01.2014, 09:53
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.

ihle
06.01.2014, 09:54
Tut mir leid, aber das ist nicht richtig

Hallo Spectre,

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

mfg ihle

demwz
06.01.2014, 10:02
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.

Hubert.G
06.01.2014, 11:44
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.