Forum: Mikrocontroller und Digitale Elektronik INT0 INT1 Interrupt Atmega328p Verständnisproblem


von Florian (Gast)


Lesenswert?

Hallo,
ich möchte auf einen Atmega328 INT0 und INT1 die Interrupts 
initialisieren, allerdings verzweifle ich gerade daran, wann die 
Interrupts ausgelöst werden sollen. Ich möchte für INT1 bei einer 
fallenden Flanke und für INT0 bei jedem Flankenwechsel auslösen. Jetzt 
gibt es für diese beiden aber nur das Register EICRA.
Wenn ich jetzt für den INT1 schreibe
EICRA |= (1 << ISC10)
und für den INT0 möchte ich dann
EICRA |= (1 << ISC01)

Woher weiss der controller dann, dass INT1 nicht bei einer steigenden 
Flanke auslösen soll (ISC01 -> Any logical change on INT1 generates an 
interrupt request)

Florian

von Raphael (Gast)


Lesenswert?

Hi Leute,
ich habe mir hieran bereits ein Zahn aus gebissen und komm trotzdem 
nicht weiter.
Der Pin A1 eines Arduino UNO, an welchen eine Lichtschranke 
angeschlossen wurde, soll ausgelesen werden. Das klappt schon einmal.

Anschließend soll sobald ein HIGH Signal des Sensors vorliegt ein Servo 
die Positionen 30° und 90° EINMAL anfahren, und anschließend soll 
gewartet werden bis der Sensor wieder LOW ist.
Nachdem der Sensor erneut HIGH ist, soll der Servo die Positionen wieder 
nur EINMAL anfahren u.s.w.


Das Problem ist das mein Servo die Positionen während einer HIGH Periode 
100 mal anfährt.

Bitte helft mir. Ich bin am verzweifeln

Hier der Code:

___________________________________________

#include <Servo.h>
Servo servo1;

void setup() {
  servo1.attach(9);
}

void loop() {
  int sensorValue = analogRead(A1);

       if (A1==HIGH){
        servo1.write(30);
        delay (10);
        servo1.write(90);
        delay (10);
}
}

von Karl M. (Gast)


Lesenswert?

Hallo,

hier schreiben augenscheinlich zwei Personen, da wird schwierig.

Im Datenblatt zum atmega328p gibt es einen Abschnitt zu den Interrupts 
und dort findet man auch alle "beteiligten" Register für INTx.
Was findest Du dort ?

von HildeK (Gast)


Lesenswert?

Wo ist das Problem? Du hast für jeden IRQ vier Einstellungen zu Auswahl, 
mit ISCx0 und ISCx1. Je eine davon legt die steigende, die fallende, 
beide oder LOW Level fest.

von Florian (Gast)


Lesenswert?

Entweder ich habe gerade ein Brett vorm kopf oder ich weiss auch nciht.
Das Register EICRA (für INT0 und INT1) hat die Bits
ISC00
ISC01
ISC10
ISC11

Für INT1
00 The low level of INT1 generates an interrupt request.
01 Any logical change on INT1 generates an interrupt request.
10 The falling edge of INT1 generates an interrupt request.
11 The rising edge of INT1 generates an interrupt request.

Für INT0
00 The low level of INT0 generates an interrupt request.
01 Any logical change on INT0 generates an interrupt request.
10 The falling edge of INT0 generates an interrupt request.
11 The rising edge of INT0 generates an interrupt request.

Bits 3:2 – ISC1n: Interrupt Sense Control 1 [n = 1:0]
Bits 1:0 – ISC0n: Interrupt Sense Control 0 [n = 1:0]

Aber wie kann ich dann z.B  INT1 beim low LEvel einen Interrupt 
auslösen.
EICRA |= (1 << ISC00 )
Dann würde es doch auch für INT0 gelten oder nicht?

von Florian (Gast)


Lesenswert?

Bzw. wie schreibe ich, dass der INterrupt für INT1 beim LowLevel 
ausgelöst werden soll?

von S. Landolt (Gast)


Lesenswert?

ISC01 und ISC00 definieren das Verhalten von INT0, ISC11 und ISC10 das 
von INT1.

von S. Landolt (Gast)


Lesenswert?

Für die eingangs gegebene Anforderung wäre das also:
EICRA = (1<<ISC11) | (1<<ISC00)

Den nachgereichten low-level können Sie jetzt selbst lösen.

von Florian (Gast)


Lesenswert?

AHHHH, ich hatte wirklich ein fetten balken vorm Kopp.
Natürlich. Ich weiss gar nicht, wieso ich son Denkfehler hatte.

danke euch trotzdem

von Theor (Gast)


Lesenswert?

Florian schrieb:
> Entweder ich habe gerade ein Brett vorm kopf oder ich weiss auch nciht.

Hm. Ich würde das so formulieren, dass Du nicht genau liest oder nicht 
präzise schlussfolgerst, aus dem, was Du gelesen hast. Vermutlich eher 
Flüchtigkeitsfehler.

> Aber wie kann ich dann z.B  INT1 beim low LEvel einen Interrupt
> auslösen.
> EICRA |= (1 << ISC00 )


Moment mal. Du willst damit einen Interrupt auslösen oder den 
Interrupt konfigurieren ? Auslösen kannst Du einen Interrupt (naja, in 
erster Näherung jedenfalls) so nicht.

OK. Nehmen wir mal an, Du willst konfigurieren.

Du schreibst Du willst mit dem Ausdruck INT1 (EINS) konfigurieren. Aber 
Du befeinlusst mit dem Ausdruck die Bits für den Interrupt 0!

ISC00 und ISC01 sind für den Interrupt 0
ISC10 und ISC11 sind für den Interrupt 1

Das steht ja auch so in dem von Dir selbst zitierten Text:

> Bits 3:2 – ISC1n: Interrupt Sense Control 1 [n = 1:0]
> Bits 1:0 – ISC0n: Interrupt Sense Control 0 [n = 1:0]

Wie kommst Du auf die folgende Frage?

> Dann würde es doch auch für INT0 gelten oder nicht?

Was lässt Dich annehmen, dass die Konfigurationen eben NICHT unabhängig 
für INT0 und INT1 möglich sind?

(Da der Tonfall hier fehlt: Ich stelle die Frage ganz sachlich. Du 
erkennst da eben was nicht. Das ist kein Problem und ich mach mich nicht 
lustig oder so. Einfach nur ne Frage).

von Theor (Gast)


Lesenswert?

Florian schrieb:
> AHHHH, ich hatte wirklich ein fetten balken vorm Kopp.
> Natürlich. Ich weiss gar nicht, wieso ich son Denkfehler hatte.
>
> danke euch trotzdem

OK. Da hat sich mein Beitrag dann überschnitten. Problem wohl gelöst. 
Super.

Obwohl ... es hätte mich schon interessiert, wie Du auf den Gedanken 
gekommen bist. Einfach weil mich immer auch die Fehler interessieren und 
wie sie entstehen.

von Florian (Gast)


Lesenswert?

Theor schrieb:
> Moment mal. Du willst damit einen Interrupt auslösen oder den
> Interrupt konfigurieren

Ich meinte natürlich Konfigurieren.

Mein Denkfehler war, dass wenn ich z.B. ISC11 gesetzt habe, war in 
meinem Kopf es so, dass nicht das Bit ISC11 gesetzt worden ist, sondern 
die Konfiguration 11 -> The rising edge of INT0/INT1

Beitrag #5165820 wurde von einem Moderator gelöscht.
Beitrag #5165821 wurde von einem Moderator gelöscht.
von Karl M. (Gast)


Lesenswert?

Florian,

etwas fehlt aber immer noch - die Interruptvektoren werde "nur so", 
nicht angesprungen.

von Theor (Gast)


Lesenswert?

Florian schrieb:
> Theor schrieb:
>> Moment mal. Du willst damit einen Interrupt auslösen oder den
>> Interrupt konfigurieren
>
> Ich meinte natürlich Konfigurieren.
>
> Mein Denkfehler war, dass wenn ich z.B. ISC11 gesetzt habe, war in
> meinem Kopf es so, dass nicht das Bit ISC11 gesetzt worden ist, sondern
> die Konfiguration 11 -> The rising edge of INT0/INT1

Ah. Verstehe. Danke für die Info.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.