mikrocontroller.net

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


Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gerhard (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.