PCINT Attiny Flankenerkennung

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • PCINT Attiny Flankenerkennung

      Servus,
      irgendwie steh ich grad auf dem Schlauch. ich willmit nem Attiny den PCINT an B.0 nutzen,das klappt soweit auch schon. Nur ist es ja per Design das der Attiny für jede Flanke des impulses das Interupt Flag setzt. D.h. während meine interruptroutine noch läuft wird schon der nächste Einsprung gesetzt, die Daten werden 2x ausgeworfen. Leider ist der impuls äusserst kurz, selbst wenn ich in der Routine nur nen Flag setzte ist der zweite Einsprung schon da.

      Quellcode

      1. $regfile = "attiny4313.dat"
      2. $crystal = 8000000
      3. $hwstack = 40
      4. $swstack = 16
      5. $framesize = 40
      6. 'Alias
      7. Din Alias Portd.5 'Mit DIN an der Max-Platine verbinden
      8. Clk Alias Portd.4 'Mit Clk an der Max-Platine verbinden
      9. Cs Alias Portd.3 'Mit Cs an der Max-Platine verbinden
      10. 'ports
      11. Config Din = Output
      12. Config Clk = Output
      13. Config Cs = Output
      14. Config Pinb.0 = Input
      15. Dim Ausgabestring As Double
      16. Dim Ausgabe(8) As Byte At Ausgabestring Overlay
      17. Dim Befehl As Byte
      18. Dim Disp_daten As Byte
      19. Dim Faden As Double
      20. Dim Fadenteil(8) As Byte At Faden Overlay
      21. Dim Intflanke As Bit
      22. Enable Pcint0
      23. On Pcint0 Int0_isr
      24. Pcmsk = &B00000001
      25. Enable Interrupts
      26. ' Initialisieren des MAX7219
      27. Befehl = &H09 : Disp_daten = &H00 ' kein decode "B" für alle Digits weil 8x8 Matrix
      28. Gosub Led_write_command
      29. Befehl = &H0A : Disp_daten = &H04 ' Helligkeit 0-F
      30. Gosub Led_write_command
      31. Befehl = &H0B : Disp_daten = 7 ' Anzahl Digits 8 weil 8x8 Matrix
      32. Gosub Led_write_command
      33. Befehl = &H0F : Disp_daten = 0 ' Test Off
      34. Gosub Led_write_command
      35. Befehl = &H0C : Disp_daten = 1 ' Shutdown Off
      36. Gosub Led_write_command
      37. Do
      38. Print "nothing"
      39. Wait 1
      40. Loop
      41. End
      42. End
      43. Led_write_command:
      44. Cs = 0
      45. Shiftout Din , Clk , Befehl , 1
      46. Shiftout Din , Clk , Disp_daten , 1
      47. Cs = 1 'Flanke von 0 zu 1 überträgt den Befehl
      48. Return
      49. Int0_isr:
      50. 'If Intflanke = 0 Then
      51. Befehl = &H01 : Disp_daten = Fadenteil(1)
      52. Gosub Led_write_command
      53. Befehl = &H02 : Disp_daten = Fadenteil(2)
      54. Gosub Led_write_command
      55. Befehl = &H03 : Disp_daten = Fadenteil(3)
      56. Gosub Led_write_command
      57. Befehl = &H04 : Disp_daten = Fadenteil(4)
      58. Gosub Led_write_command
      59. Befehl = &H05 : Disp_daten = Fadenteil(5)
      60. Gosub Led_write_command
      61. Befehl = &H06 : Disp_daten = Fadenteil(6)
      62. Gosub Led_write_command
      63. Befehl = &H07 : Disp_daten = Fadenteil(7)
      64. Gosub Led_write_command
      65. Befehl = &H08 : Disp_daten = Fadenteil(8)
      66. Gosub Led_write_command
      67. 'End If
      68. 'Toggle Intflanke
      69. Return
      Alles anzeigen
      Ich kann das natürlich mit der (jetzt auskommentierten) Abfrage der Variable "Intflanke" in zeile 67+85+87 rausbasteln. Wenn da aber irgendwann mal ne Störung eingefangen wird läuft rein technisch gesehen die Ausgabe mit der fallenden Flanke. An sich kein Problem, ich finds halt unschön a_71_f9c57bbe .
      Jetzt steh ich halt aufm Schlauch, man kann doch das Flag im Interruptregister wieder löschen das den Interrupt auslöst während mein Routine noch läuft. Nur wie heists??

      Tobias
    • Schraubbaer schrieb:

      'If Intflanke = 0 Then
      und wenn du statt dessen
      If pinb.0=0 then...
      schreibst, dann werden nur die Anweisungen bei fallender Flanke ausgeführt, der int für die steigende Flanke wird zwar auch angesprungen, aber da passiert nix, außer das durch das return die interruptflags zurück gesetzt werden.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • djmsc schrieb:

      Sorry habe in der falschen PDF geschaut
      Beim Tiny4313 gibt es nur das GIFR und da drin werden dann die Flags gesetzt.
      Tja djmsc, im Bascom ist ein veraltetes Datenblatt zu finden, also werden auch die pdf's nicht mehr im Bascom aktualisiert, passt doch a_166_29aea317
      Merke: immer beim Hersteller nach aktuellen pdf's suchen (mach ich schon lange so). Der Erfinder von Bascom hat offensichtlich "keinen richtigen Bock mehr", nur sollte er das seinem Publikum auch mal mitteilen.
    • oscar schrieb:

      Bascom ist ein veraltetes Datenblatt zu finden, also werden auch die pdf's nicht mehr im Bascom aktualisiert, passt doch
      wird ja langsam zu schwarz, deine Sicht Richtung bascom. a_52_eb39d6ae
      Ist es nicht so, das bascom sich das Datenblatt holt, wenn es noch nicht geholt wurde, und es dann für weitere Verwendung speichert. Das ist ja eigentlich nur ein service, den bascom bietet, wenn ich jetzt zum ersten mal das Datenblatt runter laden ließe, müsste ich doch die neueste Version haben, hätte ich das schon vor 10 Jahren gemacht, eine alte. Wenn vom Hersteller die Quelle verlagert wird und bascom findet nix, ist das wieder was anderes.

      Und eigentlich dürfte ein Datenblatt sich nicht so ändern, dass ein gleichgenannter chip verschiedene Register verwendet. Ein 10 Jahre alter attiny4313 muss kompatibel mit einem neuen attiny4313 sein.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @oscar
      In Bascom gibt es unter Werkzeuge eine Funktion PDF Updater. Dort kann man händisch die Datenblätter aktualisieren. Nirgentwo stehr geschrieben daß dies automatisch erfolgt. Man kann ja auch mal ein bisschen mitspielen und nicht immer erwarten, daß andere alles für einen tun.

      Mit Deinem Defätissmus in Bezug auf Bascom schadest Du der Sache mehr als das es nützt.

      Und auch Mitch64 hat Unrecht wenn er fehlende Lis anprangert und auf Arduino verweist. Die meisten Libs schreiben immer noch die Mitglieder der Community und auch unter Bascom ist das niemandem verboten
      Wem ich nicht ausdrücklich widerspreche, der darf das bis auf Widerruf als "Gefällt mir" verstehen.
    • Den sachdienlichen Hinweis hat Tschoetsch gegeben:

      tschoeatsch schrieb:

      und wenn du statt dessen
      If pinb.0=0 then...
      schreibst, dann werden nur die Anweisungen bei fallender Flanke ausgeführt, der int für die steigende Flanke wird zwar auch angesprungen, aber da passiert nix, außer das durch das return die interruptflags zurück gesetzt werden.


      Das Datenblatt auf der Herstellerseite ist übrigens von 2011
      ww1.microchip.com/downloads/en/DeviceDoc/doc8246.pdf
    • oscar schrieb:

      Wozu dann der pdf-Updater der IDE?
      Um das Update bei Bedarf anzustoßen. Die meisten benutzen sowieso eher nur 3 bis 4 verschiedene Mikrocontroller. Mich würde es nerven, wenn BASCOM bei jedem Start oder so ständig neue pdfs updaten würde, die mich gar nicht interessieren.
      Ich schließe mich djmsc und tschoeatsch an: Der Hersteller wird das Datenblatt nicht alle paar Wochen updaten. Eine Chipentwicklung kostet viel Geld und wenn ein Typ in den Handel geht, dann müssen Chip und Datenblatt über längere Zeit stabil sein. Es soll ja auch professionelle Entwickler geben, die sich über Jahre darauf verlassen müssen.
      @Oskar: Hast Du jetzt Differenzen in den Datenblättern festgestellt, die Dich behindern? BASCOM hat ja gerade den Riesenvorteil, dass man meistens gar nicht in die Details des Datenblattes sehen muss. Worauf bist Du denn jetzt gestoßen, was im Datenblatt veränders worden sein könnte und was Dich tatsächlich betrifft? Ansonsten schlage ich vor: Sei zufrieden, dass BASCOM überhaupt Datenblätter bietet - und zum Beispiel Pinbelegungen. Wer das nicht nutzen möchte, der kann sich ja jederzeit ein pdf beim Hersteller herunterladen.
    • stefanhamburg schrieb:

      Der Hersteller wird das Datenblatt nicht alle paar Wochen updaten. Eine Chipentwicklung kostet viel Geld und wenn ein Typ in den Handel geht, dann müssen Chip und Datenblatt über längere Zeit stabil sein. Es soll ja auch professionelle Entwickler geben, die sich über Jahre darauf verlassen müssen.
      Das ist so nicht ganz richtig. Gerade der ATtiny2313 ist da ein guten Beispiel, er ist schon lange auf dem Markt, aber wenn man genau ins Datenblatt schaut ist mittlerweile die Rev.2543M von 2016 aktuell. Man braucht sich nur mal die Abteilung "Errata" und "Revisions History" anschauen. Zwar nicht alle paar Wochen aber die Chips und Datenblätter werden schon aktualisiert.
    • @Schraubbaer

      Kannst sagen, wie breit so ein Impuls ist und wie der zeitliche Abstand der Pulse ist?
      Also Pulsdauer (µs) und Pulswiederholung (Hz)?

      Ich denke in einem kurzen Puls kann man keine Shiftouts machen, das dauert vermutlich zu lange.
      Sowas gehört eigentlich nicht in eine ISR.

      Bezüglich der doppelten Triggerung muss ich @tschoeatsch recht geben.
      Das hat ein Pin-Change-Interrupt so an sich.
      Hier kann eine Abfrage des Pegels in der ISR für Abhilfe sorgen.

      Oder man nimmt einen externen Interrupt Pin wie INT0, da kann man die Flanke konfigurieren.

      Vorausgesetzt der Puls ist lange genug, um den Pegel noch zu erwischen.
    • Datenblätter aus Bascom? Hab ich nie genutzt, ich lad immer runter. Bin da altmodisch.

      Das mit if pinb.0 =1 hatte ich mal probiert, anscheinend ist der puls schon dafür zu knapp. Mit nosave wollt ich später nochmal probieren.... wobei auf die idee mit der nullerkennung statt der eins komm ich nochmal zurück.
      Ich weiss das man in die ISR normalerweise kein shiftout reinbaut, in dem fall total egal, wenn kommt der nächste puls laut fahrplan erst in knapp 400ms. Um den shiftout mach ich mir später sorgen a_35_aee4835d
      Ich hab noch 3 andere funktionierende Versionen ohne das es in der ISR ist, Gefallen mir aber alle auch nicht, ausserdem will man ja was lernen und sich weiter Verbessern a_32_d623ea7e
      Später kommt das mal auf nen tiny25, da gibts keinen pin Interrupt an nen freien pin, daher die würgerei mit dem PCint. Testen auf dem 25er direkt ist doof weil ich dem mangels pins dann den reset pin wegnehme.

      Tobias