-         

Ergebnis 1 bis 8 von 8

Thema: Interrupt problem!

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2007
    Beiträge
    7

    Interrupt problem!

    Anzeige

    Hallo liebe Robotergemeinde!
    Heute mal mein erster post hier. Habe schon sehr viel hier gelesen und muss sagen WOW.
    Aber nun zu meinen Problem.
    Spiele momentan ein wenig mit Bascom rum und Bastele momentan an einen kleinen Projekt. Damit der Code auch wann funzt Arbeite ich gernen immer zuerst kleine Teile des Programmes aus um mich mit Bascom etc genauer vertraut zu machen.


    Kurz zur Funktion:
    Der Kontroller macht nichts aus das am LCD "in Schleife "steht. Bis ein Interrupt an INT0 kommt. Dann soll es ausgeben Interrupt und soll bei jeden Interrupt eine Var erhöhen und im gleichen anzeigen. Das Problem ist das er bei jedem Interrupt die Variable um 2 erhöht und nicht um 1.
    hier der Code:
    Code:
    $regfile = "m8def.dat"                                      '
    $crystal = 10000000                                         'Quarz: 10,0 MHz
    
    '---Config für LCD -----------------
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , Rs = Portb.4 , E = Portb.5
    Config Lcdbus = 4
    Config Lcdmode = Port
    Cursor On
    
    '******** Initialisierung ********
    Dim A As Byte
    Enable Interrupts
    Config Int0 = Falling                                       
    Enable Int0
    On Int0 Irq  
    
    Config Portd.2 = Input                                   'interrupt
    
                                                                        'Debounce Portd.2 , 1 , Irq
    
    
    '******** Hauptprogramm ********
    
     Do
          Cls
          Locate 1 , 1
          Lcd "in schleife"
          Wait 2
    
    Loop
    
    
    '******** Unterprogramme ********
    Irq:
          Cls
          Incr A
          Locate 1 , 1
          Lcd " Interrupt"
          Lowerline
          Lcd " A = " ; A ; ""
          Wait 1
          Return
    End

    würde mich freuen wenn ich von euch ein wenig hilfe bekommen könnte.

    mfg Jannek

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    könnte an Tastenprellen liegen,
    such mal im Forum unter entprellen.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2007
    Beiträge
    7
    Das mit dem Entprellen habe ich mir auch schon gedacht aber verstehe nicht warum das so sein soll. Und wie soll man den einen Interrupt Entprellen?
    Stellt man zb den INT0 auf Rising so springt er doch sofort nach der steigenden Flanke in das Interruptprogramm. Läßt man dort das Programm zb eine sek. pausieren, so wäre das mit dem Prellen ja nicht ganz möglich oder?

    mir fällt auch nichts mehr zu dem Problem ein, hab schon sehr viel versucht...

    würde mich noch über witere Hilfen freuen.
    mfg Jannek

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    Ja,denkt man

    Bau mal aus Spaß einen weiteren Zähler ein der dir anzeigt wie oft die Interruptroutine angesprungen wird.
    Gruß
    Ratber

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2007
    Beiträge
    7
    Also habe gerade noch mal geschaut und so wie ich es am anfang hatte, wurde die Interruptroutine IMMER 2 mal aufgerufen.
    Habe es jetzt mal so ausprobiert das in der Interruptroutine ein Debouncebefehl steht der dann sofort weiterverweißt. Funktioniert komischerweise. Zwar nicht ganz die feine Art aber ist ja mal ein ansatz.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    43
    Beiträge
    2.240
    die ISR wird vermutlich 2-mal nacheinander angesprungen,
    weil seine ISR mit den LCD-Befehlen ja im Verhältnis
    ewig lange ist und eben während der ISR der Int durch Prellen
    nochmal ausgelöst wird.
    Der Event wird dann nach Verlassen der ersten Runde gleich
    wieder angesprungen.
    Währ die ISR kürzer ging der Zähler vermutlich auf 50 oder was
    hoch durchs Prellen.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.09.2004
    Ort
    Düsseldorf
    Beiträge
    3.948
    @Jannek

    Na also,jetzt hast du sicher auch einen weiteren Wissensbaustein aufgenommen.

    Ein IRQ kann auch in einer INT-Routine aufgerufen werden.
    Deswegen müllt man diese nicht mit Zeitraubenden Befehlen (zb. LCD-Ausgaben) voll sondern nur mit dem allernötigsten (Am besten nur "Flags" setzen und raus) und erledigt die Auswertung ausserhalb.

    Es ginge auch wenn du am Anfang der INT-Routine den INT0 abschaltest und am Ende wieder ein.
    Dann kann dir wenigstens kein weiterer INT0 in die Quere kommen bis die Routine erledigt ist.

    Das Entprellen nimmt dir das natürlich nicht ab,da mußt du selber noch nachlegen.
    Es geht auch "Oldscool" händisch ohne "Debounce.....".
    Das würde ich aber auch "Extern" erledigen weil....................



    ........"Im INT gilt das gleiche wie am Telefon.Fasse dich kurz"

    Gute Nacht.
    Gruß
    Ratber

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    09.05.2007
    Beiträge
    7
    Erst mal danke für die Antworten!! Das man sich im IRQ kurz fassen sollte wußte ich bereits. Aber da bei meiner ziel Anwendung sehr viel Zeit zur verfügung steht (ca 20 sek) dachte ich, das ich damit so Arbeiten könnte... sollte ja nicht so sein!
    werde dann schon mal die nächste Frage erstellen dann zum Thema EEPROM.
    Ja da komme ich leider auch nicht weiter und habe da die ein oder andere Frage warum mein Ansatz nicht Funktioniert!!

    mfg Jannek

Berechtigungen

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