📄 hardware.c
字号:
/* get Compare Mode */ if(ISFLAG(COM1A0_FLAG)) if(get_flag(COM1A0_FLAG)) coma|=1<<0; if(ISFLAG(COM1A1_FLAG)) if(get_flag(COM1A1_FLAG)) coma|=1<<1; if(ISFLAG(COM1B0_FLAG)) if(get_flag(COM1B0_FLAG)) comb|=1<<0; if(ISFLAG(COM1B1_FLAG)) if(get_flag(COM1B1_FLAG)) comb|=1<<1; if(ISFLAG(COM1C0_FLAG)) if(get_flag(COM1C0_FLAG)) comc|=1<<0; if(ISFLAG(COM1C1_FLAG)) if(get_flag(COM1C1_FLAG)) comc|=1<<1; switch(pwm_mode){ case 4: /* CTC, OCR1A */ set_icr1(); if(prescaler_changed) if(port==get_port16(OCR1AL,OCR1AH)) {clear_tcnt=1;set_flag(OCF1A_FLAG);} goto normal_mode; case 12: /* CTC, ICR1 */ if(prescaler_changed) if(port==get_port16(ICR1L,ICR1H)) {clear_tcnt=1;set_flag(ICF1_FLAG);} goto normal_mode; case 0: /* Normal mode */ set_icr1(); normal_mode: add=1; /* Updating Compare Registers */ ocr1a=get_port16(OCR1AL,OCR1AH); if(ISPORT(OCR1BL)) ocr1b=get_port16(OCR1BL,OCR1BH); if(ISPORT(OCR1CL)) ocr1c=get_port16(OCR1CL,OCR1CH); if(prescaler_changed) { if(max) set_flag(TOV1_FLAG); /* Compare A*/ if(port==ocr1a) {set_flag(OCF1A_FLAG);compare_set_pin(coma,OC1A_PIN);} /* Compare B */ if(ISPORT(OCR1BL)) if(port==ocr1b) {set_flag(OCF1B_FLAG);compare_set_pin(comb,OC1B_PIN);} /* Compare C */ if(ISPORT(OCR1CL)) if(port==ocr1c) {set_flag(OCF1C_FLAG);compare_set_pin(comc,OC1C_PIN);} } else { if(ISFLAG(FOC1A_FLAG)) if(get_flag(FOC1A_FLAG)) {clear_flag(FOC1A_FLAG);compare_set_pin(coma,OC1A_PIN);} if(ISFLAG(FOC1B_FLAG)) if(get_flag(FOC1B_FLAG)) {clear_flag(FOC1B_FLAG);compare_set_pin(comb,OC1B_PIN);} if(ISFLAG(FOC1C_FLAG)) if(get_flag(FOC1C_FLAG)) {clear_flag(FOC1C_FLAG);compare_set_pin(comc,OC1C_PIN);} } break; case 10: /* PWM, Phase Correct, ICR */ if(!prescaler_changed) break; if((top=(port==get_port16(ICR1L,ICR1H)))) set_flag(ICF1_FLAG); goto phase_correct_2; case 11: /* PWM, Phase Correct, OCR */ set_icr1(); if(!prescaler_changed) break; if((top=(port==ocr1a))) set_flag(OCF1A_FLAG); phase_correct_2: /* Compare A */ if(port==ocr1a) if(coma==1) {if(get_pin(OC1A_PIN)) clear_pin(OC1A_PIN); else set_pin(OC1A_PIN);} goto phase_correct; case 1: /* PWM, Phase Correct, 8-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0xFF); goto phase_correct; case 2: /* PWM, Phase Correct, 9-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0x1FF); goto phase_correct; case 3: /* PWM, Phase Correct, 10-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0x3FF); phase_correct: if(bottom) {set_flag(TOV1_FLAG);add=1;} if(top) { add=-1; /* Updating Compare Registers */ ocr1a=get_port16(OCR1AL,OCR1AH); if(ISPORT(OCR1BL)) ocr1b=get_port16(OCR1BL,OCR1BH); if(ISPORT(OCR1CL)) ocr1c=get_port16(OCR1CL,OCR1CH); } /* Compare A*/ if(port==ocr1a) {set_flag(OCF1A_FLAG);pwm_compare_set_pin(coma,OC1A_PIN,add);} /* Compare B */ if(ISPORT(OCR1BL)) if(port==ocr1b) {set_flag(OCF1B_FLAG);pwm_compare_set_pin(comb,OC1B_PIN,add);} /* Compare C */ if(ISPORT(OCR1CL)) if(port==ocr1c) {set_flag(OCF1C_FLAG);pwm_compare_set_pin(comc,OC1C_PIN,add);} break; case 5: /* Fast PWM, 8-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0xFF); goto fpwm_mode; case 6: /* Fast PWM, 9-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0x1FF); goto fpwm_mode; case 7: /* Fast PWM, 10-bit */ set_icr1(); if(!prescaler_changed) break; top=(port==0x3FF); fpwm_mode: if(top) { set_flag(TOV1_FLAG); fpwm_compare_top_set_pin(coma,OC1A_PIN); fpwm_compare_top_set_pin(comb,OC1B_PIN); fpwm_compare_top_set_pin(comc,OC1C_PIN); ocr1a=get_port16(OCR1AL,OCR1AH); if(ISPORT(OCR1BL)) ocr1b=get_port16(OCR1BL,OCR1BH); if(ISPORT(OCR1CL)) ocr1c=get_port16(OCR1CL,OCR1CH); clear_tcnt=1; } /* Compare A*/ if(port==ocr1a) {set_flag(OCF1A_FLAG);fpwm_compare_match_set_pin(coma,OC1A_PIN);} /* Compare B */ if(ISPORT(OCR1BL)) if(port==ocr1b) {set_flag(OCF1B_FLAG);fpwm_compare_match_set_pin(comb,OC1B_PIN);} /* Compare C */ if(ISPORT(OCR1CL)) if(port==ocr1c) {set_flag(OCF1C_FLAG);fpwm_compare_match_set_pin(comc,OC1C_PIN);} break; case 8: /* PWM, Phase and Frequency Correct, ICR */ if(!prescaler_changed) break; if((top=(port==get_port16(ICR1L,ICR1H)))) set_flag(ICF1_FLAG); goto phase_fre_correct; case 9: /* PWM, Phase and Frequency Correct, OCR */ set_icr1(); if(!prescaler_changed) break; if((top=(port==ocr1a))) set_flag(OCF1A_FLAG); phase_fre_correct: if(top) add=-1; if(bottom) { add=1;set_flag(TOV1_FLAG); ocr1a=get_port16(OCR1AL,OCR1AH); if(ISPORT(OCR1BL)) ocr1b=get_port16(OCR1BL,OCR1BH); if(ISPORT(OCR1CL)) ocr1c=get_port16(OCR1CL,OCR1CH); } /* Compare A */ if(port==ocr1a) { set_flag(OCF1A_FLAG); if(coma==1) {if(get_pin(OC1A_PIN)) clear_pin(OC1A_PIN); else set_pin(OC1A_PIN);} pwm_compare_set_pin(coma,OC1A_PIN,add); } /* Compare B */ if(ISPORT(OCR1BL)) if(port==ocr1b) {set_flag(OCF1B_FLAG);pwm_compare_set_pin(comb,OC1B_PIN,add);} /* Compare C */ if(ISPORT(OCR1CL)) if(port==ocr1c) {set_flag(OCF1C_FLAG);pwm_compare_set_pin(comc,OC1C_PIN,add);} break; case 13: break; case 14: /* Fast PWM, ICR */ if(!prescaler_changed) break; if((top=(port==get_port16(ICR1L,ICR1H)))) set_flag(ICF1_FLAG); goto fpwm_mode; case 15: /* Fast PWM, OCR */ set_icr1(); if(!prescaler_changed) break; if((top=(port==ocr1a))) set_flag(OCF1A_FLAG); /* Compare A */ if(port==ocr1a) if(coma==1) {if(get_pin(OC1A_PIN)) clear_pin(OC1A_PIN); else set_pin(OC1A_PIN);} goto fpwm_mode; } if(prescaler_changed) { if(clear_tcnt) {set_port16(TCNT1L,TCNT1H,0);clear_tcnt=0;} else port=add_port16(TCNT1L,TCNT1H,add); }}void prescaler3(void){ prescaler_result3=0; prescaler_value3++; prescaler_result3|=CK1; if(prescaler_value3%8) return; prescaler_result3|=CK8; if(prescaler_value3%32) return; prescaler_result3|=CK32; if(prescaler_value3%64) return; prescaler_result3|=CK64; if(prescaler_value3%128) return; prescaler_result3|=CK128; if(prescaler_value1%256) return; prescaler_result3|=CK256; if(prescaler_value3%1024) return; prescaler_result3|=CK1024; prescaler_value3=0; }void timer_counter3(void){ int cs=0,prescaler_changed=0,coma=0,comb=0,comc=0,pwm_mode=0, bottom,top,max,port; static int t3_pin=0,clear_tcnt=0,add=1,max_value=0xFFFF; static uint16_t ocr3a,ocr3b,ocr3c; if(!clocks) {t3_pin=clear_tcnt=0;add=1;} if(!ISPORT(TCCR3A)) return; if(get_flag(CS30_FLAG)) cs|=1<<0; if(get_flag(CS31_FLAG)) cs|=1<<1; if(get_flag(CS32_FLAG)) cs|=1<<2; switch(cs) { case 0: return; case 1: prescaler_changed=prescaler_result3&CK1; break; case 2: prescaler_changed=prescaler_result3&CK8; break; case 3: prescaler_changed=prescaler_result3&CK64;break; case 4: prescaler_changed=prescaler_result3&CK256;break; case 5: prescaler_changed=prescaler_result3&CK1024;break; case 6: if(ISPIN(T3_PIN)) { if(t3_pin&&!get_pin(T3_PIN)) prescaler_changed=1; t3_pin=get_pin(T3_PIN); } break; case 7: if(ISPIN(T3_PIN)) { if(!t3_pin&&get_pin(T3_PIN)) prescaler_changed=1; t3_pin=get_pin(T3_PIN); } break; } if(clear_tcnt) {set_port16(TCNT3L,TCNT3H,0);clear_tcnt=0;} port=get_port16(TCNT3L,TCNT3H); if(prescaler_changed) { if(port==max_value) {set_port16(TCNT3L,TCNT3H,0);port=0;} else port=add_port16(TCNT3L,TCNT3H,add); } max=(port==0xFFFF); bottom=(port==0); /* get PWM mode */ if(ISFLAG(WGM30_FLAG)) if(get_flag(WGM30_FLAG)) pwm_mode|=1<<0; if(ISFLAG(WGM31_FLAG)) if(get_flag(WGM31_FLAG)) pwm_mode|=1<<1; if(ISFLAG(WGM32_FLAG)) if(get_flag(WGM32_FLAG)) pwm_mode|=1<<2; if(ISFLAG(WGM33_FLAG)) if(get_flag(WGM33_FLAG)) pwm_mode|=1<<3; /* get Compare Mode */ if(ISFLAG(COM3A0_FLAG)) if(get_flag(COM3A0_FLAG)) coma|=1<<0; if(ISFLAG(COM3A1_FLAG)) if(get_flag(COM3A1_FLAG)) coma|=1<<1; if(ISFLAG(COM3B0_FLAG)) if(get_flag(COM3B0_FLAG)) comb|=1<<0; if(ISFLAG(COM3B1_FLAG)) if(get_flag(COM3B1_FLAG)) comb|=1<<1; if(ISFLAG(COM3C0_FLAG)) if(get_flag(COM3C0_FLAG)) comc|=1<<0; if(ISFLAG(COM3C1_FLAG)) if(get_flag(COM3C1_FLAG)) comc|=1<<1; switch(pwm_mode){ case 4: /* CTC, OCR1A */ set_icr3(); if(prescaler_changed) if(port==get_port16(OCR3AL,OCR3AH)) {clear_tcnt=1;set_flag(OCF3A_FLAG);} goto normal_mode; case 12: /* CTC, ICR1 */ if(prescaler_changed) if(port==get_port16(ICR3L,ICR3H)) {clear_tcnt=1;set_flag(ICF3_FLAG);} goto normal_mode; case 0: /* Normal mode */ set_icr3(); normal_mode: add=1; max_value=0xFFFF; /* Updating Compare Registers */ ocr3a=get_port16(OCR3AL,OCR3AH); if(ISPORT(OCR3BL)) ocr3b=get_port16(OCR3BL,OCR3BH); if(ISPORT(OCR3CL)) ocr3c=get_port16(OCR3CL,OCR3CH); if(prescaler_changed) { if(bottom) set_flag(TOV3_FLAG); /* Compare A*/ if(port==ocr3a) {set_flag(OCF3A_FLAG);compare_set_pin(coma,OC3A_PIN);} /* Compare B */ if(ISPORT(OCR3BL)) if(port==ocr3b) {set_flag(OCF3B_FLAG);compare_set_pin(comb,OC3B_PIN);} /* Compare C */ if(ISPORT(OCR3CL)) if(port==ocr3c) {set_flag(OCF3C_FLAG);compare_set_pin(comc,OC3C_PIN);} } else { if(ISFLAG(FOC3A_FLAG)) if(get_flag(FOC3A_FLAG)) {clear_flag(FOC3A_FLAG);compare_set_pin(coma,OC3A_PIN);} if(ISFLAG(FOC3B_FLAG)) if(get_flag(FOC3B_FLAG)) {clear_flag(FOC3B_FLAG);compare_set_pin(comb,OC3B_PIN);} if(ISFLAG(FOC3C_FLAG)) if(get_flag(FOC3C_FLAG)) {clear_flag(FOC3C_FLAG);compare_set_pin(comc,OC3C_PIN);} } break; case 10: /* PWM, Phase Correct, ICR */ max_value=0xFFFF; if(!prescaler_changed) break; if((top=(port==get_port16(ICR3L,ICR3H)))) set_flag(ICF3_FLAG); goto phase_correct_2; case 11: /* PWM, Phase Correct, OCR */ max_value=0xFFFF; set_icr3(); if(!prescaler_changed) break; if((top=(port==ocr3a))) set_flag(OCF3A_FLAG); phase_correct_2: /* Compare A */ if(port==ocr3a) if(coma==1) {if(get_pin(OC3A_PIN)) clear_pin(OC3A_PIN); else set_pin(OC3A_PIN);} goto phase_correct; break; case 1: /* PWM, Phase Correct, 8-bit */ max_value=0xFFFF; set_icr3(); if(!prescaler_changed) break; top=(port==0xFF); goto phase_correct; case 2: /* PWM, Phase Correct, 9-bit */ set_icr3(); max_value=0xFFFF; if(!prescaler_changed) break; top=(port==0x1FF); goto phase_correct; case 3: /* PWM, Phase Correct, 10-bit */ set_icr3(); max_value=0xFFFF; if(!prescaler_changed) break; top=(port==0x3FF); phase_correct: if(bottom) {set_flag(TOV3_FLAG);add=1;} if(top) { add=-1; /* Updating Compare Registers */ ocr3a=get_port16(OCR3AL,OCR3AH); if(ISPORT(OCR3BL)) ocr3b=get_port16(OCR3BL,OCR3BH); if(ISPORT(OCR3CL)) ocr3c=get_port16(OCR3CL,OCR3CH); } /* Compare A*/ if(port==ocr3a) {set_flag(OCF3A_FLAG);pwm_compare_set_pin(coma,OC3A_PIN,add);} /* Compare B */ if(ISPORT(OCR3BL)) if(port==ocr3b) {set_flag(OCF3B_FLAG);pwm_compare_set_pin(comb,OC3B_PIN,add);} /* Compare C */ if(ISPORT(OCR3CL)) if(port==ocr3c) {set_flag(OCF3C_FLAG);pwm_compare_set_pin(comc,OC3C_PIN,add);} break; case 5: /* Fast PWM, 8-bit */ max_value=0xFF; set_icr3(); if(!prescaler_changed) break; top=(port==max_value); goto fpwm_mode; case 6: /* Fast PWM, 9-bit */ max_value=0x1FF; set_icr3(); if(!prescaler_changed) break; top=(port==max_value); goto fpwm_mode; case 7: /* Fast PWM, 10-bit */ max_value=0x3FF; set_icr3(); if(!prescaler_changed) break; top=(port==max_value); fpwm_mode: if(top) { set_flag(TOV3_FLAG); fpwm_compare_top_set_pin(coma,OC3A_PIN); fpwm_compare_top_set_pin(comb,OC3B_PIN); fpwm_compare_top_set_pin(comc,OC3C_PIN); ocr3a=get_port16(OCR3AL,OCR3AH); if(ISPORT(OCR3BL)) ocr3b=get_port16(OCR3BL,OCR3BH); if(ISPORT(OCR3CL)) ocr3c=get_port16(OCR3CL,OCR3CH); } /* Compare A*/ if(port==ocr3a) {set_flag(OCF3A_FLAG);fpwm_compare_match_set_pin(coma,OC3A_PIN);} /* Compare B */ if(ISPORT(OCR3BL)) if(port==ocr3b) {set_flag(OCF3B_FLAG);fpwm_compare_match_set_pin(comb,OC3B_PIN);} /* Compare C */ if(ISPORT(OCR3CL)) if(port==ocr3c) {set_flag(OCF3C_FLAG);fpwm_compare_match_set_pin(comc,OC3C_PIN);} break; case 8: /* PWM, Phase and Frequency Correct, ICR */ if(!prescaler_changed) break; if((top=(port==get_port16(ICR3L,ICR3H)))) set_flag(ICF3_FLAG); goto phase_fre_correct; case 9: /* PWM, Phase and Frequency Correct, OCR */ set_icr3(); if(!prescaler_changed) break; if((top=(port==ocr3a))) set_flag(OCF3A_FLAG); phase_fre_correct: if(top) add=-1; if(bottom) { add=1;set_flag(TOV3_FLAG); ocr3a=get_port16(OCR3AL,OCR3AH); if(ISPORT(OCR3BL)) ocr3b=get_port16(OCR3BL,OCR3BH); if(ISPORT(OCR3CL)) ocr3c=get_port16(OCR3CL,OCR3CH); } /* Compare A */ if(port==ocr3a) { set_flag(OCF3A_FLAG); if(coma==1) {if(get_pin(OC3A_PIN)) clear_pin(OC3A_PIN); else set_pin(OC3A_PIN);} pwm_compare_set_pin(coma,OC3A_PIN,add); } /* Compare B */ if(ISPORT(OCR3BL)) if(port==ocr3b) {set_flag(OCF3B_FLAG);pwm_compare_set_pin(comb,OC3B_PIN,add);} /* Compare C */ if(ISPORT(OCR3CL)) if(port==ocr3c) {set_flag(OCF3C_FLAG);pwm_compare_set_pin(comc,OC3C_PIN,add);} break; case 13: break; case 14: /* Fast PWM, ICR */ max_value=get_port16(ICR3L,ICR3H); if(!prescaler_changed) break; if((top=(port==max_value))) set_flag(ICF3_FLAG); goto fpwm_mode; case 15: /* Fast PWM, OCR */ max_value=ocr3a; set_icr3(); if(!prescaler_changed) break; if((top=(port==max_value))) set_flag(OCF3A_FLAG); /* Compare A */ if(port==ocr3a) if(coma==1) {if(get_pin(OC3A_PIN)) clear_pin(OC3A_PIN); else set_pin(OC3A_PIN);} goto fpwm_mode; }}static void compare_set_pin(int mode,int pin){ switch(mode) { case 1: /* Toggle output pin */ if(get_pin(pin)) clear_pin(pin); else set_pin(pin); break; case 2: clear_pin(pin);break; /* Clear output pin */ case 3: set_pin(pin);break; /* Set output pin */ }}static void pwm_compare_set_pin(int mode,int pin,int add){ switch(mode) { case 2: if(add==1) clear_pin(pin); else set_pin(pin); break; case 3: if(add==-1) clear_pin(pin); else set_pin(pin); break; }}static void fpwm_compare_match_set_pin(int mode,int pin){ switch(mode){ case 2: clear_pin(pin); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -