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.
Gast #1263026
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
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
Gast #1263923
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

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