パルスを打ち込む部分
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: