⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardware.c

📁 linux上实现的多种型号的AVR模拟器
💻 C
📖 第 1 页 / 共 4 页
字号:
  /* 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 + -