Forum: Mikrocontroller und Digitale Elektronik drehencoder in c mit avr


von sam (Gast)


Lesenswert?

ich habe mir mal gedanken zu dem panasonic-drehencoder von pollin 
gemacht und hier etwas gefunden, dass den (nicht so einwandfrei 
gefertigten) Encoder zuverlässig abfragt. damit entfällt auch entprellen 
etc. ... ob man nun dauernd oder per timer pollt ist auch egal.
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <inttypes.h>
4
5
volatile uint8_t t,x;
6
7
uint8_t getA()
8
{ if (PIND & (1<<PD2)) return 1;  else return 0;}
9
uint8_t getB()
10
{ if (PIND & (1<<PD3)) return 1;  else return 0;}
11
12
SIGNAL(SIG_OUTPUT_COMPARE1A)
13
{  
14
  uint8_t a,b;
15
  a=getA();
16
  b=getB();
17
  switch (t)
18
  {
19
    case 0:
20
      if(!(a^b))
21
      {
22
        x=0|(a)|(b<<1);
23
        t++;
24
      }
25
      break;
26
    case 1:
27
      if((a^b))
28
      {
29
        x|=(a<<2)|(b<<3);
30
        t++;
31
      }
32
    break;
33
    case 2:
34
      if(!(a^b))
35
      {
36
        x|=(a<<4)|(b<<5);
37
        t=0;
38
        switch (x)
39
        {
40
          case 0b00111000:
41
          case 0b00000111:
42
            // hier etwas, das in einer richtung passieren soll
43
            break;
44
          case 0b00110100:
45
          case 0b00001011:
46
            // hier etwas, das in der anderen richtung passieren soll
47
            break;
48
        }
49
    }
50
    break;
51
  }
52
}
53
int main()
54
{
55
  t=0;  x=0;
56
  DDRD = 0x00;  PORTD= 0xFF;
57
  TIMSK |= (1 << OCIE0A);  OCR0A=0xF0;  TCNT0=0x00;  TCCR0B=0b00000011;
58
  //timer kann auch anders eingestellt werden
59
  sei();
60
  while (1)
61
  {
62
    __asm__ volatile("nop");
63
  }
64
}

ich hoffe ich habe beim einfügen hier keine fehler gemacht.

von Oliver (Gast)


Lesenswert?

Ist das erprobt und besser als Encode.c aus
Beitrag "Drehgeber auslesen"

???

Oliver

von sam (Gast)


Lesenswert?

besser ist natürlich ansichtsache ....
und ein fehler hat sich eingeschlichen
SIGNAL(SIG_OUTPUT_COMPARE1A)

muss natürlich der vom timer 0 sein:
SIGNAL(SIG_OUTPUT_COMPARE0A)

erprobt hab ich das ... und es treten keine fehlzählungen auf

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

sam schrieb:
> besser ist natürlich ansichtsache ....

Nur mal so als Randnotiz:

"Gut" macht sich daran fest

-- wie gut eder Code nachvollziehbar ist, also auch daran
-- wie gut er dokumentiert ist
-- wie allgemeingültig er ist
-- wie effizient er ist
-- wie elegent er ist

Mal ehrlich: mit obigem Code gewinnst du in keiner dieser Kategorien 
einen Blumentopf.

Johann

p.s.:

Bisher konnte ich auch noch nicht erraten füe welchen µC aus dem AVR-Zoo 
das compilerbar ist...

von gast (Gast)


Lesenswert?

dann würde ich agen ...

nix vorkauen lassen . sondern selbst diesen code so anpassen das man ihn 
verwenden kann

dann isses egal mit welcher software auf welchem target auch immer

von Peter D. (peda)


Lesenswert?

sam schrieb:
> ich habe mir mal gedanken zu dem panasonic-drehencoder von pollin
> gemacht und hier etwas gefunden, dass den (nicht so einwandfrei
> gefertigten) Encoder zuverlässig abfragt.

Es wäre durchaus begrüßenswert, wenn Du den Code nicht so extrem sparsam 
kommentiert hättest.
Hast Du denn wenigstens nen Ablaufplan oder sonst eine irgendwie 
geartete Funktionsbeschreibung?

Wie hast Du diesen Code ohne Plan überhaupt entwickelt, d.h. welche Idee 
steckt dahinter?

Hast Du irgendwelche Anhaltspunkte, daß er besser funktioniert, als 
bekannte deutlich weniger aufwendigere Lösungen?


Es wirk jedenfalls nicht besonders elegant, wenn man nen Code ohne 
erklärende Worte einfach so dahinschmeißt.


Peter

von Oliver (Gast)


Lesenswert?

>Wie hast Du diesen Code ohne Plan überhaupt entwickelt,

Vermutlich gar nicht.

Die Aussage
>...und hier etwas gefunden,

lese ich wörtlich so, daß das von einem unbekannten Autor stammt, nicht 
von sam. Die etwas antiquierten SIG()-ISR's deuten auch darauf hin, daß 
das alles schon älter ist.

Oliver

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.