avogra Posted September 13, 2009 Report Share Posted September 13, 2009 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 ausAuswertung: 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: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_DETENTED4positiver incrementer für Übergang 2 und D, negativer für Übergang 8 und 7MIOS_ENC_MODE_DETENTED5positiver incrementer für Übergang B und 4, negativer für Übergang E und 1BTW, mit is grad MIOS_ENC_MODE_DETENTED3 in mios_enc_table.inc aufgefallen. was macht denn der?Grüße,Alex Quote Link to comment Share on other sites More sharing options...
TK. Posted September 13, 2009 Report Share Posted September 13, 2009 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.cGruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
avogra Posted September 13, 2009 Author Report Share Posted September 13, 2009 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 Quote Link to comment Share on other sites More sharing options...
rosch Posted September 14, 2009 Report Share Posted September 14, 2009 cool, dass du dir die arbeit machst, die panasonic encoder einzubinden! Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 na wenn ich kein geld für neue ausgeben will, bleibt mir wohl kaum was anderes übrig :Pich 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 Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 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 0xc3MIOS_ENC_MODE_DETENTED3 EQU 0xc4[/code]dann koennte man einfach nach einer positiven Ueberpruefung des 7ten Bits zur alternativen Tabelle verzweigen.Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 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 Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 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_DecWenn 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_DecDie 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, AlexP.S.: irgendwie passt das ganze nur noch bedingt ins Topic, eigener Thread? Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 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 Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 Ok, habe die Aenderung eingebaut, nun muesstest Du mal Dein Repository updaten, ein neues MIOS bauen und aufladen.Geaenderte Files:mios_enc.incmacros.hcmios.hUnschoen: 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_89ABCDEFMIOS_ENC_Do_01234567 BRA_IFSET IRQ_TMP4, 2, ACCESS, MIOS_ENC_Do_4567MIOS_ENC_Do_0123 BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_23MIOS_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_NothingMIOS_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_NothingMIOS_ENC_Do_4567 BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_67MIOS_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_NothingMIOS_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_NothingMIOS_ENC_Do_89ABCDEF BRA_IFSET IRQ_TMP4, 2, ACCESS, MIOS_ENC_Do_CDEFMIOS_ENC_Do_89AB BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_ABMIOS_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_NothingMIOS_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_NothingMIOS_ENC_Do_CDEF BRA_IFSET IRQ_TMP4, 1, ACCESS, MIOS_ENC_Do_EFMIOS_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_NothingMIOS_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] Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 P.P.S.: Du musst nochmal updaten, da war noch ein Schreibfehler... Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 hui, das ging ja schneller als ich für den post gebraucht hab ^^ in c funktionierts bei mir. dann werd ich gleich mal testen. Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 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. Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 Habe die Aenderung nun an meiner MBSID (DETENTED2) gestestet, und einen weiteren Tippfehler gefunden.Nun funktioniert es!Es zeigt sich mal wieder, wie fehleranfaellig Assemblercode beim RabidRapid Prototyping ist...Gruss, Thorsten. Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 wollt, grad posten, dass er state nr. 7 / 0x08 nicht erkennt -.- Quote Link to comment Share on other sites More sharing options...
nILS Posted September 14, 2009 Report Share Posted September 14, 2009 Rabid prototyping hehehe, kein Wunder dass das nicht so tut wie's soll. Vielleicht ein bisschen mehr rapid und dafür mit weniger Tollwut :-)Schönes Ding ihr zwei! Quote Link to comment Share on other sites More sharing options...
avogra Posted September 14, 2009 Author Report Share Posted September 14, 2009 jepp, funktioniert perfekt :Djetzt fehlt nur noch#define MIOS_ENC_MODE_DETENTED5 0x5ain cmios.h, falls bei jemand die rastung in die andere richtung verschoben ist :PSoll ich für ucapps.de mal n neues bild mit allen encoder-typen machen, oder die state-machine dokumentieren?Gruß, Alex Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 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. Quote Link to comment Share on other sites More sharing options...
TK. Posted September 14, 2009 Report Share Posted September 14, 2009 Rabid prototyping hehehe, kein Wunder dass das nicht so tut wie's soll.Auch diesen Typo habe ich nun gefixed ;)jepp, funktioniert perfekt :Djetzt fehlt nur noch#define MIOS_ENC_MODE_DETENTED5 0x5ain cmios.h, falls bei jemand die rastung in die andere richtung verschoben ist :POk, 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. Quote Link to comment Share on other sites More sharing options...
lemonhorse Posted September 15, 2009 Report Share Posted September 15, 2009 (Begeisterung!) :D Quote Link to comment Share on other sites More sharing options...
sneakthief Posted October 11, 2009 Report Share Posted October 11, 2009 Ich habe ein paar Pollin-Encoder und habe mit Mios 1.9g MIOS_ENC_MODE_DETENTED4 gerade probiert - es gibt noch Stellungen, wo es wackelt ...ich benutze Clockbox Simple v1c. Vlt. kann es sein, dass ich meine Encoders beim Löten beschädigt habe? Quote Link to comment Share on other sites More sharing options...
lemonhorse Posted October 11, 2009 Report Share Posted October 11, 2009 Bei mir wurden durch das Update auf MIOS 1.9g und MBSEQ V2.4f die früheren "Überspünge" der Polin Encoder beseitigt (soweit ich das bisher prüfen konnte). Quote Link to comment Share on other sites More sharing options...
avogra Posted October 11, 2009 Author Report Share Posted October 11, 2009 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 Quote Link to comment Share on other sites More sharing options...
sneakthief Posted October 12, 2009 Report Share Posted October 12, 2009 DETENTED5 funktioniert ganz perfekt :) Super!!! vielen vielen Dank. ich befürchtete, dass ich neue Encoders in meinem 'Sneaquencer' aufzubauen musste ( http://sneak-thief.com/sneakyseq.html ) Quote Link to comment Share on other sites More sharing options...
km2301 Posted October 19, 2009 Report Share Posted October 19, 2009 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".DankeGruß Bernhardhat sich erledigt. Bei mir fehlte die" mingw32-make" da kann es ja nicht funktionieren. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.