//--------------------- //ExternalPin-Interrupt //--------------------- in temp, SREG push temp //Laden der Zahlen in divl, TCNT1L in divh, TCNT1H //Reset der Clock clr temp out TCNT1H, temp out TCNT1L, temp //Reseten der LEDS, da ich nun weiß wo ich und die LEDS sind ldi bout, 0x0F clr dout //Ist wirklich der Taster gedrückt? ldi temp, PIND sbrc temp, 7 reti //Schnelle Division //1/2 clc ror divh ror divl //1/4 clc ror divh ror divl //1/8 clc ror divh ror divl //1/16 clc ror divh ror divl mov matchH, divh mov matchL, divl //1/32 clc ror divh ror divl //1/64 clc ror divh ror divl add matchH, divh add matchL, divl //1/128 clc ror divh ror divl add matchH, divh add matchL, divl // 1/16 + 1/64 + 1/128 = 11/128 = 1/11,6 //Ausgabe out OCR1AH, matchH out OCR1AL, matchL ; Div8 dividiert eine 16-Bit-Zahl durch eine 8-Bit-Zahl ; Test: 16-Bit-Zahl: 0xAAAA, 8-Bit-Zahl: 0x55 ; Registers /* divl .DEF rd1l = R19 ; LSB Divident divh .DEF rd1h = R20 ; MSB Divident xbit .DEF rd1u = R23 ; Hifsregister divo .DEF rd2 = R22 ; Divisor maco .DEF rel = R26 ; LSB Ergebnis mata .DEF reh = R21 ; MSB Ergebnis temp .DEF rmp = r16 ; Hilfsregister zum Laden .def divo = r26 //Register zum Speichern der Divison (12) //Dividieren von rd1h:rd1l durch rd2 div8: clr xbit //Leere Hilfsregister clr matchL //Leere Ergebnisregister clr matchH //(Ergebnisregister dient auch als inc matchH //Zähler bis 16! Bit 1 auf 1 setzen) ldi divo, 12 //Hier beginnt die Divisionsschleife div8a: clc //Carry-Bit leeren rol divl //nächsthöheres Bit des Dividenten rol divh //in das Hilfsregister rotieren rol xbit //(entspricht Multipliklation mit 2) brcs div8b //Eine 1 ist herausgerollt, ziehe ab cp xbit,divo //Divisionsergebnis 1 oder 0? brcs div8c //Überspringe Subtraktion, wenn kleiner div8b: sub xbit,divo //Subtrahiere Divisor sec //Setze carry-bit, Ergebnis ist eine 1 rjmp div8d //zum Schieben des Ergebnisses div8c: clc //Lösche carry-bit, Ergebnis ist eine 0 div8d: rol matchL //Rotiere carry-bit in das Ergebnis rol matchH brcc div8a //solange Nullen aus dem Ergebnis //rotieren: weitermachen //Ende der Division erreicht out OCR1AH, matchH out OCR1AL, matchL */ ldi temp, 0xC0 //Aktivierung von Compare-Match-A (1) und Beibehalten des Overflow-Interrupts (2) out TIMSK, temp pop temp out SREG, temp