void pwm_init (int1 enabled) { set_tris_c (0); /* CCP1 is RC2, CCP2 is RC1 */ pwm_enabled = enabled; if (enabled) { setup_ccp1 (CCP_PWM); setup_ccp2 (CCP_PWM); setup_timer_2 (T2_DIV_BY_16, 255, 1); // 88 is 2.8 KHz } else { setup_ccp1 (CCP_OFF); setup_ccp2 (CCP_OFF); } }
void main() { setup_timer_2(T2_DIV_BY_16,255,1); //4.0 ms overflow, 4.0 ms interrupt setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty((int16)200); set_pwm2_duty((int16)200); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); SET_TRIS_B(0); stop(); //delay_ms(500); while(TRUE) { if(hasCommand) { hasCommand= FALSE; if(buffer[0] == 's'){ show(); } else switch(buffer[1]) { case 1: go_forward(); break; case 2: go_backward(); break; case 3: turn_right(); break; case 4: turn_left(); break; case 5: stop(); break; default : break; } } } }
void setup_motors() //initialize PWM { //setup_timer_2(T2_DIV_BY_1, 255, 16); setup_timer_2(T2_DIV_BY_16, SPEED, 16); //setup_timer_2(T2_DIV_BY_4, 63, 16); // 5Mz instruction cycle, pwm cycle every 4*64 cycles (19.5khz) // interrupt every 16th of that (not used) setup_ccp1(CCP_PWM); // PWM output on CCP1/RC2, pin 17 setup_ccp2(CCP_PWM); // PWM output on CCP2/RC1, pin 16. PWM2 can be moved to pin 36; see ServoSkeleton }
main() { printf("\r\nHigh time (sampled every second):\r\n"); setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise setup_ccp2(CCP_CAPTURE_FE); // Configure CCP2 to capture fall setup_timer_1(T1_INTERNAL); // Start timer 1 enable_interrupts(INT_CCP2); // Setup interrupt on falling edge enable_interrupts(GLOBAL); while(TRUE) { delay_ms(1000); printf("\r%lu us ", pulse_width/5 ); } }
//Incluye las cabeceras antes descritas void main(){ //Rutina principal output_high(LED); //Enciende el LED indicador lcd_init(); //Rutina de incializacion del LCD lcd_putc("\fListo \n"); //Despliega el mensaje "Listo" en el LCD setup_adc_ports(AN0); //Fija el pin 0 del puerto A como entrada analogica setup_adc (adc_clock_internal); //El tiempo para la conversion AD esta dado por el oscilador //interno set_adc_channel(0); //El puerto AD activo es el 0 enable_interrupts(INT_EXT); //Habilita la interrupcion externa en RB0 ext_int_edge(L_to_H); //Fija la interrupcion por flanco de subida. setup_timer_2(T2_DIV_BY_16,129,16); //El tiempo de oscilacion del timer 2 sirve tanto para la //interrupcion por timer2 como para el PWM. setup_ccp1(CCP_PWM); //Da de alta el modulo CCP1 como PWM //y lo inicializa en duty cycle 0 set_pwm1_duty(0); setup_ccp2(CCP_PWM); //Da de alta el modulo CCP2 como PWM //y lo inicializa en duty cycle 0 set_pwm2_duty(0); enable_interrupts(GLOBAL); //Habilita las interrupciones globales output_low(LED); //Apaga el led antes encendido. while(TRUE){ //Esta rutina espera a la interrupcion y parpadea el LED //indicador output_low(LED); delay_ms(100); output_high(LED); delay_ms(100); } }
void main() { char string[30]; char ch; int auxc1,auxcb,auxs; int pilha_can[11]; setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_spi(spi_master|spi_h_to_l|spi_clk_div_4|spi_ss_disabled|spi_sample_at_end); setup_timer_0(RTCC_INTERNAL); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_ccp1(CCP_OFF); setup_ccp2(CCP_OFF); enable_interrupts(INT_RDA);//tirar se quiser arrancar em debug disable_interrupts(global); DEBUG=false; #IF CDEBUG DEBUG=true; #ENDIF strcpy(go,"debug"); //START MCP2510*************************************************** f2510rst(); delay_ms(1000); f2510cfg(); delay_ms(1000); auxc1=read_eeprom(save_adr); f2510cfg_end(auxc1,0); //**************************************************************** pilha_rs232[0]=0; pilha_can[0]=0; enable_interrupts(global); while(true) { while(DEBUG==false) { auxs=f2510rx(pilha_can); if (auxs==1) printf("ERROR CAN_BUFFER FULL n\\r"); else if (auxs==0) { printf(":%X%X%X%X%X%X",pilha_can[1],pilha_can[2],pilha_can[3],pilha_can[4],pilha_can[5],pilha_can[6]); for(auxs=0;auxs<pilha_can[6];++auxs) { printf("%X",pilha_can[7+auxs]); } printf("\r"); pilha_can[0]=0; } if(pilha_rs232[0]==1) { auxs=f2510tx(pilha_rs232); if (auxs==false) printf("ERROR TX CAN BUFFER FULL \n\r"); } } while(DEBUG==TRUE) { printf("******************************\n\r"); printf("* 1-Debug OFF *\n\r"); printf("* 2-MCP dump *\n\r"); printf("* 3-MCP config *\n\r"); printf("* 4-MCP Send *\n\r"); printf("* 5-configuracao de end *\n\r"); printf("* 6-MCP reset *\n\r"); printf("* 7-MCP receive *\n\r"); printf("* 8-clear receive buffer *\n\r"); printf("* g-SAVE Adress *\n\r"); printf("* l-READ Adress *\n\r"); printf("******************************\n\r"); ch=getc(); printf("%C\r",ch); switch(ch) { case '1': printf("\n\r DEBUG MODE OFF \n\r"); DEBUG=FALSE; pilha_can[0]=0; pilha_rs232[0]=0; enable_interrupts(INT_RDA); enable_interrupts(global); break; case '2': f2510dump(); break; case '3': f2510cfg(); break; case '4': printf ("\n\r Introduza endereco de destino \n\r"); gets(string); pilha_rs232[1]=atoi(string); printf ("\n\r Introduza sub endereco de destino \n\r"); gets(string); pilha_rs232[2]=atoi(string); printf ("\n\r Introduza endereco de origem \n\r"); gets(string); pilha_rs232[3]=atoi(string); printf ("\n\r Introduza sub endereco de origem \n\r"); gets(string); pilha_rs232[4]=atoi(string); printf ("\n\r Introduza tipo \n\r"); gets(string); pilha_rs232[5]=atoi(string); printf ("\n\r Introduza tamanho dado \n\r"); gets(string); pilha_rs232[6]=atoi(string); for(auxc1=1;auxc1<pilha_rs232[6]+1;++auxc1){ printf ("\n\r Introduza dado %d\n\r",auxc1); gets(string); pilha_rs232[7+auxc1-1]=atoi(string); } auxcb=f2510tx(pilha_rs232); printf ("\n\r resultado = %02x \n\r",auxcb); break; case '5': printf ("\n\r Introduza endereco \n\r"); gets(string); auxc1=atoi(string); f2510cfg_end(auxc1,0); break; case 'g': printf ("\n\r Introduza endereco \n\r"); gets(string); auxc1=atoi(string); write_eeprom(save_adr,auxc1); break; case 'l': auxc1=read_eeprom(save_adr); printf("\n\r Endereco=%u\n\r",auxc1); break; case '6': f2510rst(); break; case '7': printf("\n RESULTADO=%u\n",f2510rx(pilha_can)); printf("\n\r end_dest=%u \n\r",pilha_can[1]); printf("\n\r sub_end_dest=%u \n\r",pilha_can[2]); printf("\n\r end_orig=%u \n\r",pilha_can[3]); printf("\n\r sub_end_orig=%u \n\r",pilha_can[4]); printf("\n\r tipo=%u \n\r",pilha_can[5]); printf("\n\r comp_dados=%u \n\r",pilha_can[6]); for(auxc1=0;auxc1<pilha_can[6];++auxc1) { printf("\n\r dado %u=%u \n\r",auxc1+1,pilha_can[7+auxc1]); } break; case '8': f2510bc(0x2c,0); pilha_can[0]=0; break; } } } }
void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_CLOCK_DIV_2); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DIV_BY_16,155,1); setup_ccp1(CCP_PWM); setup_ccp2(CCP_PWM); set_pwm1_duty(312); // Inicia el Ciclo de Trabajo PWM1 en 50%. set_pwm2_duty(312); // Inicia el Ciclo de Trabajo PWM2 en 50%. setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); set_tris_a(0b11100000); // set_tris_c(0b10000000); //Pone RC7 como input y RC6 como output (y de 5 a 0 también) set_tris_b(0b00000000); // Habilita como salidas los pines B0, B1,...,B7 set_tris_e(0b010); // ************************ CONFIGURACIÓN PWM1 y PWM2: ************************ int32 brillo=0; int32 exposicion=500; //Tiempo de exposición de la cámara en [ms] int32 der_steps=0; int32 izq_steps=0; int32 led=0; int32 motor=0; int32 direccion=0; int32 pasos=0; int32 velocidad=0; char leido_pantalla[5]; output_low(PIN_B0); output_low(PIN_B1); output_low(PIN_B2); output_low(PIN_B3); output_low(PIN_B4); output_high(PIN_B6); // Siempre en 5V para conectar pull up 10kOhm de RA4 para SLEEP MOTOR 3 (altura) set_pwm1_duty(0); // Mantiene Ciclos en 0 para reducir consumo al iniciar. set_pwm2_duty(0); //*************** INICIO *************** while(true) { char seleccionar=0; output_low(PIN_A2); output_low(PIN_A3); output_low(PIN_A4); printf("Set parameters: e=exposicion(%Ld), v=velocidad(%Ld)\n\r",exposicion,velocidad); printf(" b=brillo(%Ld), d=direccion(%Ld), p=pasos(%Ld)\n\r",brillo,direccion,pasos); printf(" l=led(%Ld), m=motores(%Ld) \n\r",led,motor); seleccionar=getc(); switch(seleccionar) { case 'v': printf("Ingrese Velocidad en [ms] y [ENTER]\n\r"); fgets(leido_pantalla); velocidad=atoi32(leido_pantalla); break; case 'e': printf("Ingrese tiempo de exposicion en [ms] y [ENTER]\n\r"); fgets(leido_pantalla); exposicion=atoi32(leido_pantalla); break; case 'b': printf("Ingrese Ciclo de Trabajo para PWM1 (0-100) (brillo) y [ENTER]:\n\r"); fgets(leido_pantalla); brillo=atoi(leido_pantalla); set_pwm1_duty(brillo*20000000/(100*2000*16)); set_pwm2_duty(brillo*20000000/(100*2000*16)); break; case 'l': printf("Ingrese Led a encender: 0 a 7 y [ENTER]\n\r"); fgets(leido_pantalla); led=atoi32(leido_pantalla); break; case 'd': printf("Ingrese direccion 1=Derecha, 0=Izquierda y [ENTER]\n\r"); fgets(leido_pantalla); direccion = atoi32(leido_pantalla); break; case 'p': printf("Ingrese el numero de pasos a utlizar y [ENTER]\n\r"); fgets(leido_pantalla); pasos = atoi32(leido_pantalla); break; case 'm': printf("Ingrese el numero de motor a utlizar: 1,2 o 3 y [ENTER]\n\r"); fgets(leido_pantalla); motor = atoi32(leido_pantalla); break; case '1': led_on(led); break; case '2': led_off(); break; case '3': motor_move(motor,pasos,direccion); break; case '4': led_on_off(led,exposicion); break; case '5': int32 pasos_restantes; int32 steps; int dir; dir = direccion; steps = pasos; pasos_restantes = pasos; motor_on(motor); while(pasos_restantes > 0){ printf("pasos_restantes: %Ld\n\r",pasos_restantes); delay_us(200); steps = motores4(pasos_restantes,dir,velocidad); pasos_restantes = pasos_restantes - steps; if (pasos_restantes <=0) break; delay_us(200); dir = (dir == 0)?1:0; motores2(2000,dir); } break; case '6': int32 pasos_restantes2; int32 steps2; int dir2; dir2 = direccion; steps2 = pasos; pasos_restantes2 = pasos; motor_on(motor); while(true){ printf("pasos restantes: %Ld\n\r",pasos_restantes2); delay_us(200); steps2 = motores4(pasos_restantes2,dir2,velocidad); delay_us(200); dir2 = (dir2 == 0)?1:0; motores2(2000,dir2); pasos_restantes2 = pasos_restantes2 - steps2; if (pasos_restantes2 <=0) pasos_restantes2 = pasos; } break; case '7': int32 steps3; motor_on(motor); steps3 = motores4(pasos,direccion,velocidad); if (steps3 - pasos < 0){ direccion = (direccion == 0)?1:0; motores2(2000,direccion); delay_us(200); motores3(2147483640,direccion); direccion = (direccion == 0)?1:0; motores2(2000,direccion); } break; case '8': printf("Setup Calibracion Quick\n\r"); motor_on(motor); motores3(2147483640,DERECHA); delay_us(200); motores2(2000,IZQUIERDA); delay_us(200); izq_steps = motores3(2147483640,IZQUIERDA); delay_us(200); motores2(2000,DERECHA); delay_us(200); der_steps = motores3(2147483640,DERECHA); printf("izq_steps ->%Ld<- \n\r",izq_steps); printf("der_steps ->%Ld<- \n\r",der_steps); while(true){ motores2(izq_steps,IZQUIERDA); delay_us(200); motores2(der_steps,DERECHA); delay_us(200); } case '9': printf("Setup Velocidad ...\n\r"); output_high(PIN_A4); motores2(2000,IZQUIERDA); delay_us(200); izq_steps = motores3(2147483640,IZQUIERDA); delay_us(200); motores2(2000,DERECHA); delay_us(200); der_steps = motores3(2147483640,DERECHA); printf("izq_steps ->%Ld<- \n\r",izq_steps); printf("der_steps ->%Ld<- \n\r",der_steps); motores4(izq_steps,IZQUIERDA,velocidad); delay_us(200); motores4(der_steps,DERECHA,200); delay_us(200); break; } } } //FIN MAIN
void main() { int1 flag = 0; porta = 0;//all ports are zero portb = 0; portc = 0; setup_adc_ports(no_analogs|vss_vdd); //digital functions selected setup_adc(adc_off); //internal rc oscillator disabled for adc setup_wdt(wdt_off); //watch dog timer disabled setup_timer_0(rtcc_off); //all timers disabled setup_timer_1(t1_disabled); setup_timer_2(t2_disabled,0,1); setup_timer_3(t3_disabled|t3_div_by_1); setup_comparator(nc_nc_nc_nc); //comparators disabled setup_vref(false); //no reference voltage in ra2 setup_ccp1(ccp_off); //disable ccp1 setup_ccp2(ccp_off); //disable ccp2 enable_interrupts(int_rda); //uart rx interruption enabled enable_interrupts(global); //global interruptions enabled usb_cdc_init(); usb_init(); //initialize hardware usb and wait for PC conection set_tris_a(0b00111111); set_tris_b(0b11111011);//rb2 output mclr dspic port_b_pullups(false); set_tris_c(0b10111111); stateDspic = running; counterReset = 0; delay_ms(500);//wait for supply stabilization while(true) { usb_task(); manage_conection(); if (usb_cdc_kbhit()) { data_rx_usb=usb_cdc_getc();//read buffer and save in data_rx printf("%c",data_rx_usb);//send through uart if (data_rx_usb == rstKeyword[0]) { if (counterReset == 0) counterReset++; } else if (data_rx_usb == rstKeyword[1]) { if (counterReset == 1) counterReset++; else counterReset = 0; } else if (data_rx_usb == rstKeyword[2]) { if (counterReset == 2) counterReset++; else counterReset = 0; } else if (data_rx_usb == rstKeyword[3]) { if (counterReset == 3) counterReset++; else counterReset = 0; } else if (data_rx_usb == rstKeyword[4] && counterReset == 4)//here, all requirements were met { counterReset = 0; flag = 0; //reset flag for(i = 0; i < 10000; i++) //wait for the next byte { if (usb_cdc_kbhit()) //if a new byte is received { data_rx_usb = usb_cdc_getc();//read buffer and save in data_rx printf("%c",data_rx_usb);//send through uart flag = 0; break; } flag = 1; } if (flag == 1) //apply reset when no characters were received { stateDspic = stop; delay_ms(50); stateDspic = running; } } else counterReset = 0; } } }