パルスを打ち込む部分
motion.cpp
int32_t PrintLine::bresenhamStep());// Version for delta printer
Queueに入ってるデータ分を打ち込む
割り込み部分
HAL.cpp
ISR(TIMER1_COMPA_vect) { if(insideTimer1) return; uint8_t doExit; __asm__ __volatile__ ( "ldi %[ex],0 \n\t" "lds r23,stepperWait+2 \n\t" "tst r23 \n\t" //if(stepperWait<65536) { "brne else%= \n\t" // Still > 65535 "lds r23,stepperWait+1 \n\t" "tst r23 \n\t" "brne last%= \n\t" // Still not 0, go ahead "lds r22,stepperWait \n\t" "breq end%= \n\t" // stepperWait is 0, do your work "last%=: \n\t" "sts %[ocr]+1,r23 \n\t" // OCR1A = stepper wait; "sts %[ocr],r22 \n\t" "sts stepperWait,r1 \n\t" "sts stepperWait+1,r1 \n\t" "rjmp end1%= \n\t" "else%=: lds r22,stepperWait+1 \n\t" //} else { stepperWait = stepperWait-32768; "subi r22, 0x80 \n\t" "sbci r23, 0x00 \n\t" "sts stepperWait+1,r22 \n\t" // ocr1a stays 32768 "sts stepperWait+2,r23 \n\t" "end1%=: ldi %[ex],1 \n\t" "end%=: \n\t" :[ex]"=&d"(doExit):[ocr]"i" (_SFR_MEM_ADDR(OCR1A)):"r22","r23" ); if(doExit) return; insideTimer1 = 1; OCR1A = 61000; if(PrintLine::hasLines()) { setTimer(PrintLine::bresenhamStep()); } else if(FEATURE_BABYSTEPPING && Printer::zBabystepsMissing) { Printer::zBabystep(); setTimer(Printer::interval); } else { if(waitRelax == 0) { #if USE_ADVANCE if(Printer::advanceStepsSet) { Printer::extruderStepsNeeded -= Printer::advanceStepsSet; #if ENABLE_QUADRATIC_ADVANCE Printer::advanceExecuted = 0; #endif Printer::advanceStepsSet = 0; } #endif #if USE_ADVANCE if(!Printer::extruderStepsNeeded) if(DISABLE_E) Extruder::disableCurrentExtruderMotor(); #else if(DISABLE_E) Extruder::disableCurrentExtruderMotor(); #endif } else waitRelax--; stepperWait = 0; // Importent becaus of optimization in asm at begin OCR1A = 65500; // Wait for next move } DEBUG_MEMORY; insideTimer1 = 0; }
_SFR_MEM_ADDR(OCR1A) : I/OレジスタであるOCR1Aに対して、メモリ空間からのアクセスを行なう(他にはI/O空間からのアクセスがある)
ldi "=&d"(doExit),0 lds r23,stepperWait+2 tst r23 ;;if(stepperWait<65536) { brne else ;; Still > 65535 lds r23,stepperWait+1 tst r23 brne last ;; Still not 0, go ahead lds r22,stepperWait breq end ;; stepperWait is 0, do your work last: sts "i" (_SFR_MEM_ADDR(OCR1A))+1,r23 ;; OCR1A = stepper wait; sts "i" (_SFR_MEM_ADDR(OCR1A)),r22 sts stepperWait,r1 sts stepperWait+1,r1 rjmp end1 else: lds r22,stepperWait+1 ;;} else { stepperWait = stepperWait-32768; subi r22, 0x80 sbci r23, 0x00 sts stepperWait+1,r22 ;; ocr1a stays 32768 sts stepperWait+2,r23 end1: ldi "=&d"(doExit),1 end: