- 3D-Druck Einstieg und Tipps         
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
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ich glaube es gibt keinen Bascom Befehl der das Interruptflag löscht. Im zweifelsfall rufst du eine ASM-Routine auf und machst es per Hand.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Kampi Beitrag anzeigen
    Ich glaube es gibt keinen Bascom Befehl der das Interruptflag löscht.
    Da glaubst Du falsch.

    Wobei ich zugebe, dass ich es auch schon mal besser gewusst habe.
    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.

    Richtig ist also: GIFR = Bits(INTF0)

    Damit gibt's das Problem nicht.
    Im zweifelsfall rufst du eine ASM-Routine auf und machst es per Hand.
    Völlig sinnfrei.

    Edit:
    @stfan1409,
    aber natürlich nicht, wie der Bascom-Befehl heißt
    Der Bascom Befehl lautet genauso wie ich ihn geschrieben habe. Die Abfolge RegisterX.BitX = WertX ist Bascom-Standard, nennt sich Bitmanipulation. Aus besagten Grund verwende allerdings Bits(), Info dazu findest Du in der Hilfe.
    Geändert von MagicWSmoke (08.01.2012 um 14:05 Uhr)

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ah ok. Danke für die Korrektur
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Zitat Zitat von Kampi Beitrag anzeigen
    Ah ok. Danke für die Korrektur
    Kein Problem
    Vielleicht meintest Du auch einen ganz speziellen Befehl zum speziellen Löschen von Flag-Registern. So etwas wie "Clearbit RegisterX.BitX" gibt's natürlich nicht. Auch nicht notwendig, da einfachst per Bits() umzusetzen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

  6. #6
    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...

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.703
    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

  8. #8
    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, 19:10
  2. Impulse zählen
    Von kurzwelle im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 04.10.2008, 23:21
  3. Impulse pro Radumdrehung
    Von loubna im Forum Motoren
    Antworten: 8
    Letzter Beitrag: 29.06.2007, 23:24
  4. SHARP GP1A038RBK gibt 8 Impulse.
    Von Guy im Forum Sensoren / Sensorik
    Antworten: 12
    Letzter Beitrag: 30.01.2006, 09:08
  5. Impulse Zählen
    Von Spion im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 3
    Letzter Beitrag: 18.09.2005, 00:43

Berechtigungen

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

LiFePO4 Speicher Test