Ich habe eine Optischen Drehgeber der hat 30 Rastungen und X ? Impulse
Worauf beziehen sich Impulse? Auf ein 0-1-0 an einen Kanal ?
Bei meinem müssen alle Wechsel geprüft werden, das bedeutet jede Wechsel egal ob bei A oder B ist eine Rastung
Das Folgende Programm Funktionier korrekt.
Wahlweise per Timer oder Externem Interrupt .
Lässt sich die ISR noch verbessern?
Bei Timer ISR gehen halt sehr schnelle Drehungen verloren deshalb mag ich Timer nicht so …
Die extern Interrupt Version braucht halt zwei INTx Eingänge
Danke für Anregung …
Ich weiß es gibt schon viele Versionen für Drehgeber ( Encoder , Drehimpulsgeber Inkrementalgeber )
Aber mit keiner hat meiner zu meiner Zufriedenheit funktioniert.
Somit ist das Programm ein Mix aus vielem hier im Forum
Danke an alle die „Ihre Teile“ davon erkennen…..
Gruß HansHans
Alles anzeigen
Worauf beziehen sich Impulse? Auf ein 0-1-0 an einen Kanal ?
Bei meinem müssen alle Wechsel geprüft werden, das bedeutet jede Wechsel egal ob bei A oder B ist eine Rastung
Das Folgende Programm Funktionier korrekt.
Wahlweise per Timer oder Externem Interrupt .
Lässt sich die ISR noch verbessern?
Bei Timer ISR gehen halt sehr schnelle Drehungen verloren deshalb mag ich Timer nicht so …
Die extern Interrupt Version braucht halt zwei INTx Eingänge
Danke für Anregung …
Ich weiß es gibt schon viele Versionen für Drehgeber ( Encoder , Drehimpulsgeber Inkrementalgeber )
Aber mit keiner hat meiner zu meiner Zufriedenheit funktioniert.
Somit ist das Programm ein Mix aus vielem hier im Forum
Danke an alle die „Ihre Teile“ davon erkennen…..
Gruß HansHans
BASCOM-Quellcode: Drehgeber_R30_Ix_v1.bas
- '
- ' Drehimpulsgeber , Encoder , Drehgeber
- ' jeder Wechsel wird ausgewertet
- ' Date:31.12.2020
- ' Email: hans-hans@gmx.de
- ' Copyright (c) https://bascomforum.de
- '
- $regfile = "m2560def.dat"
- $crystal = 16000000
- $hwstack = 80
- $swstack = 90
- $framesize = 100
- $baud = 9600
- '*******************************************************************************
- ' Per Timer oder INT ?
- Const ISR_typ = 2 '1= Timer 2 = ext INT
- '**************************************************************************************
- 'Drehgeber :
- Config PortG.5 = input 'Taster Drehgeber :4
- PORTG.5 = 1 'Pullup on
- Config PortE.5 = input 'B Drehgeber INT5 :3
- Config PortE.4 = input 'A Drehgeber INT4 :2
- PORTE.5 = 1 'Pullup on
- PORTE.4 = 1 'Pullup on
- A Alias PinE.4
- B Alias PinE.5
- C_taster Alias PinG.5
- Dim Zustandswechsel as byte
- Dim Drehgeber_Step as Byte
- Dim Drehgeber as word
- '**************************************************************************************
- #if ISR_typ = 1 ' Timer ISR
- Const Timer1_Preload = 40536 '3036 =1sec / 40536 =100ms / 45536 =10ms 49536 = 1ms
- Config Timer1 = Timer , Prescale =64 '256 = 1Sec /64 =100ms / 8 =10ms / 1=1ms
- Ocr1ah = High(Timer1_Preload)
- Ocr1al = Low(Timer1_Preload)
- Tccr1a = 0
- Set Tccr1b.3
- On Compare1a Unterbrechungsroutine
- Enable Compare1a
- Print "Mit Timer ISR"
- #ELSEIF ISR_typ = 2 'ext INT ISR
- Config Int4 = CHANGE
- On Int4 Unterbrechungsroutine
- Enable Int4
- Config Int5 = CHANGE
- On Int5 Unterbrechungsroutine
- Enable Int5
- Print "Mit ext Int ISR"
- #else
- Print "Keine Auswahl "
- #endif
- Enable Interrupts
- '**************************************************************************************
- Do
- Print Drehgeber
- wait 1
- Loop
- '**************************************************************************************
- Unterbrechungsroutine:
- Zustandswechsel.0 = A
- Zustandswechsel.1 = B
- If C_taster = 1 then Drehgeber_Step =1 Else Drehgeber_Step =10 'Schnelllauf bei Taste drücken
- Select Case Zustandswechsel
- Case &H02 : drehgeber = drehgeber + Drehgeber_Step
- Case &H23 : drehgeber = drehgeber + Drehgeber_Step '
- Case &H31 : drehgeber = drehgeber + Drehgeber_Step
- Case &H10 : drehgeber = drehgeber + Drehgeber_Step
- Case &H01 : drehgeber = drehgeber - Drehgeber_Step
- Case &H13 : drehgeber = drehgeber - Drehgeber_Step
- Case &H32 : drehgeber = drehgeber - Drehgeber_Step
- Case &H20 : drehgeber = drehgeber - Drehgeber_Step
- End Select
- Zustandswechsel.4 = Zustandswechsel.0
- Zustandswechsel.5 = Zustandswechsel.1
- Return