drehencoder in c mit avr

Gast #1262977
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
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
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...
Gast
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
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
>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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.