- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 11

Thema: Int0 gibt 2 Impulse?!

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Das macht zwar am hier gezeigten Beispiel keine Probleme, aber ansonsten führt GIFR.INTF0 = 1 dazu, dass intern das Register gelesen, das Bit gesetzt und somit mit dem Originalregisterinhalt ver-odert und zurückgeschrieben wird.
    Dies führt bei einem Flag-Register zum Löschen aller anderen gesetzten Flags, bei mehreren Interrupt-Ereignissen will man das natürlich nicht.
    Das wäre ja eine üble Falle. Zumindest in der Bascom Version 2.0.5.0 sieht es nicht so aus. Hab dazu ein kleines Programm gemacht, compiliert und die hex-Datei mit ReAVR disassemblieren lassen. Relevante ASM Befehle unten im Code.
    Weder bei Gifr.intf0 = 1, Gifr = Bits(intf0) oder Set Gifr.intf0 wird Gifr geladen.

    Gifr = Gifr Or &B01000000 muß man aber vermeiden

    Code:
    '###############################################################################
    'IDE: BASCOM-AVR Demoversion 2.0.5.0
    '###############################################################################
    $regfile = "attiny45.dat"
    $framesize = 32                         'default?
    $swstack = 32                           'default?
    $hwstack = 34                           'default?
    $crystal = 8000000
    
    !nop                                  'nop zum code auffinden in ASM
    Gifr.intf0 = 1
    !nop
    Gifr = Bits(intf0)
    !nop
    Set Gifr.intf0
    !nop
    Gifr = Gifr Or &B01000000
    !nop
    
    End
    
    
    
    ASM von ReAVR V3.2.0
    
        nop                            'Gifr.intf0 = 1
        ldi    r24,k40
        out    p3A,r24              '3A ist Adresse von GIFR im ATtiny45
        nop                            'Gifr = Bits(intf0)     
        ldi    r24,k40           
        out    p3A,r24
        nop                            'Set Gifr.intf0     
        ldi    r24,k40
        out    p3A,r24
        nop                            'Gifr = Gifr Or &B01000000
        in    r24,p3A
        ori    r24,k40
        out    p3A,r24
        nop

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Searcher
    Zitat Zitat von Searcher Beitrag anzeigen
    Das wäre ja eine üble Falle.
    das war eine Falle, die zumindest für Flag-Register im normalen IO-Bereich beseitigt wurde.

    Um das wieder rauszukramen musste ich weiter zurückgehen als ich annahm. Ver 1.11.9.8 zeigt den Fehler noch, Ver 2.0.0.0 dagegen nicht mehr.
    Gemeldet hab' ich den Bug an Mark im Feb 2010, in der von mir damals moderierten Rubrik steht's zum 21.2.2010, Ver 1.11.9.8, das könnte so passen.

    Wie ich gerad' festgestellt hab', gibt's das Problem aber immer noch, sobald auf Ext IO zugegriffen wird.

    Bei der von Dir verwendeten Version 2.0.5.0 ist das noch so, genauso in 2.0.7.3
    Compilier' doch mal für 'nen ATM128 das hier: ETIFR.OCIE1C = 1, da kommt dann raus:
    Code:
    ETIFR.OCIE1C = 1
    LDS       R24,0x007C
    ETIFR.OCIE1C = 1
    ORI       R24,0x01
    STS       0x007C,R24
    Da, wo der Zugriff nicht über ON/OUT stattfindet, sondern per LDS/STS hat sich das Problem wohl gehalten.
    Für alle Fälle liegst Du mit meinem Vorschlag auf der sicheren Seite.

    Werd' das gleich mal melden...

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.715
    Blog-Einträge
    133
    Zitat Zitat von MagicWSmoke Beitrag anzeigen
    Für alle Fälle liegst Du mit meinem Vorschlag auf der sicheren Seite.
    Vielen Dank für die Tipps! Ich hab mit Ver 1.11.9.8 angefangen und nichts davon gewusst. Werde mich nun sicher an die BITS Funktion gewöhnen.

    Gruß
    Searcher
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Searcher Beitrag anzeigen
    Vielen Dank für die Tipps!
    Bitteschön, gerne
    Werde mich nun sicher an die BITS Funktion gewöhnen.
    Um ein einzelnes Flag zu löschen, ginge übrigens auch:
    Code:
    ETIFR = 2 ^ OCIE1C
    Für mehrere Flags:
    Code:
    Const Clear_Flags = 2 ^ OCIE1C or 2 ^ OCIE3C
    ETIFR = Clear_Flags

Ähnliche Themen

  1. Int0 wird bei direkt bei 'Enable Int0' ausgelöst - Warum?
    Von malthy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 30.08.2010, 18:10
  2. Impulse zählen
    Von kurzwelle im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 04.10.2008, 22:21
  3. Impulse pro Radumdrehung
    Von loubna im Forum Motoren
    Antworten: 8
    Letzter Beitrag: 29.06.2007, 22:24
  4. SHARP GP1A038RBK gibt 8 Impulse.
    Von Guy im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 30.01.2006, 08:08
  5. Impulse Zählen
    Von Spion im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 3
    Letzter Beitrag: 17.09.2005, 23:43

Berechtigungen

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

Solar Speicher und Akkus Tests