Forum: Mikrocontroller und Digitale Elektronik Geht das noch schneller (einfacher) ?


von Gerhard (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von spess53 (Gast)


Lesenswert?

Hi

>ANDI r18,&b00001100                     'pin2+3 isolieren
>cpi r18,&b000000000                     'r18 mit 0 vergleichen

Das 'cpi r18,0' kann entfallen. Das Zero-Flag wird schon durch 'andi' 
gesetzt/gelöscht.

MfG Spess

von Gerhard (Gast)


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

von Falk B. (falk)


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

von Gerhard (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.