Jump to content

Flexibler Encoder Handler


avogra
 Share

Recommended Posts

hallo,

nachdem mich gestern die encoder doch ziemlich genervt haben, hab ich mal n bisschen ursachenforschung betrieben. Leider hab ich in Augsburg weder Werkzeug, noch Messgerät oder ähnliches. Ging aber auch ohne, und ich hab sogar ne Flick-Lösung in C gefunden :)

Also nochmal das Problem im Detail: Bei den Pollin-Encodern gibt es einige (2-3) (Rast-)Stellungen, in denen der Rastpunkt ziemlich genau mit der Flanke des 2ten Encoder-Pins zusammenfällt. Liegt vermutlich am ungewöhnlichen (?) Aufbau des Encoders. Das führt nun dazu, dass der Pin bei der leichtesten Erschütterung umschaltet.

Ich hab ursprünglich MIOS_ENC_MODE_DETENTED mit "Speed-Mode Fast (2)" verwendet. Laut der Übersicht http://www.ucapps.de/mios/mios_encoder_modes.gif ist das genau der erste INC-Übergang. Genau das beobachte ich auch in der Software: in DIN_ENC_NotifyToggle kommen zufällig "incrementer >0" an und mein zähler springt munter nach oben. da der DEC-Übergang auf einer anderen Flanke liegt, gehts auch nicht wieder nach unten.

probeweise hab ich mal MIOS_ENC_MODE_UNDETENTED mit "Speed-Mode Normal" verwendet. Da hier jede Flanke ausgewertet wird, habe ich erwartet, dass nun abwechselnd +/-1 als incrementer ankommt. mein zähler würde also nicht mehr nach oben zählen sondern zufällig zwischen zwei benachbarten Werten wechseln. Interessanterweise kamen aber immernoch aufeinanderfolgende incrementer == +1.

Also hab ich mal n bisschen nach Theorie zur Encoder-Auswertung gesucht und bin auch schnell fündig geworden http://www.hilpers.com/604594-prelldauer-bei-encoder-drehimulsgeber (kein schöner thread, aber die info, die ich gesucht hab, war drin) . Kurz zusammengefasst gibts im Wesentlichen folgende gängige Implementierungen:

Abfrage: regelmäßiges Polling <-> Interrupt

  -da die Encoder am SR hängen, geh ich bei MIOS mal von ersterem aus

Auswertung: Finite-State-Maschine <-> Ein Pin wird als Takt, zweiter als Richtung ausgewertet

  -die zweite Möglichkeit hab ich nicht hundertprozentig verstanden, aber laut dem Thread würde sie genau das beobachtete Verhalten erklären. Dafür braucht sie weniger Rechenleistung.

Eine "saubere" Encoder-Implementierung verwendet also grundsätzlich eine Finite-State-Maschine zur auswertung, die Art der Abfrage spielt dann keine Rolle. Also hab ich mal meinen einen Encoder aus ENC_TABLE gelöscht und in DIN_NotifyToggle eine eigene Encoder-Auswertung geschrieben. Der Encoder funktioniert jetzt einwandfrei, allerdings komm ich bei allzu schnellem Drehen an die Performance-Grenzen. Liegt mit Sicherheit an C bzw. meinem noch optimierbaren Code.

Die Zustände der Finite-State-Machine entsprechen der PinA/B-Kombination. Theoretisch möglich sind 16 Übergänge zwischen diesen Zuständen. Da nur benachbarte Zustände interessieren, sind nur 8 Übergänge relevant. Ich hab das ganze mal in ne Grafik gepackt:

Enc-Diagramm2.jpg

Mein Code is eigentlich ganz simpel. Er merkt sich bei nem neuen DIN_NotifyToggle-Aufruf den letzten Zustand und packt den mit dem neuen Zustand in ein variable, so dass darin letztendlich ein Übergang entsprechend der Tabelle oben enthalten ist. Hat diese den Wert 2 oder D, wird ENC_NotifyChange mit positivem incrementer aufgerufen, bei Wert 8 oder 7 mit negativem. Die wackligen Übergänge 1 und 4 spielen also gar keine Rolle mehr.

Schöner wärs natürlich, wenn MIOS schon einen entsprechenden ENC_MODE hätte *zwinker*

u.U. könnten die rastungen natürlich auch in die andere Richtung verschoben sein. Deshalb wären zwei neue Modi ne feine Sache:

MIOS_ENC_MODE_DETENTED4

positiver incrementer für Übergang 2 und D, negativer für Übergang 8 und 7

MIOS_ENC_MODE_DETENTED5

positiver incrementer für Übergang B und 4, negativer für Übergang E und 1

BTW, mit is grad MIOS_ENC_MODE_DETENTED3 in mios_enc_table.inc aufgefallen. was macht denn der?

Grüße,

Alex

Link to comment
Share on other sites

Hallo Alex,

danke fuer die Ursachenforschung! Ich habe bereits erwartet, dass sich das Problem so einfach loesen laesst, bin jedoch nicht davon ausgegangen, dass da noch jemand anderes "durchsteigt". ;)

MIOS scannt die Pins periodisch, und wertet sie dann mit einer Finite State Machine aus.

Deine Tabelle findest Du unter mios_enc.inc wieder:


        ; State Machine (own Design, the Machine from Microchip on AN519
        ; is too simple and doesn't work correctly!)
        ; changed 2000-1-5: special "analyse" state which corrects the ENC direction
        ; if encoder is rotated to fast - I should patent it ;-)

        ;; ENC_STAT[3..0] = LB, LA, B, A

        ;; type 0x00 - INC: 2, B, D, 4
        ;;            DEC: 1, 7, E, 8
        ;; type 0x80 - INC: B, 4
        ;;            DEC: 7, 8
        ;; type 0x81 - INC: B
        ;;            DEC: 7
        ;; type 0x82 - INC: 4
        ;;            DEC: 8

        movf    IRQ_TMP4, W
        andlw  0x0f
        JUMPTABLE_2BYTES_UNSECURE
        rgoto  MIOS_ENC_Do_Nothing    ; 0
        rgoto  MIOS_ENC_Do_Dec_ND      ; 1  -  only if NON_DETENTED
        rgoto  MIOS_ENC_Do_Inc_ND      ; 2  -  only if NON_DETENTED
        rgoto  MIOS_ENC_Do_Nothing    ; 3
        rgoto  MIOS_ENC_Do_Inc_D13    ; 4  -  only if NON_DETENTED, DETENTED1 or DETENTED3
        rgoto  MIOS_ENC_Do_Nothing    ; 5
        rgoto  MIOS_ENC_Do_Nothing    ; 6
        rgoto  MIOS_ENC_Do_Dec_D12    ; 7  -  only if NON_DETENTED, DETENTED1 or DETENTED2
        rgoto  MIOS_ENC_Do_Dec_D13    ; 8  -  only if NON_DETENTED, DETENTED1 or DETENTED3
        rgoto  MIOS_ENC_Do_Nothing    ; 9
        rgoto  MIOS_ENC_Do_Nothing    ; A
        rgoto  MIOS_ENC_Do_Inc_D12    ; B  -  only if NON_DETENTED, DETENTED1 or DETENTED2
        rgoto  MIOS_ENC_Do_Nothing    ; C
        rgoto  MIOS_ENC_Do_Inc_ND      ; D  -  only if NON_DETENTED
        rgoto  MIOS_ENC_Do_Dec_ND      ; E  -  only if NON_DETENTED
        rgoto  MIOS_ENC_Do_Nothing    ; F
[/code]

Bisher ist sie jedoch nur fuer 4 Encoder Typen ausgelegt. Um Speicher zu sparen (was ja beim PIC leider gang und gaebe ist...) sind diese Typen trickreich zusammengefasst, was eine Anpassung an einen weiteren Typ etwas schwierig machen wird. Doch Du koenntest die Tabelle ja mal versuchen so anzupassen, dass Deine Encoder richtig ausgewertet werden - und ich koennte dann bei Bedarf bei der Speicher-Optimierung helfen.

Fuer MIOS_ENC_MODE_DETENTED3 gibt es noch keine Grafik, ich habe das mal irgendwann fuer jemanden auf die Schnelle eingebaut, doch nie sauber dokumentiert... :-/

Zum besseren Verstaendnis des Algorithmus koenntest Du auch mal in die C Variante des Encoder Treibers reinschauen: mios32_enc.c

Gruss, Thorsten.

Link to comment
Share on other sites

danke fuer die Ursachenforschung! Ich habe bereits erwartet, dass sich das Problem so einfach loesen laesst, bin jedoch nicht davon ausgegangen, dass da noch jemand anderes "durchsteigt". ;)

Das fass ich einfach mal als Kompliment auf, danke :) (Auch wenn das Ganze wohl vor allem eine Frage der Muße ist  :P )

Ich hab mir den MIOS32-Code mal angeschaut. bin weitgehend klar gekommen, lustigerweise hast du sogar die gleiche Reihenfolge für die Pins in ENC_STAT hergenommen, es sind also auch bei dir case 1 und 4, wo mein encoder zickt. Seh jetzt auch, warum das mit dem Erweitern bissl ungünstig ist.

Nachdem sich ja die States für DETENTED2 und DETENTED3 gegenseitig ausschließen, hab ich die beiden einfach für meine States missbraucht. DETENTED1 ist damit zwar identisch mit UNDETENTED aber damit werd ich wohl leben können. Mein Table sieht jetzt so aus:

	JUMPTABLE_2BYTES_UNSECURE
	rgoto	MIOS_ENC_Do_Nothing	; 0
	rgoto	MIOS_ENC_Do_Dec_D13	; 1  -  only if NON_DETENTED, DETENTED1 or DETENTED3
	rgoto	MIOS_ENC_Do_Inc_D12	; 2  -  only if NON_DETENTED, DETENTED1 or DETENTED2
	rgoto	MIOS_ENC_Do_Nothing	; 3
	rgoto	MIOS_ENC_Do_Inc_D13	; 4  -  only if NON_DETENTED, DETENTED1 or DETENTED3
	rgoto	MIOS_ENC_Do_Nothing	; 5
	rgoto	MIOS_ENC_Do_Nothing	; 6
	rgoto	MIOS_ENC_Do_Dec_D12	; 7  -  only if NON_DETENTED, DETENTED1 or DETENTED2
	rgoto	MIOS_ENC_Do_Dec_D12	; 8  -  only if NON_DETENTED, DETENTED1 or DETENTED2
	rgoto	MIOS_ENC_Do_Nothing	; 9
	rgoto	MIOS_ENC_Do_Nothing	; A
	rgoto	MIOS_ENC_Do_Inc_D13	; B  -  only if NON_DETENTED, DETENTED1 or DETENTED3
	rgoto	MIOS_ENC_Do_Nothing	; C
	rgoto	MIOS_ENC_Do_Inc_D12	; D  -  only if NON_DETENTED, DETENTED1 or DETENTED2
	rgoto	MIOS_ENC_Do_Dec_D13	; E  -  only if NON_DETENTED, DETENTED1 or DETENTED3
	rgoto	MIOS_ENC_Do_Nothing	; F

Funktioniert einwandfrei :D Vieeelen Dank für den Hinweis!

Grüße,

Alex

Link to comment
Share on other sites

na wenn ich kein geld für neue ausgeben will, bleibt mir wohl kaum was anderes übrig  :P

ich nehm mal an, thorsten sieht ungern ne zweite version von mios hier rumgeistern. wenn noch jemand probleme mit den panasonic encodern hat und mios nicht selber anpassen will, dem kann ich ja meine version auf anfrage schicken.

Grüße, Alex

Link to comment
Share on other sites

Ich werde Deine Tabelle in die aktuelle MIOS Version einbauen.

Das kostet dann zwar 40 zusaetzliche Bytes, doch die sind es wert! ;)

Wenn man DETENTED[45] wie folgt codiert:


MIOS_ENC_MODE_DETENTED2         EQU     0xc3
MIOS_ENC_MODE_DETENTED3         EQU     0xc4
[/code]

dann koennte man einfach nach einer positiven Ueberpruefung des 7ten Bits zur alternativen Tabelle verzweigen.

Gruss, Thorsten.

Link to comment
Share on other sites

achso, ich dachte, jedes byte extra ist ein absolutes No-Go.

wenn dem nicht so ist, schreib ich auch gern die tabelle und die aufgerufenen funktionen um, so dass meine vorgeschlagenen modi auch nen platz drin haben (leider nur in C). Das einfach mit ner Verzweigung zu machen, und die Tabelle doppelt reinzuschreiben ist ja nicht die sauberste Lösung.

Ich bin mal durchgegangen, was man ändern müsste. Bisher sinds ja 7 Funktionen, die Aufgerufen wurden. Und es geht sich wunderschön aus, dass du pro Funktion einen Vergleich brauchst, um den ENC_MODE zu filtern.

Wenn ich meine beiden Modi mit rein nehm, brauch ich eine zusätzliche Funktion, und jede Funktion braucht dann 2 Vergleiche gegen ENC_MODE. Ich weiß nicht, wieviel Platz das beansprucht, aber ich vermute mal, weniger als 40 Byte. Performance-mäßig sollte es nicht mehr kosten als ne zusätzliche verzweigung in meine tabelle.

Ich schreib die Tabelle und die Funktionen mal entsprechend um. Kannst ja dann schaun, obs dir gefällt und in Assembler umschreiben :-P

//edit: hab mir den Assembler nochmal genauer angeschaut. Ich werd's da auch mal probiern. Mehr als nicht funktioniern kanns ja nicht :)

Grüße,

Alex

Link to comment
Share on other sites

Hey Thorsten,

ich glaub ich hab grad ne Möglichkeit gefunden, wie man den jump-table los wird und gleichzeitig jeden beliebigen detent-mode ohne zusätzlichen code implementieren kann. -> Speicher gespart, bessere Performance, mehr Flexibilität -> was will man mehr 8)

Also, folgende Ãœberlegung:

Es gibt ja 8 Zustands-Übergänge, die uns interessieren. Ein Char hat bekanntlich 8 Bit. Man könnte die ENC_MODEs also so nutzen, dass jedes Bit angibt, ob bei dem entsprechenden Übergang ein Do_Inc bzw. Do_Dec ausgelöst werden soll. Die ENC_MODEs könnten dann z.B. so aussehen:

Bit            7   6   5   4   3   2   1   0
Ãœbergang      0x8 0xE 0x7 0x1 0x4 0xD 0xB 0x2
---------------------------------------------
NonDetented    1   1   1   1   1   1   1   1    = 0xFF
Detented1      1   0   1   0   1   0   1   0    = 0xAA
Detented2      0   0   1   0   0   0   1   0    = 0x22

Detented4      1   0   1   0   0   1   0   1    = 0xA5 (Pollin-Mode1 :) )
...

Die Übergänge hab ich aus meiner Grafik von oben entnommen und sortiert nach Bit 0-3 = Do_Inc, Bit 4-7 = Do_Dec

Wenn sich einer der Encoder-Pins ändert, muss die Routine also wie bisher nen Enc_State/Übergang zusammenstellen.

dann in nem Lookup-Table dem Übergang nen Wert Enc_State_Nr = 0 bis 7 zuordnen, entsprechend dem Tabellen-Kopf, oder 0xFF, falls es einer der Zustände ist, die nicht interessieren (ok, gibt immer noch nen Table, aber der enthält nur Zahlen).

Falls Enc_State_Nr nicht 0xFF ist:

  Das Bit des ENC_MODEs an der Stelle Enc_State_Nr auf 1 prüfen.

  falls das der Fall ist:

    wenn Enc_State_Nr <= 3, Do_Inc aufrufen, ansonsten Do_Dec

Die Definition der ENC_MODEs am Anfang kann man sich dann auch schenken, da die jetzt (zumindest mit der Grafik) selbstredend sind. Für Änderungen an den Modes brauchts dann nur noch nen Eintrag in cmios.h.

Ich werd das Ganze gleich mal in C implementieren, musste den Gedanken nur ganz schnell irgendwo hin schreiben :P Ich fürchte, für Assembler reichts bei mir noch nicht, aber vielleicht schaff ichs ja teilweise und ne gute Seele hilft mir bestimmt  ;)

Grüße, Alex

P.S.: irgendwie passt das ganze nur noch bedingt ins Topic, eigener Thread?

Link to comment
Share on other sites

Das nenne ich mal eine Innovation! :)

Die Verwendung einer Tabelle wuerde zu mehr Code und einer laengeren Laufzeit fuehren, da TBLPTR[LHU] ja bereits zum Auslesen der Encoder-Tabelle verwendet wird.

Es gibt jedoch eine einfache Methode, um selbst die Jumptable zu umgehen (via Checkbit- und Branch).

Ich werde das gleich mal blind einhacken, und die Aenderung in das Repository stellen - heute noch Lust, die Aenderung auszuprobieren? Dank der speziellen Codierung muss MIOS wohl nur einmal neu aufgeladen werden :)

Gruss, Thorsten.

P.S.: den Thread splitte ich gleich

Link to comment
Share on other sites

Ok, habe die Aenderung eingebaut, nun muesstest Du mal Dein Repository updaten, ein neues MIOS bauen und aufladen.

Geaenderte Files:

mios_enc.inc

macros.h

cmios.h

Unschoen: die Applikationen sind nun nicht mehr binaerkompatibel zur alten MIOS Version - muessen also ebenfalls neu kompiliert werden. :-/

(zum Glueck kein Problem fuer MIOS32, da es direkt in die Applikation gelinkt wird)

Viel Spass beim Testen!

Gruss, Thorsten.

P.S.: hier der geaenderte Code - er sieht zwar etwas laenglich aus, verbraucht jedoch exakt genausoviele Bytes wie die Jumptable zuvor - und wird zudem schneller abgearbeitet und ist dank Deiner Idee mit der speziellen Kodierung des Encoder Typs flexibler!


BRA_IFSET IRQ_TMP4, 3, ACCESS, MIOS_ENC_Do_89ABCDEF
MIOS_ENC_Do_01234567
BRA_IFSET IRQ_TMP4, 2, ACCESS, MIOS_ENC_Do_4567
MIOS_ENC_Do_0123
BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_23
MIOS_ENC_Do_01
;; 0: Do_Nothing
;; 1: Do_Dec
BRA_IFCLR IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 4, ACCESS, MIOS_ENC_Do_Dec
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_23
;; 2: Do_Inc
;; 3: Do_Nothing
BRA_IFSET IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 0, ACCESS, MIOS_ENC_Do_Inc
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_4567
BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_67
MIOS_ENC_Do_45
;; 4: Do_Inc
;; 5: Do_Nothing
BRA_IFSET IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 3, ACCESS, MIOS_ENC_Do_Inc
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_67
;; 6: Do_Nothing
;; 7: Do_Dec
BRA_IFCLR IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 5, ACCESS, MIOS_ENC_Do_Dec
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_89ABCDEF
BRA_IFSET IRQ_TMP4, 2, ACCESS, MIOS_ENC_Do_CDEF
MIOS_ENC_Do_89AB
BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_AB
MIOS_ENC_Do_89
;; 8: Do_Dec
;; 9: Do_Nothing
BRA_IFSET IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 7, ACCESS, MIOS_ENC_Do_Dec
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_AB
;; A: Do_Nothing
;; B: Do_Inc
BRA_IFCLR IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 1, ACCESS, MIOS_ENC_Do_Inc
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_CDEF
BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_EF
MIOS_ENC_Do_CD
;; C: Do_Nothing
;; D: Do_Inc
BRA_IFCLR IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 2, ACCESS, MIOS_ENC_Do_Inc
rgoto MIOS_ENC_Do_Nothing

MIOS_ENC_Do_EF
;; E: Do_Dec
;; F: Do_Nothing
BRA_IFSET IRQ_TMP4, 0, ACCESS, MIOS_ENC_Do_Nothing
BRA_IFSET TABLAT, 6, ACCESS, MIOS_ENC_Do_Dec
;; rgoto MIOS_ENC_Do_Nothing
[/code]

Link to comment
Share on other sites

Haette den Code vorher vielleicht doch nochmal ausprobieren sollen - ich habe ihn nach einer zweiten visuellen Kontrolle abermals geaendert, ihn jedoch nach wie vor nicht getestet - dafuer bist Du ja da ;)

Der Typo: das TABLAT, <bit> war nach IRQ_TMP4, <bit> gerutscht.

Das kommt davon, wenn man am kleinen Notebook Bildschirm tippt...

Gruss, Thorsten.

Link to comment
Share on other sites

jepp, funktioniert perfekt  :D

jetzt fehlt nur noch

#define MIOS_ENC_MODE_DETENTED5 0x5a

in cmios.h, falls bei jemand die rastung in die andere richtung verschoben ist  :P

Soll ich für ucapps.de mal n neues bild mit allen encoder-typen machen, oder die state-machine dokumentieren?

Gruß, Alex

Link to comment
Share on other sites

Waehrenddessen habe ich die Aenderung auch in MIOS32 eingebaut: mios32_enc.c


      if( (enc_state_ptr->state == 0x01 && (enc_type & (1 << 4))) ||
  (enc_state_ptr->state == 0x07 && (enc_type & (1 << 5))) ||
  (enc_state_ptr->state == 0x0e && (enc_type & (1 << 6))) ||
  (enc_state_ptr->state == 0x08 && (enc_type & (1 << 7))) ) {
        // DEC
        ...
      } else if( (enc_state_ptr->state == 0x02 && (enc_type & (1 << 0))) ||
(enc_state_ptr->state == 0x0b && (enc_type & (1 << 1))) ||
(enc_state_ptr->state == 0x0d && (enc_type & (1 << 2))) ||
(enc_state_ptr->state == 0x04 && (enc_type & (1 << 3))) ) {
        // INC
        ...
      }
[/code] Sieht schon wesentlich kompakter aus, und funktionierte deshalb auch auf Anhieb mit meiner MBSEQ V4! :) So sieht uebrigens der vom Compiler generierte ARM Assembler Code aus:
[code]
      if( (enc_state_ptr->state == 0x01 && (enc_type & (1 << 4))) ||
801d56c: f818 2007 ldrb.w r2, [r8, r7]
801d570: f002 030f and.w r3, r2, #15 ; 0xf
801d574: 2b01      cmp r3, #1
801d576: d102      bne.n 801d57e <MIOS32_ENC_UpdateStates+0x9e>
801d578: f014 0f10 tst.w r4, #16 ; 0x10
801d57c: e00d      b.n 801d59a <MIOS32_ENC_UpdateStates+0xba>
801d57e: 2b07      cmp r3, #7
801d580: d102      bne.n 801d588 <MIOS32_ENC_UpdateStates+0xa8>
801d582: f014 0f20 tst.w r4, #32 ; 0x20
801d586: e008      b.n 801d59a <MIOS32_ENC_UpdateStates+0xba>
801d588: 2b0e      cmp r3, #14
801d58a: d102      bne.n 801d592 <MIOS32_ENC_UpdateStates+0xb2>
801d58c: f014 0f40 tst.w r4, #64 ; 0x40
801d590: e003      b.n 801d59a <MIOS32_ENC_UpdateStates+0xba>
801d592: 2b08      cmp r3, #8
801d594: d13b      bne.n 801d60e <MIOS32_ENC_UpdateStates+0x12e>
801d596: f014 0f80 tst.w r4, #128 ; 0x80
801d59a: f000 808a beq.w 801d6b2 <MIOS32_ENC_UpdateStates+0x1d2>
  (enc_state_ptr->state == 0x07 && (enc_type & (1 << 5))) ||
  (enc_state_ptr->state == 0x0e && (enc_type & (1 << 6))) ||
  (enc_state_ptr->state == 0x08 && (enc_type & (1 << 7))) ) {
// DEC

...
      } else if( (enc_state_ptr->state == 0x02 && (enc_type & (1 << 0))) ||
801d60e: 2b02      cmp r3, #2
801d610: d102      bne.n 801d618 <MIOS32_ENC_UpdateStates+0x138>
801d612: f014 0f01 tst.w r4, #1 ; 0x1
801d616: e00d      b.n 801d634 <MIOS32_ENC_UpdateStates+0x154>
801d618: 2b0b      cmp r3, #11
801d61a: d102      bne.n 801d622 <MIOS32_ENC_UpdateStates+0x142>
801d61c: f014 0f02 tst.w r4, #2 ; 0x2
801d620: e008      b.n 801d634 <MIOS32_ENC_UpdateStates+0x154>
801d622: 2b0d      cmp r3, #13
801d624: d102      bne.n 801d62c <MIOS32_ENC_UpdateStates+0x14c>
801d626: f014 0f04 tst.w r4, #4 ; 0x4
801d62a: e003      b.n 801d634 <MIOS32_ENC_UpdateStates+0x154>
801d62c: 2b04      cmp r3, #4
801d62e: d140      bne.n 801d6b2 <MIOS32_ENC_UpdateStates+0x1d2>
801d630: f014 0f08 tst.w r4, #8 ; 0x8
801d634: d03d      beq.n 801d6b2 <MIOS32_ENC_UpdateStates+0x1d2>
(enc_state_ptr->state == 0x0b && (enc_type & (1 << 1))) ||
(enc_state_ptr->state == 0x0d && (enc_type & (1 << 2))) ||
(enc_state_ptr->state == 0x04 && (enc_type & (1 << 3))) ) {

Im Endeffekt benoetigt der Cortex M3 ca. 90 Bytes zur Auswertung, und der PIC 106 Bytes. Hier laesst sich vielleicht noch etwas rausholen, doch dann wird der Code wirklich unlesbar...

Gruss, Thorsten.

Link to comment
Share on other sites

Rabid prototyping hehehe, kein Wunder dass das nicht so tut wie's soll.

Auch diesen Typo habe ich nun gefixed ;)

jepp, funktioniert perfekt  :D

jetzt fehlt nur noch

#define MIOS_ENC_MODE_DETENTED5 0x5a

in cmios.h, falls bei jemand die rastung in die andere richtung verschoben ist  :P

Ok, habe ich in MIOS und MIOS32 nun ebenfalls eingebaut.

Soll ich für ucapps.de mal n neues bild mit allen encoder-typen machen, oder die state-machine dokumentieren?

Das waere nett - das Tolle an Deiner Loesung ist ja u.A, dass sie sich so einfach dokumentieren laesst! :)

Ich werde noch ein wenig warten, bis ich eine neue MIOS Version release - vorher moechte ich mir 100% sicher sein, dass die Aenderung nicht zu neuen Problemen fuehrt. Es ist uebrigens schon abzusehen, dass ein paar Newbies ueber diese Aenderung stolpern werden - bspw. wenn sie eine neu kompilierte Applikation auf einen PIC aufspielen, der von SmashTV mit MIOS V1.9f vorprogrammiert wurde - umso wichtiger, dass alle betroffenen Projekte einen nicht uebersehbaren Hinweis ueber den erforderlichen MIOS Update erhalten.

In MIOS32 ist die Aenderung mit sofortiger Wirkung gueltig ;)

Gruss, Thorsten.

Link to comment
Share on other sites

  • 4 weeks later...

Probier alternativ mal DETENTED5 aus. das ist fast der gleiche modus wie DETENTED4, aber es werden genau die anderen Flanken ausgewertet. wenn das auch nichts hilft, könntest du außerdem noch statt MIOS_ENC_MODE_DETENTEDx direkt 0x66 oder 0x99 ausprobieren.

Sollte also dann so aussehen:

...
MIOS_ENC_PIN_TABLE
        ;; encoders 1-16
        ;;  SR  Pin  Mode
  ENC_ENTRY  4,  0,  0x66
...

Grüße,

Alex

Link to comment
Share on other sites

Hallo,

habe auch das Problem mit den Encoder und war begeistert von der Lösung.

Habe mich aber seit langem nicht mehr mit der Programmierung beschäftigt(bis midibox1,6a).Also erst einmal wieder gelesen ,Hilfsprogramme runtergeladen und..... nichts geht.Die Version midibox 1,6b bekomme ich noch hin.Vielleicht kann ein User mal in Stichpunken das erzeugen einer hex Datei bei der Version midibox 1,6d erklären.Ich sehe schon das Kopfschütteln der meisten User aber ohne Hilfe komme ich nicht weiter.Also habt Gnade mit einem absoluten"Programiertrottel".Danke

Gruß Bernhard

hat sich erledigt.  Bei mir fehlte die" mingw32-make" da kann es ja nicht funktionieren.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...