Rising / Falling Edge INT0

OP #2396428
Lesenswert?
• ▲
▼
Hallo Zusammen,

ich habe mir eine kleine Schaltung gebaut welche beim INT0 einen 
Fototransistor hat, welcher 3V bei Lichteinfall auf ca. 10mV zieht. 
Daher von High auf Low.
1
EIMSK |= (1 << INT0);  // Interupt auf INT0 freigeben
2
EICRA = 0b00000000; //The low level of INT0 generates an interrupt request
das klappt, also wenn ich mit Licht einfällt, dann schaltet mir der uC 
an.

Jetzt möchte ich das ganze aber umkehren, sobald das Licht unter einen 
gewissen Level fällt, dann soll mir der uC anschalten also anstatt Low 
level oder falling edge halt rising edge.

Licht = 10mV an INT0 bei Lichtwegfall 3V an INT0
1
EICRA = 0b00000011; //The rising edge of INT0 generates an interrupt request

Mit rising edge passiert aber nichts ??!!??  Habe auch schon den interne 
Pull up abgeschalten da bereits einen externen dranhängt.

Hat jemand eine Idee?

Gruss Alain
Gast #2396499
Lesenswert?
• ▲
▼
>EICRA = 0b00000000; //The low level of INT0 generates an interrupt request

Low level Interrupt löst dauernd Interrupts aus solange der
Pin Low ist.

>EICRA = 0b00000011; //The rising edge of INT0 generates an interrupt request

Erzeugt einen einzigen Interrupt bei steigender Flanke.
Mehr nicht.
OP #2396532
Lesenswert?
• ▲
▼
ich kann auch ein falling edge nehmen, dann geht es auch.
Einfach rising edge klappt nicht. Mir würde ja ein Interrupt reichen.
Also wenn ich dann wieder auf Low gehe und wieder auf High dann gäbe es 
ja wieder einen oder?
1
// ---------------- Anschalten (Aufstarten) ------------------
2
if ( (!(PIND & Taster_INT0 ) & (On == 0)) ) {
3
Jump_ON:; //Jump_DIM Marker 
4
sleep_disable();
5
Sleep_c = 0;
6

7
EIMSK &= ~(1 << INT0);
8
ADMUX = 0b11000000;    // Internal Reference Enabled    
9

10
ADCSRA = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0;    
11

12
TCCR1A = (1<<WGM11)|(1<<WGM10)|(1<<COM1A1) ; 
13
TCCR1B = (1<<CS11);             
14

15

16
On = 1;
17
PORTB|=Enable;
18
_delay_ms(150);
19

20
}
21

22
// ---------------- Ausschalten (Sleepmodus) ------------------
23

24
shut_down_timer = shut_down_timer++;
25
_delay_ms(1);
26

27
//while ( !(PIND & Taster_INT0 ) & (On == 1) | shut_down_timer > 1000 ) {
28
while ( shut_down_timer > 1000 ) {
29
shut_down_timer = 0;
30
Sleep_c = 1;
31

32
}
33

34
if (Sleep_c == 1) {
35
Off2:;
36
EIMSK |= (1 << INT0);  // Interupt auf INT0 freigeben
37
//PCMSK0 |= (1 << PCINT0);
38
Off:; //OFF Marker
39

40
On = 0;
41
PORTB&=~Enable;
42

43

44
ADMUX = 0b00000000;    // Internal Reference Disabled
45
ADCSRA = ~(1<<ADEN); //ADC Disable = Stromsparen 0.3mA
46
TCCR1A = ~(1<<COM1A1); // Disable PWM
47
//wdt_disable(); // Watchdog ausaschalten
48

49

50
_delay_ms(150);
51

52
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
53

54
sleep_mode();
55

56
}
#2396595
Lesenswert?
• ▲
▼
Falls es um AVR geht: Beim Power-down Sleep Mode wird auch der Takt 
abgeschaltet, und dann funktioniert nur noch der Low Level Interrupt.

(0 0 The low level of INT1 generates an interrupt request.)

Datenblatt:
Low level interrupts on INT0/INT1 are detected
asynchronously. This implies that these interrupts can be used for 
waking the part also from sleep modes other than Idle mode.

Den kannst Du in der INT0-Interruptroutine direkt nach dem Aufwachen 
wieder abschalten, bevor es nach dem Sleep Befehl weitergeht, um zu 
verhindern, dass er mehrfach ausgelöst wird.


herrmueller

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.