drehencoder in c mit avr

Gast #1262977
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.
Persönliche Seite #1263427
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...
#1263909
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren