Hallo
ich habe einen At90Can128 und programmiere in C mit AVRStudio.
ich habe einen Drehimpulsgeber 427, den ich zyklisch per Timer abfrage.
den Code hab ich auch im Netz entdeckt, er läuft auch zuverlässig, nur
brauche ich bei einer RECHTSDREHUNG immer 2 Klicks ("Drehklicks"). Bei
einer Linksdrehung jedoch funktioniert es einwandfrei.
Dabei kann es sich doch sicher nur um ein kleines Problem handeln?
Hier wäre noch mein verwendeter CODE:
1 | // ********************************** Drehimpulsgeber ***********************************
|
2 | ISR(TIMER2_OVF_vect)
|
3 | {
|
4 | static unsigned char alter_status = 0,step = 0;
|
5 | unsigned char neuer_status;
|
6 |
|
7 | speed++;
|
8 |
|
9 | neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B)); // Änderung einlesen
|
10 | if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
|
11 | {
|
12 |
|
13 | if (zahler<2)
|
14 | {
|
15 | // if(speed>80)
|
16 | // {s=1;}
|
17 | if(speed>150) //bei Vorteiler = 128: 150
|
18 | {s=10;}
|
19 | else if(speed>20) //bei Vorteiler = 128: 20
|
20 | {s=100;}
|
21 | }
|
22 | else s=1;
|
23 |
|
24 | speed=0; //Geschwindigkeitszähler zurücksetzen (zählt von 0 bis 18.446.744.073.709.551.615)
|
25 |
|
26 |
|
27 | if ((neuer_status ^ alter_status)==_BV(Schalter_A))
|
28 | {richtung_enc += s; // Es war nach rechts
|
29 | drehung=1;
|
30 | }
|
31 | else if ((neuer_status ^ alter_status)==_BV(Schalter_B))
|
32 | {richtung_enc -= s; // Es war nach links
|
33 |
|
34 | if(richtung_enc>65000)
|
35 | {richtung_enc=0;}
|
36 |
|
37 | step = neuer_status;
|
38 | drehung=1;
|
39 | }
|
40 | }
|
41 |
|
42 | alter_status = neuer_status;
|
43 |
|
44 | }
|
45 | // **************************************************************************************
|
Danke für jede Hilfe!!!
Martin