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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.