Forum: Mikrocontroller und Digitale Elektronik ICP auf ATMEGA8 wird nicht ausgelöst


von Nn N. (jaytharevo)


Angehängte Dateien:

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?

von Sascha W. (sascha-w)


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

von Nn N. (jaytharevo)


Lesenswert?

Warum schalt ich den Interrupt für den ICP aus? Der ist doch nur für den 
Timer, oder wirkt dieses Flag für beide?

von Sascha W. (sascha-w)


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

von Nn N. (jaytharevo)


Lesenswert?

Danke! Wird versucht, kann leider erst morgen Vormittag wieder 
probieren!

MFG Julian

von Nn N. (jaytharevo)


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

von Wolfgang Horn (Gast)


Lesenswert?

Julian Schild schrieb:
> :(
>
> Kann mir noch jemand helfen?

Hi, Julian,

enthält "sleep_mode()" auch die volle Sequenz von "sleep enable" und 
"sleep"?


Ciao
Wolfgang Horn

von Nn N. (jaytharevo)


Lesenswert?

Was meinst du damit?

Im Idle Modus werden nur CPU und Flash Takt beendet, alle anderen laufen 
weiter.

Die anderen Schlaf- und Weckrufe im Programm funktionieren ja.

von Hc Z. (mizch)


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.

von Nn N. (jaytharevo)


Lesenswert?

Ich arbeite gerade an einer sauberen State Machine.

Aber werde das mal probieren, danke!!!

MFG Julian

von Nn N. (jaytharevo)


Lesenswert?

Das wars! 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.