Geht das noch schneller (einfacher) ?

Gast #1626634
Lesenswert?

Hallo Leute,

bin gerade am Code-Tuning meiner Servomotorsteuerung.
Unten angeführt der Code des INT0 Interrupt's.
Dies entspricht einer Spur des Encoders.
Es wird abgefragt ob PIND.2 und PIND.3 gleichen Pegel haben.
Also 00 oder 11. Wenn ja, wird zum Registerpaar R29:R28 1 addiert,
wenn nicht wird 1 abgezogen. (4-fach Auswertung)
Gibt es dafür eine kürzere, elegantere Lösung ?

Codeschnipsel ist in "Bascom-Assembler"

Encoder1:                               'Encoder_1
$asm
PUSH R18                                'register sichern
PUSH R8                                 'register sichern
in r8,SREG                              'statusregister in r8 laden
in r18, pind                            'portd in r18 laden
ANDI r18,&b00001100                     'pin2+3 isolieren
cpi r18,&b000000000                     'r18 mit 0 vergleichen
breq plus_1                             'wenn 0 dann springe
cpi r18,&b00001100                      'r18 mit 12 vergleichen
breq plus_1                             'wenn 12 dann springe
SBIW R28:R29,2                          'subtrahiere 2 vom IST_WERT
Plus_1:                                 'Einsprungmarke
ADIW R28:R29,1                          'addiere 1 zum IST_WERT
Out Sreg , R8                           'statusregister wiederherstellen
pop r8                                  'register wiederherstellen
pop r18                                 'register wiederherstellen
$end Asm
Return


MfG Gerhard
Moderator (Firma: Titel) Persönliche Seite #1626681
Lesenswert?

> Dies entspricht einer Spur des Encoders. ...(4-fach Auswertung)
Da fehlen mir für eine 4-fach-Auswertung noch irgendwie die anderen 
beiden Flanken von der anderen Spur...

> Unten angeführt der Code des INT0 Interrupt's.
Wer löst den Interrupt aus? Pegel, Flanke, Pinchange?

> Gibt es dafür eine kürzere, elegantere Lösung ?
Timer-Interrupt und die Routinen aus Drehgeber
Gast #1626816
Lesenswert?

Hallo,

danke für die ersten Antworten

>Da fehlen mir für eine 4-fach-Auswertung noch irgendwie die anderen
beiden Flanken von der anderen Spur...

Die Auswertung der 2. Spur ist identisch zur 1., ausser umgekehrter 
Zählrichtung

>Wer löst den Interrupt aus? Pegel, Flanke, Pinchange?

jede steigende und fallende Flanke an Int0 und Int1
Mcucr = &B00000101

Mit Timerinterrupt hab ich schon Tests gemacht. Waren nicht 
zufriedenstellend. Pegelwechsel verschlafen usw....
Werd ich ev. nochmal ausgraben um hier Verbesserungen zu machen
(Ich verwende Motoren mit 10000er Encoder)

@spess
Thx , hab's soeben rausgeschmissen , läuft noch... :)

Gruss Gerhard
#1626893
Lesenswert?

@Gerhard (Gast)

>>Wer löst den Interrupt aus? Pegel, Flanke, Pinchange?

>jede steigende und fallende Flanke an Int0 und Int1
>Mcucr = &B00000101

MÖÖÖÖÖP! Fehler!
Siehe Drehgeber.

>Mit Timerinterrupt hab ich schon Tests gemacht. Waren nicht
>zufriedenstellend. Pegelwechsel verschlafen usw....

Denkst du das wird jetzt besser?

MfG
Falk
Gast #1627177
Lesenswert?

Hallo ,

natürlich hab ich mir diese Seite schon x-mal durchgelesen.
Ist auch alles einleuchtend.
In der Praxis (...in meinem Falle) hat sich die Methode mit den
Int's bisher besser bewährt. Sind auch sehr hochwertige Drehgeber die
ich verwende.
Werd aber die "Timervariante" nochmals ausgraben.

Gruß Gerhard

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