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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Florian (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


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

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht lesenswert
ISC01 und ISC00 definieren das Verhalten von INT0, ISC11 und ISC10 das 
von INT1.

von S. Landolt (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Florian,

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

von Theor (Gast)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.