Hallo
Ich kann es natürlich nicht testen:
Ich hoffe, ich habe es ungefähr getroffen. Der Motor dreht dauerhaft in Richtung der letzten Geberdrehung, der Zähler wird bei jedem Geberimpuls geändert (mit Nulldurchgang).Code:#define AVRGCC #include <avr/io.h> //#include <compiler.h> /** PD2 Spur A PD3 Spur B PB0 links PB1 rechts 1 2 3 4 A 0 1 1 0 B 0 0 1 1 **/ #define Links1 PORTB = (PORTB | (1<<PB0)) #define Links0 PORTB = ~(~PORTB | (1<<PB0)) #define Rechts1 PORTB = (PORTB | (1<<PB1)) #define Rechts0 PORTB = ~(~PORTB | (1<<PB1)) #define SpurA ((PIND & 0b00000100) == 0) #define SpurB ((PIND & 0b00001000) == 0) char spura_akt, spura_old, spurb_akt, spurb_old, count=0, dir=0; int main(void) { Rechts0; Links0; spura_akt=spura_old=SpurA; spurb_akt=spurb_old=SpurB; while(1) { do // warten bis Bitwechsel erkannt wird { spura_akt=SpurA; spurb_akt=SpurB; }while((spura_akt==spura_old) && (spurb_akt==spurb_old)); if(spura_akt==spura_old) // Bitwechsel war bei Spur B { if(spura_akt) { if(spurb_akt) dir=1; else dir=0; // dir==1 ist rechts/aufsteigend } else { if(spurb_akt) dir=0; else dir=1; } } else // Bitwechsel war bei Spur A { if(spurb_akt) { if(spura_akt) dir=0; else dir=1; } else { if(spura_akt) dir=1; else dir=0; } } spura_old=spura_akt; spurb_old=spurb_akt; if(dir) { Rechts1; Links0; if(count<31) count++; else count=0; } else { Rechts0; Links1; if(count>0) count--; else count=31; } } return(0); }
Gruß
mic
[Edit]Ähm, irgendwie verstehe ich gar nicht was du eigentlich bezwecken möchtest. Wie soll denn die Drehbewegung des Geber nach Ausgang Links-Rechts verteilt werden? Mit einer Anzeige könntest du den Zähler verfolgen und kontrollieren ob alle Geberimpulse erkannt werden/ ob der Nulldurchgang immer an der selben Stelle auftritt.







Zitieren

Lesezeichen