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?
Bzw. wie schreibe ich, dass der INterrupt für INT1 beim LowLevel ausgelöst werden soll?
ISC01 und ISC00 definieren das Verhalten von INT0, ISC11 und ISC10 das von INT1.
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.
AHHHH, ich hatte wirklich ein fetten balken vorm Kopp. Natürlich. Ich weiss gar nicht, wieso ich son Denkfehler hatte. danke euch trotzdem
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
Beitrag #5165820 wurde von einem Moderator gelöscht.
Beitrag #5165821 wurde von einem Moderator gelöscht.
Florian, etwas fehlt aber immer noch - die Interruptvektoren werde "nur so", nicht angesprungen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.