- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 9 von 9

Thema: Atmega32: Frequenzabhängiges Problem mit INT0 und Timer0

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich lösche das Timer0 Overflow Flag manuell
    Nur leider auch gleich alle anderen gesetzten Flags in dem Register mit. Überlege mal, was |= genau macht.


    Es ist zu erkennen, dass der Interrupt schneller verarbeitet wird als bei Möglichkeit 1 (ca. 200ns schneller).
    Ich hoffe mal, du meinst mit "Interrupt schneller verarbeitet wird" nicht so was wie "Interrupt reagiert schneller". Wenn du den Pin am Ende der ISR auf High setzt, dann hast du mit unterschiedlich langen ISRs natürlich unterschiedliche Ergebnisse. Setze den Pin am Anfang der ISR, dann hast du auch diesen Unterschied nicht.
    MfG
    Stefan

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2008
    Beiträge
    8
    Hi Stefan,

    danke für Deine Antwort. Genau, meine Messungen sollten nur zeigen, welche ISR schneller abgearbeitet wird. Ich kenne mich nicht aus, welche Instruktion länger zum Verarbeiten benötigt, deshalb habe ich das rein interessehalber gemessen. Auf die Reaktionszeit der ISR sollte das natürlich keinen Einfluss haben (deshalb setzte ich PA1 am Ende der Routine).
    Ich verstehe leider nicht, was Du mit Deinem ersten Satz meinst. Ich denke Du zielst auf die Zeile in meinem Code ab:
    TIFR |= (1<<TOV0); //clear Timer 0 Overflow flag by writing one to the register!
    Hier setzte ich nur das Bit #0 (aka TOV0) auf Eins, der Rest des Registers bleibt unverändert. Oder habe ich da was grundlegend falsch verstanden?
    Zum Löschen des Flags muss man laut Datenblatt eine eins schreiben, deswegen die ODER Verknüpfung. Was mache ich dort also Deiner Meinung nach falsch?

    Viele Grüße,

    Christian

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Kokomoking Beitrag anzeigen
    Hier setzte ich nur das Bit #0 (aka TOV0) auf Eins, der Rest des Registers bleibt unverändert.
    Das gilt für ein normales Register, aber bei einem Register voller Interrupt-Flags gilt das "der Rest des Registers bleibt unverändert" eben nicht. Nochmal: was macht die Zeile genau. Nehmen wir an, Bit 0 und 1 sind gesetzt, was passiert dann bei der Zeile Schritt für Schritt?
    MfG
    Stefan

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2008
    Beiträge
    8
    Warum wird das bei einem "Interrupt-Register" unterschiedlich gehandhabt? Hast Du eine Referenz im Datenblatt, wo ich das nachlesen könnte?

    Meiner Meinung passiert folgendes: Wir nehmen an, dass in dem Register BIT0 = 0 und BIT1 = 1 bereits gesetzt sind, nun kommt die besagte Codezeile. (1<<TOV1) erzeugt eine Bitmaske, in der nur BIT0 1 ist. Nun wird dieses Byte mit dem Register ODER verknüpft und BIT0 des Register (=0) ODER 1 = 1, dass Bit0 wird also gesetzt. BIT1 des Registers (=1) wird mit 0 ODER verknüpft und bleibt gesetzt. Wäre es ursprünglich Null gewesen, wäre es jetzt immer noch null. Das ist zumindest mein Verständnis, wie man einzelne Bits in C setzen kann, ohne andere Bits zu beeinflussen. Zum Löschen eines einzelnen Bits wird man analog invertieren (die Bitmaske) und UND verknüpfen.

    Bitte erklär mir den Unterschied bei Interrupt Flag Registern.

    Cheers,

    Christian

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2008
    Beiträge
    8
    Ok, ich les da grad was auf AVR freaks und in der AVRlibc Hilfe. Das REgister wird bei ner ODER Verknüpfung erst gelesen, dann verglichen, und dann wieder geschrieben. Damit werden dan BIT0 und BIT1 gesetzt. Das ist natürlich Schmarrn...JEtzt muss ich nur noch rausfinden, was TIFR = _BV(TOV0) übersetzt heißt...

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    12.02.2008
    Beiträge
    8
    Ok, TIFR = _BV(TOV0) heißt wohl einfach soviel wie TIFR = (1<<TOV0). Ich probier das gleich mal aus. Scheint ein häufiger Fehler zu sein, in manchen Tutorials ist es auch falsch drin (also mittels ODER Verknüpfung)...

    Tausend Dank für den Hinweis Stefan!

    Cheers,

    Christian

Ähnliche Themen

  1. PWM-Messung mit ATTiny15 - INT0 TIMER0
    Von Ulfens im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 30.04.2009, 14:37
  2. Timer0 beim Atmega32 will nicht
    Von WarChild im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 10
    Letzter Beitrag: 24.03.2009, 21:46
  3. Timer0 des ATmega32 tickt zu langsam
    Von Djon im Forum C - Programmierung (GCC u.a.)
    Antworten: 7
    Letzter Beitrag: 11.09.2008, 16:27
  4. counter mit timer0 an atmega32
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 30.08.2008, 16:08
  5. Problem mit int0 beim ATMEGA32... (kein Rising möglich?)
    Von boeseTURBO-CT im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 24.05.2004, 20:46

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress