ATTiny 85 Interrupt unterbrechungen

Gast #1203502
Hallo,

vielleicht kann mir einer von euch mit meinem Problem weiterhelfen.

Kurz zum Aufbau meiner Schaltung.

Der uC soll en PB0 eine PWM eines RC-Empfängers auswerten. Dazu wird ein 
Interrupt bei PB0=high ausgelöst. Dieser startet den Counter0. Ist 
PB0=low
wird der Counter gestoppt und das Register ausgewertet.

Das Programm läuft soweit durch. Jedoch wird der Ausgang 
zwischenzeizlich auf low gesetzt, obwohl dieses nicht sein dürfte.

Was mache ich da falsch?
Es scheint egal zu sein, ob ich den Timer starte und stopppe oder 
einfach das Register auf Null setze, wenn der Interrupt ausgelöst wird.

Ich habe erst an den Stack gedacht, aber das Programm sollte diesen 
nicht überfordern.

Gruß
Carsten
Angehängte Dateien:
#1203567
Du verwendest PB2 statt PB0!

Das hier hält definitiv keinen Timer an :-)
TCCR0B |= (0<<CS00) | (0<<CS01) | (0<<CS02);

Außerdem sollte der Timer beim initialisieren noch nicht gestartet 
werden, sondern erst bei der ersten flanke.

Ob der Rest deines Progs so stimmt, weiß ich nicht, vorallem die 
Timereinstellung, Auflösung etc.

Ich hätt es wahrscheinlich anders gelöst:
INT0 als "on change" verwenden.
je nach Zustand von PB2 Timer starten oder {stopen, auslesen, 
rücksetzen}.
Den gemessenen Timerwert einfach in ne globale volatile Variable stecken 
und gemütlich in der Main auswerten. Eventuell noch eine 
Plausibilitätsprüfung (zu kurze Pulse sind ungültig oder so).
Wenn dus paranoid Wasserdicht machen willst musst du noch Funktionen 
gegen eine Interruptüberlast einbauen. (z.B. Taubschalten des Interrupts 
für eine Gewisse zeit nach der letzten fallenden Flanke). Wenn du 
nämlich durch irgend einen dämlichen Zufall 10k Pulse pro Sekunde auf 
deiner Int-Leitung hast, kommt deine Main nicht mehr dran!

Außerdem nimm statt "int" "uint8_t", dann hast du auch keine Probs mit 
"atomar". Dein Timer ist eh nur 8 Bit breit.
Gast #1203597
Hallo,

danke für die schnellen Antworten.

Laut Datenblatt soll der Timer mit
"TCCR0B |= (0<<CS00) | (0<<CS01) | (0<<CS02)" gestoppt werden.
zb.
TCCR0B |= (1<<CS00) | (0<<CS01) | (0<<CS02) startet den Timer sofort.

Ich werde das mit "uint8_t" mal testen.

Des weiteren bin ich der Meinung das der Counter0 doch ein 8-bit Timer 
ist.
Zumindest habe ich das Datenblatt so verstanden.

Gruß
Carsten
#1203606
Hallo,

Du hast zwar das Datenblatt verstanden, die Bitmanipulation in C aber 
nicht...

Eine 0 konnst Du hinschieben wie Du willst, es bleibt 0.
Ein Register mit 0 ver-odert ändert sich also garnicht.

TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02));

passt da eher.

Gruß aus Berlin
Michael

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.