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
> 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
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
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
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.