Pollin-Drehgeber mit AVR pollen

Gast #828709
Lesenswert?

Huhu schon wieder...

Ich weiß, dass es dieses Thema schon zig-mal hier gab, weshalb ich auch 
bereits allerhand verschiedene Methoden und Quelltext-Schnipsel 
durchprobiert hab, aber irgendwie hinkt das alles noch. Hier mein 
aktueller Versuch, dashier 
(http://www.mikrocontroller.net/attachment/highlight/22223) in Assembler 
umzusetzen.

Hardware: Pollin-Drehgeber, mit Pull-*down* (!) angeschlossen.

Software:
In TMPI2 befindet sich der Wert des PIN-Registers, an welchem der 
Drehgeber angeschlossen ist (PINx3 und PINx4, siehe Bitmaske). In 
(dseg_encoder+[0..1]) finden zwei Bytes für alter_status (Byte 0) und 
step (Byte 1) Platz (siehe C-Quelltext).

Im RAM bei dseg_buttons liegt ein "Interruptregister", welches vom 
Hauptprogramm regelmäßig gepollt wird.


Hier der Original-C-Quelltext:
1
{
2
  static unsigned char alter_status = 0,step = 0;
3
  unsigned char        neuer_status;
4

5
      neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B));
6
  if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
7
  {
8
    if ((neuer_status ^ alter_status)==_BV(Schalter_A))
9
      richtung +=1;                  // Es war nach rechts
10
    else
11
      richtung -=1;                  // Es war nach links
12
    step = neuer_status;
13
  }
14
  alter_status = neuer_status;
15
}




Und hier gemischt mit meinem ASM-Versuch:

; Bits maskieren:
> neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B));
  andi     TMPI2, 0b00011000

; step laden und ver-xodern, dann mit Bitmaske vergleichen:
> if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
  lds      TMPI1, (dseg_encoder+1)
  eor      TMPI1, TMPI2
  cpi      TMPI1, 0b00011000
  brne     t0_ovf_vec_noenc
> {

; Interruptregister laden
  lds        YL, dseg_buttons
; BT_ROT-Flag setzen; BR_DIR auf 1 (eine Richtung)
  sbr        YL, (1<<BT_DIR)|(1<<BT_ROT)

; alter_status laden, ver-xodern und mit einem Bit vergleichen:
> if ((neuer_status ^ alter_status)==_BV(Schalter_A))
  lds      TMPI1, (dseg_encoder+0)
  eor        TMPI1, TMPI2
  cpi        TMPI1, 0b00001000
  brne      t0_ovf_vec_dir
> {

; Richtung ändern (BT_DIR auf 0, andere Richtung eben)
  cbr        YL, (1<<BT_DIR)

> }
t0_ovf_vec_dir:
; Interruptregister speichern
  sts        dseg_buttons, YL

> step = neuer_status;
  sts        (dseg_encoder+1), TMPI2

> }
t0_ovf_vec_noenc:
> alter_status = neuer_status;
  sts        (dseg_encoder+0), TMPI2


Würd mich freuen, wenn da jemand eine Idee hätte, was hier schief läuft 
-.-

Danke für Antworten schonmal und viele Grüße,
Haku
Moderator Persönliche Seite #828713
Lesenswert?

Einen C-Compiler nehmen und ihn das übersetzen lassen?

Das hier bekomme ich, wenn ich den originalen Quelltext für einen
ATtiny2313 compiliere:
1
        in r25,48-0x20
2
        andi r25,lo8(3)
3
        lds r24,step.1508
4
        eor r24,r25
5
        cpi r24,lo8(3)
6
        brne .L2
7
        lds r24,alter_status.1507
8
        eor r24,r25
9
        cpi r24,lo8(2)
10
        brne .L4
11
        lds r24,richtung
12
        subi r24,lo8(-(1))
13
        rjmp .L8
14
.L4:
15
        lds r24,richtung
16
        subi r24,lo8(-(-1))
17
.L8:
18
        sts richtung,r24
19
        sts step.1508,r25
20
.L2:
21
        sts alter_status.1507,r25
Gast #828843
Lesenswert?

Vergesst den Quelltext... der is sauber und einwandfrei^^

Ich Schussel hab den Pollin-Drehgeber schön auf Streifenraster gelötet, 
dann noch fein säuberlich ein Loch reingebort für diesen Plastikstutzen 
(genau in der Mitte, quasi andres Ende der Welle), dabei auch fein 
säuberlich die Leiterbahn mittendurch durchbohrt, welche den Gegenpol 
für die beiden Codeausgänge geführt hat.

Sagt jetzt bitte nix.
Guckt lieber mal auf http://e.svgweb.de/new , ist zwar noch Baustelle, 
aber ein Video und ein paar Photos meines... "Projekts" sind schon da.

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