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
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);
}
}
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 ?
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.
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?
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).
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.
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
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.