- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Int0 gibt 2 Impulse?!

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.07.2011
    Beiträge
    66

    Int0 gibt 2 Impulse?!

    Anzeige

    E-Bike
    Hallo,
    ich möchte LEDs zur Musik ansteuern(bassgetaktet).
    Eine Elektronik wertet das Basssignal aus und gibt das Signal auf den INT0 eingang vom µC (NPN Transistor schaltet bei aktiv gegen Masse).

    Leider bekomme ich immer 2 Signale vom INT0 Eingang. Also 1 Signal zu viel. Das möchte ich softwaremäßig ändern!

    Meine Idee:
    Sobald der INT0 aufgerufen wird, wird der INT0 deaktiviert - leider kommen immer noch 2 Impulse!
    Nun habe ich einen Zähler und einen Printbefehl in die INT0_ISR reingeschrieben - der Zähler zählt bis 1 und es kommen 2 Printbefehle! Aber warum zählt der Zähler dann nicht bis 2?
    Kann mir das bitte einer erklären?

    Tobi

    hier die empfangenen Daten über die serielle Schnittstelle
    ==============<\r><\n>
    0<\r><\n>
    ==============<\r><\n>
    0<\r><\n>
    ==============<\r><\n>
    0<\r><\n>
    ==============<\r><\n>
    int0 Aufruf<\r><\n>
    1<\r><\n>
    ==============<\r><\n>
    int0 Aufruf<\r><\n>
    1<\r><\n>
    ==============<\r><\n>
    0<\r><\n>
    ==============<\r><\n>
    0<\r><\n>
    ==============<\r><\n>

    Code:
    $regfile = "m32def.dat"
    $hwstack = 40
    $swstack = 40
    $framesize = 40
    
    $crystal = 14745600
    $baud = 19200
    Wait 2                                                      'damit erst die Spannung anliegt und dann der µC startet
    '-------------------------------------------------------------------------------
    'Ein- Ausgänge:
    
    Ddra = &B00000000
    Ddrb = &B00000000                                           '1 Ausgang, 0 Eingang => Pin PB5-0 als Ausgang 6&7 als Eingang
    'Ddrc = &B00000000                                           '1 Ausgang, 0 Eingang => Pin PC7-0 als Ausgang
    Ddrd = &B00000000                                           '1 Ausgang, 0 Eingang
    
    '-------------------------------------------------------------------------------
    
    'Interrupt von Bassauswertung
    On Int0 Irq0
    'Enable Int0
    Config Int0 = Falling                                       'wechsel von High auf Low
    Enable Interrupts
    
    
    
    Dim Zaehler_do As Single
    Dim Zaehler_int0 As Byte
    
    Enable Int0
    
    
    'Do - Looproutiene:
    Do
    
    Incr Zaehler_do
    
    If Zaehler_do > 50000 Then
    
    Print Zaehler_int0
    Print "=============="
    
    Zaehler_do = 0
    Zaehler_int0 = 0
    
    Enable Int0
    
    End If
    
    
    
    Loop
    
    
    '_______________________________________________________________________________
    Irq0:
    Disable Int0
    Incr Zaehler_int0
    Print "int0 Aufruf"
    
    Return

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    01.10.2009
    Beiträge
    437
    Wenn ein weiteres Int0-Ereignis nach dem Disablen des Int0 eintritt, so wird es doch im INTF0-Flag des GIFR-Registers gemerkt.
    Sobald der Int0 wieder freigegeben wird, sorgt dies dafür dass unmittelbar nach Freigabe die Int0-ISR ein weiteres Mal ausgeführt wird.
    Kann vermieden werden, indem ab geeigneter Stelle durch GIFR.INTF0 = 1 das Flag gelöscht wird.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    19.07.2011
    Beiträge
    66
    Hallo MagicWSmoke,
    genau das war der Grund! Vielen Dank!
    Nun läut das Programm. Erst lösche ich das Flag und dann setzte ich den INT0 wieder auf Enable.

    Tobi

    PS. Wo finde ich etwas zu dem Befehl?
    In der Bascomhilfe habe ich dazu nichts gefunden.
    Im Datenblatt steht, dass man das Flag setzen muss, aber natürlich nicht, wie der Bascom-Befehl heißt.

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

  5. #5
    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)

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

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

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

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

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

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

12V Akku bauen