PCINT Verständnisproblem

    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!

    • Quellcode

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 64
      4. $swstack = 64
      5. $framesize = 48
      6. Baud = 9600
      7. '---------------------------------------------------------------------------------
      8. 'Definition LCD
      9. '---------------------------------------------------------------------------------
      10. Config Lcd = 16x4
      11. Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
      12. '---------------------------------------------------------------------------------
      13. 'Definition der Ein- und Ausgänge
      14. '---------------------------------------------------------------------------------
      15. Config Pind.1 = Input 'Inkrementalgeber Kanal B
      16. Config Pind.4 = Input 'Inkrementalgeber Kanal A (Trigger)
      17. '---------------------------------------
      18. 'Definition Interrupt
      19. '---------------------------------------
      20. On Int0 Stop_links 'Pin D.2
      21. On Int1 Stop_rechts 'Pin D.3
      22. Config Int0 = Falling
      23. Config int1=Falling
      24. Enable Int0
      25. Enable Int1
      26. Enable Pcint2 'Pin D.4
      27. Pcmsk2.4 = 1
      28. On Pcint2 Pcint20_isr
      29. Anschlag_links Alias Portd.2
      30. Anschlag_rechts Alias Portd.3
      31. Kanal_a Alias Pind.4 'Pcint Inkrementalgeber Kanal A
      32. Kanal_b Alias Pind.1 'Inkrementalgeber Kanal B
      33. Anschlag_links = 1 'Interrupteingang Links
      34. Anschlag_rechts = 1 'Interrupteingang Rechts
      35. '
      36. Enable Interrupts
      37. '---------------------------------------
      38. 'Hauptschleife
      39. '---------------------------------------
      40. Do
      41. Gosub Startmenue
      42. ...
      43. Loop
      44. End
      45. '---------------------------------------
      46. 'Interruptbearbeitung
      47. '---------------------------------------
      48. '---------------------------------------
      49. 'Takterzeugung
      50. '---------------------------------------
      51. Isr_timer2:
      52. Timer2=Timer_Preload
      53. Incr Impuls
      54. If Impuls >= Step_ist Then
      55. Disable Timer2
      56. End If
      57. Toggle Takt
      58. Toggle Oszi 'nicht notwendig nur während Test hilfreich
      59. Return
      60. '------------------------------------
      61. 'Richtungsumschaltung
      62. '------------------------------------
      63. Stop_links: 'wirkt, wenn Schlitten am Linksanschlag
      64. Direction = 1 'Schlitten => Rechts (Motor dreht rechts)
      65. Return
      66. Stop_rechts: 'wirkt, wenn Schlitten am Rechtsanschlag
      67. Direction = 0 'Schlitten => Links (Motor dreht links)
      68. Return
      69. '------------------------------------
      70. 'Strichzähler ROD
      71. '------------------------------------
      72. Pcint20_isr:
      73. If Kanal_a = 1 Then 'steigende Flanke Kanal A => isr wird bearbeitet
      74. If Kanal_b = 1 Then 'Linkslauf = Vorwärts
      75. Incr Striche 'Zähler läuft vorwärts
      76. Else 'Recchtslauf = Rückwärts
      77. Decr Striche 'Zähler läuft rückwärts
      78. End If
      79. End If
      80. Return
      Alles anzeigen
      Ich hab mal bis auf die Interruprbearbeitung alles gelöscht, wie gesagt, die Richtungsumschaltung, welche von den beiden Tastern ausgelöst wird, hat ohne PCINT einwandfrei funktioniert, seit diese drin ist, reagiert das Programm nicht mehr auf Int0 und Int1
      Gruß
      Hans
    • fredred schrieb:

      tschoeatsch schrieb:

      Wenn ein input 2 verschiedene interrupts auslösen kann, dann wird nach einer Prioritätenliste die interrupts abgearbeitet. INTx hat Vorrang vor PCINTx
      Nana bist du dir sicher das dies für alle Controller so ist?
      Wenn du nicht an der interruptvektorTabelle rum fummelst

      The lowest addresses in the program memory space are by default defined as the reset and interrupt vectors. The complete
      list of vectors is shown in Section 12. “Interrupts” on page 50. The list also determines the priority levels of the different
      interrupts. The lower the address the higher is the priority level. RESET has the highest priority, and next is INT0 – the
      external interrupt request 0. The interrupt vectors can be moved to the start of the boot flash section by setting the IVSEL bit
      in the MCU control register (MCUCR). Refer to Section 12. “Interrupts” on page 50 for more information. The reset vector
      can also be moved to the start of the boot flash section by programming the BOOTRST fuse, see
      Section 27. “Boot Loader Support – Read-While-Write Self-Programming” on page 237.

      steht im Datenblatt vom mega48--168
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
      1. Anschlag_links Alias Portd.2
      2. Anschlag_rechts Alias Portd.3
      Das sind doch Eingänge, oder? ;) oder willst du da nur die pullups einschalten?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Brauchst du an den pin INTx jetzt pullups? Du testest ja auf falling, also sind deine Taster gegen Gnd. Dein code hat die pullups eingeschaltet, du kannst aber diese alias nicht zum Lesen der Eingänge verwenden.
      Raum für Notizen

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

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

      Sollte dann nicht auch noch

      BASCOM-Quellcode

      1. Config Pind.2 = Input
      2. Config Pind.3 = Input
      irgend wo stehen.
      Nicht zwingend, wäre ja per default so.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Mich wundert das jetzt auch, weil ja im DB drin steht 'Initial Value 0'. Also by default sind erst mal alle pins nicht interruptfähig.
      Raum für Notizen

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

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