- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 36

Thema: Problem mit Timerablauf/neu ICP1 funktioniert nur einmal

  1. #21
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Anzeige

    Praxistest und DIY Projekte
    ja klar, lt. DAtenblatt muss ich das ICF-flag und das TOV-flag löschen, BEVOR ich den interrupt einschalte ... wennn ich aber nun

    TIFR |= (1<<TOV0);

    schreibe und DABEI das ICF1-flag auch gesetzt ist, schreibe ich die aus dem register entnommene 1 bei ICF1 auch wider als 1 zurück und lösche damit dieses flag (bisher) unwissentlich ... wenn ich aber einfach alles 0 lasse und nur dem flag ne 1 geb das ich auch löschen will, also:

    TIFR = (1<<TOV);

    dann löäsche ich auch nur exakt dieses bit und die anderen bleiben durch die 0 unberührt

  2. #22
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    TIFR = (1<<TOV0); bedeutet, dass du das Bit an der Stelle TOV0 auf 1 setzt. Sagen wir mal TOV0 ist 0, dann steht in TIRF nach der Operation eine 1 egal ob da vorher 518 oder 3 drin stand. Das ist eine Zuweisung des Wertes (1<<TOV0).
    Durch das bitweise ODER setzt du ja gerade nur das Bit welches du ändern willst und die anderen bleiben unberührt.

    sast

    雅思特史特芬
    开发及研究

  3. #23
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    nein eben nicht, das TIFR ist ein flag-register, das schreiben einer 1 an eine position löscht das bit, das schreiben einer 0 lässt das bit so wie es ist! also 0 ODER 1 es ist bei den flags genau umgekehrt, und deshalb bin ich gestolpert!

  4. #24
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    Vielleicht hab ich mich mal wieder etwas unverständlich ausgedrückt im letzten post. Mit TOV0 ist 0 meinte ich, dass es ein #define TOV0 0 gibt, um die Bitposition im Byte anzugeben. Im Grunde ist egal ob 0 oder 1 nun ein Bit löscht. Mir ging es darum, dir klarzumachen, dass du bei X = (1<<0); X eine 1 zuweist, auch wenn vorher X == 122 war. Mit X |= (1<<0); wird da aber 123 draus. Hoffe das war jetzt verständlicher.

    sast

    雅思特史特芬
    开发及研究

  5. #25
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    ich hab dich vollständig verstanden und dennoch wird wenn vorher im flag register vorher eine 122 steht und ich

    register |= (1<<0) ;

    schreibe, danach im register 0 stehen!

    denn GENAU WEIL das setzen des bit es nach der operation löst einfach alles zu 0 wird

    ich schreibs mal bitweise auf

    10010010 // register =
    10010010 | // register |
    00000001 | // (1<<0)
    =
    00000000 // denn das setzen einer 1 löscht das bit, das setzen einer 0 lässt es unverändert

    im konkreten beispiel ist TOV0 UND ICF1 gesetzt

    TIFR also xx1xxxx1

    wenn cih jetzt

    xx1xxxx1 |= 00000001

    also

    xx1xxxx1 |
    xx1xxxx1 |
    00000001

    rechne kommt

    TIFR = 00000000

    raus, denn wenn x bereits 1 ist im flagregister, löscht es sich durch das ver-odern selbst aus, wenn x aber 0 ist blleibt es eben unbverändert 0

  6. #26
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Also Ceos, was du da schreibst ist unfug.

    In einer Oder-Verknüpfung wird nie auf 0 gestellt wenn es nicht schon 0 ist.
    0 | 0 = 0
    1 | 0 = 1
    0 | 1 = 1
    1 | 1 = 1

    register |=(1<<0) setzt bit0 auf 1
    register &= ~(1<<0) setzt bit0 auf 0
    und zwar wird immer nur bit0 verändert, die anderen bleiben unverändert.

    Siehe auch hier: http://www.mikrocontroller.net/artic...f_auf_Register
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #27
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    Du siehst mich ratlos.

    Bis heute war ich der irrtümlichen Meinung, dass
    1|1=1
    1|0=1
    0|1=1 und
    0|0=0 sind.

    Aber vielleicht ist das ja bei Registern anders

    sast

    Edit: Wie ich sehe gibt es auch noch andere die nach der alten Schule gelernt haben

    雅思特史特芬
    开发及研究

  8. #28
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    Was ist der Unterschied zwischen dem was Hubert geschrieben hat und was sast geschrieben hat? Das ist doch das gleiche.
    Das hat Hubert geschrieben
    0 | 0 = 0
    1 | 0 = 1
    0 | 1 = 1
    1 | 1 = 1
    Das hat sast geschrieben

    1|1=1
    1|0=1
    0|1=1 und
    0|0=0 sind.

  9. #29
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    54
    Beiträge
    502
    @021...
    Sorry, dass ich vor dem Verschicken meiner Nachricht nicht nachgesehen hatte, ob es schon eine Antwort nach Ceos's Post gab

    das ist natürlich das Gleiche

    sast

    雅思特史特芬
    开发及研究

  10. #30
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    40
    Beiträge
    3.416
    Öhm ich glaub ihr überseht den zusammenhang!!!!1111einseinself

    ich rede von dem TIFR das Timer Interrupt Flag Register

    jedesmal wenn es uum GENAU dieses Register geht, steht AUSDRÜCKLICH

    4. Some of the Status Flags are cleared by writing a logical one to them. Note that the CBI and SBI instructions will operate on
    all bits in the I/O Register,writing a one back into any flag read as set, thus clearing the flag. The CBI and SBI instructions
    work with registers $00 to $1F only.
    zu lesen auf Seite 327 im M32 Datenblatt ziemlich weit oben direkt unter der Tabelle

    sast hat den kontext scheinbar nicht mitbekommen oder diesen fakt üübersehen und ich geh mal davon aus, dass hubert sich hat nur mitreissen lassen und auch den kontext übersehen hat


    da jetzt der zusammenhang hergestellt ist, sag ihc es nocheinmal:

    mein problem war, wenn ich das Overflow Flag mit |= gelöscht habe, wurde auch das Input Capture Flag MITGELÖSCHT ... erst als ich im debugging gemerkt habe, wie bei TIFR |= (1<<TOV0) auch das ICF1 ausging, kam mir die erleuchtung!

    darum schreibe ich es nochmal für später suchende die hier mal landen, wenn man ein flag löschen will, niemals SBI(), CBI(), |= oder &= verwenden, sondern ganz einfach NUR dieses bit auf 1 setzen mit

    register = (1<<das_bit);

Seite 3 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

12V Akku bauen