mikrocontroller.net

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


Autor: Nn Nn (jaytharevo)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
    TCCR1B = (1<<ICES1);    // Input Capture bei rising edge
    TIMSK = (1<<TICIE1);    // Interrupts für Input Capture erlauben
    TIMSK = ~(1<<TOIE1);    // Interrupts für Timer1 deaktivieren da µC sonst immer aufwachen würde
      PORTC = (1<<PC4);     // Abschaltsignal
    lcd_clrscr();
    lcd_puts("Abschalt");
    set_sleep_mode(SLEEP_MODE_IDLE);
    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
lcd_puts("Abschalt");
 komme. Danach geht der µC schlafen wird aber nicht mehr aufgeweckt :(. 
Was meint ihr?

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Wird versucht, kann leider erst morgen Vormittag wieder 
probieren!

MFG Julian

Autor: Nn Nn (jaytharevo)
Datum:

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

Schaut jetzt so aus, leider keine Veränderung.

:(

Kann mir noch jemand helfen?

MFG Julian

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich arbeite gerade an einer sauberen State Machine.

Aber werde das mal probieren, danke!!!

MFG Julian

Autor: Nn Nn (jaytharevo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wars! Danke :) :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.