Gast
#1626634
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