Forum: Mikrocontroller und Digitale Elektronik Rising / Falling Edge INT0


von Alain F. (fox82)


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

von holger (Gast)


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.

von Alain F. (fox82)


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
}

von Herr M. (herrmueller)


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

von Alain F. (fox82)


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

Ja genau das ist das Problem. Die Frage ist halt jetzt wie ich das 
invertieren kann. Eventuell via Transistor?

von Alain F. (fox82)


Lesenswert?

So also ganz einfach, ich habe jetzt den Fototransistor mit dem 
Pull-UP-Widerstand getauscht. Jetzt klappt es so wie es sollte. Das 
ganze mit falling edge und alles ist OK :-) Danke!

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
Noch kein Account? Hier anmelden.