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
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
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 64
- $framesize = 48
- Baud = 9600
- '---------------------------------------------------------------------------------
- 'Definition LCD
- '---------------------------------------------------------------------------------
- Config Lcd = 16x4
- Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.5 , Rs = Portc.4
- '---------------------------------------------------------------------------------
- 'Definition der Ein- und Ausgänge
- '---------------------------------------------------------------------------------
- Config Pind.1 = Input 'Inkrementalgeber Kanal B
- Config Pind.4 = Input 'Inkrementalgeber Kanal A (Trigger)
- '---------------------------------------
- 'Definition Interrupt
- '---------------------------------------
- On Int0 Stop_links 'Pin D.2
- On Int1 Stop_rechts 'Pin D.3
- Config Int0 = Falling
- Config int1=Falling
- Enable Int0
- Enable Int1
- Enable Pcint2 'Pin D.4
- Pcmsk2.4 = 1
- On Pcint2 Pcint20_isr
- Anschlag_links Alias Portd.2
- Anschlag_rechts Alias Portd.3
- Kanal_a Alias Pind.4 'Pcint Inkrementalgeber Kanal A
- Kanal_b Alias Pind.1 'Inkrementalgeber Kanal B
- Anschlag_links = 1 'Interrupteingang Links
- Anschlag_rechts = 1 'Interrupteingang Rechts
- '
- Enable Interrupts
- '---------------------------------------
- 'Hauptschleife
- '---------------------------------------
- Do
- Gosub Startmenue
- ...
- Loop
- End
- '---------------------------------------
- 'Interruptbearbeitung
- '---------------------------------------
- '---------------------------------------
- 'Takterzeugung
- '---------------------------------------
- Isr_timer2:
- Timer2=Timer_Preload
- Incr Impuls
- If Impuls >= Step_ist Then
- Disable Timer2
- End If
- Toggle Takt
- Toggle Oszi 'nicht notwendig nur während Test hilfreich
- Return
- '------------------------------------
- 'Richtungsumschaltung
- '------------------------------------
- Stop_links: 'wirkt, wenn Schlitten am Linksanschlag
- Direction = 1 'Schlitten => Rechts (Motor dreht rechts)
- Return
- Stop_rechts: 'wirkt, wenn Schlitten am Rechtsanschlag
- Direction = 0 'Schlitten => Links (Motor dreht links)
- Return
- '------------------------------------
- 'Strichzähler ROD
- '------------------------------------
- Pcint20_isr:
- If Kanal_a = 1 Then 'steigende Flanke Kanal A => isr wird bearbeitet
- If Kanal_b = 1 Then 'Linkslauf = Vorwärts
- Incr Striche 'Zähler läuft vorwärts
- Else 'Recchtslauf = Rückwärts
- Decr Striche 'Zähler läuft rückwärts
- End If
- End If
- Return
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
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--168Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
- Anschlag_links Alias Portd.2
- Anschlag_rechts Alias Portd.3
Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- - Anschlag_links Alias Portd.2
-
ja, sind die Eingänge von den TasternGruß
Hans -
dann solltest du aber Alias Pind.2 schreiben.
-
okay, ...ändert aber nichts am Verhalten.Gruß
Hans -
-
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
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
Nicht zwingend, wäre ja per default so.Raum für Notizen
-----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------- -
tschoeatsch schrieb:
Brauchst du an den pin INTx jetzt pullups?
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pluto25 ()
-
so, es funktioniert:
einfach Zeile 1 durch 2 ersetzt
1) 'Pcmsk2.4 = 1 'Pin D.4
2) Pcmsk2 = &B00010000
offensichtlich spucken sich die Interrupts doch gegenseitig in die Suppe, wenn man sie in pcmsk2 nicht explizit ausschaltet
(nichts anderes geändert!)
Gruß
HansGruß
Hans -
Wenn es „nur“ die Maskierung der Pins ist, dann würde ich prüfen was vorher schon im PCMASK2 drin stand und: was macht der Compiler draus.Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
-
wie kann ich das jetzt noch prüfen?Gruß
Hans -
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
-----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------