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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren