ICP auf ATMEGA8 wird nicht ausgelöst

OP #1691571
Lesenswert?

Hallo,
also was kann ich groß sagen, mein ICP wird nicht ausgelöst! Das Signal 
am ICP- Pin kommt ganz sicher an, es wird mit einem Funktionsgenerator 
(700Hz, Rechteck, 5V, 2.5V Offset) erzeugt.

Hier ist die Konfiguration des ICPs:
1
    TCCR1B = (1<<ICES1);    // Input Capture bei rising edge
2
    TIMSK = (1<<TICIE1);    // Interrupts für Input Capture erlauben
3
    TIMSK = ~(1<<TOIE1);    // Interrupts für Timer1 deaktivieren da µC sonst immer aufwachen würde
4
      PORTC = (1<<PC4);     // Abschaltsignal
5
    lcd_clrscr();
6
    lcd_puts("Abschalt");
7
    set_sleep_mode(SLEEP_MODE_IDLE);
8
    sleep_mode();

Hab ich etwas übersehen?
Im Anhang könnt ihr auch mein gesamtes Programm finden, wird aber nicht 
nötig sein, dass durch zu sehen da ich bis zu diesem besagtem
1
lcd_puts("Abschalt");
 komme. Danach geht der µC schlafen wird aber nicht mehr aufgeweckt :(. 
Was meint ihr?
Angehängte Dateien:
#1691619
Lesenswert?

Hallo,

du gehs't in der ISR in den Sleep, nach Rückkehr aus dem Sleep 
schaltetst du den ICP-Int mit
>TIMSK = (1<<TOIE1);
aus, das Flag für den ICP im TIFR sollte ja zu diesem Zeitpunkt gesetzt 
gewesen sein, evl. wird das Flag aber durch das löschen zurückgesetzt - 
das Datenblatt sagt dazu leider nicht's.

Sascha
#1691737
Lesenswert?

ja aber mit der direkten Zuweisung "TIMSK = (1<<TOIE1)" werden alle Bits 
außer TOIE1 gelöscht.
Also TIMSK |= (1<<TOIE1) , um den TOIE1 zusätzlich einzuschalten.

da sehe ich gerade oben in deinem Codeschnipsel den selben Fehler:
    TIMSK = (1<<TICIE1);    // Interrupts für Input Capture erlauben
    TIMSK = ~(1<<TOIE1);    // Interrupts für Timer1 deaktivieren da µC

das 2. kannst du dir sparen, da der erste Befehl schon alle anderen 
löscht
und das 2. setzt alle Bits außer TOIE1, denn
TIMSK &= ~(1<<TOIE1) wäre richtig um ein Bit zu löschen!


Sascha
OP #1692269
Lesenswert?

1
    TCCR1B |= (1<<ICES1);    // Input Capture bei rising edge
2
    TIMSK |= (1<<TICIE1);    // Interrupts für Input Capture erlauben
3
    TIMSK &= ~(1<<TOIE1);    // Interrupts für Timer1 deaktivieren da µC sonst immer aufwachen würde
4
      PORTC |= (1<<PC4);     // Abschaltsignal
5
    lcd_clrscr();
6
    lcd_puts("Abschalt");    // Testausgabe
7
    set_sleep_mode(SLEEP_MODE_IDLE);
8
    sleep_mode();

Schaut jetzt so aus, leider keine Veränderung.

:(

Kann mir noch jemand helfen?

MFG Julian
#1692403
Lesenswert?

So viel (z.B. LCD-Ausgaben) im Interrupt zu machen ist schon ein 
bisschen ungesund.  Überleg Dir mal, ob das nicht besser geht.

Zu Deinem Problem: das ist klar.  Da Du den sleep im Interrupt machst, 
sind die global gesperrt.  Dann wacht nix mehr auf, es kommt ja kein 
Interrupt durch.  Die unsaubere Methode wäre ein sei(), die saubere ein 
Umstellen der ganzen Logik.  Dieser Teil mit LCD und Sleep hat im 
Interrupt nichts zu suchen.

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