Ir ao conteúdo
  • Cadastre-se

marcmec

Membro Júnior
  • Posts

    11
  • Cadastrado em

  • Última visita

Reputação

0
  1. @Isadora Ferraz consegui!!!!! lembrei que Unsigned char varia de 0-255. coloquei uma variável de tempo e ficou assim o código. //----------------------------função do sensor seguidor de linha------------------------------------------------------------------ //----------------------------------main-------------------------------------- #pragma orgall 0x1000 unsigned char tempo=50; void main ()org 0x1000 { //intcon=0b11100100; //setup_vref (false); trisd= 0; //metade das portas como entrada portd=0; CMCON=0x07; portb.f0=1; while (tempo<100) { if(!portb.f1){ tempo++; delay_ms(100); portd.f0 = 1; portd.f1 = 1; portd.f2 = 0; portd.f3 = 0; delay_ms(100); portd.f0=0; portd.f1=1; portd.f2=1; portd.f3=0; delay_ms(100); portd.f0 = 0; portd.f1 = 0; portd.f2 = 1; portd.f3 = 1; delay_ms(100); portd.f0 = 1; portd.f1 = 0; portd.f2 = 0; portd.f3 = 1; delay_ms(100); } }//fim if } assim ele vai funcionar até atingir a variável tempo. obrigado.
  2. Eu já tinha visto e estudado todos esses links que voce passou, não é algo personalizado, estou tentando programar com o que aprendi, e quando fui pesquisar sobre funções de botão ou varredura de botão, foi indicado o estudo de interrupção, e por isso desisti dos outros métodos, e comecei a estudar interrupção, quando tiro o (while(!s_1); ou mudo para while(S_1);) não faz nenhuma ação. Pra mim é difícil, comecei a ver pic esse ano...então...consegui configurar os registradores, mas ainda assim não atende o que quero, vou tentar fazer o que voce disse, mas até domingo vou fechar o tópico, esse projeto é pra hoje, ou era pra ser apresentado hoje, enfim. obg.
  3. estou pra desistir, eu não aguento mais namoral, eu tô tentando funcionar pela terceira forma, não sei se estou saturado, ou estou deixando passar algo, mas não funciona nada que tento, nem no proteus roda. e sim, eu já entendi que se eu colocar o bit pra rodar [1,0,0,0] caracteriza 1/4 de volta, e se eu colocar [1,1,0,0] caracteriza 1/2 volta. mas nem com essa dica que você deu, eu consigo fazer isso. Algo que esqueci de mencionar, não sei se muda muita coisa, eu tô utilizando o driver l293d para este motor, que é bipolar de 4 fios. enquanto você não responde vou tentando aqui. #define S_1 rb0_bit #pragma orgall 0x1000 void main() org 0x1000 { unsigned char d=1; cmcon=7; TRISB=0; portd=d; while (1){ if(!S_1){ d<<=1; delay_ms(50); if(d>8) d=1; } }//while }//void o codigo que consegui fazer com que ao menos quando aperto o botão o motor funciona é este. #pragma orgall 0x1000 #define S_1 Rb1_bit #define S_2 Rb2_bit //--------------------------------rodar direita--------------------------- void rodar_direita() { portd.f1 = 1; portd.f2 = 1; portd.f3 = 0; portd.f4 = 0; delay_ms(100); portd.f1 = 0; portd.f2 = 1; portd.f3 = 1; portd.f4 = 0; delay_ms(100); } void rodar_esquerda(){ portd.f1 = 0; portd.f2 = 0; portd.f3 = 1; portd.f4 = 1; delay_ms(100); portd.f1=0; portd.f2=1; portd.f3=0; portd.f4=1; delay_ms(100); } //----------------------------------main-------------------------------------- void main ()org 0x1000 { trisd= (0xf0); //metade das portas como entrada CMCON=0x07; while (1) { if (S_1) { do{ rodar_direita(); delay_ms(50);} while(S_1); if (!S_1) { do{ rodar_esquerda();} while(!S_1); } } } } e mesmo assim ele gira quando aperto o botão, mas ele não executa o passo por cada aperto no botão, fica girando e girando, até soltar o botão. obrigado desde já, mas estou muito cansado a parte de programar o projeto ficou comigo, e não consigo fazer ao menos isso.
  4. acho que entendi, vou retomar os estudos e tentar fazer o que voce propôs, disseram que é melhor por interrupção, aí comecei a estudar o tópico. logo menos trarei as dúvidas ou as conclusões. abrç
  5. já fiz um pisca led, já fiz sequencial, já fiz sinal de transito, já fiz controle por pwm, comparador a/d. fiz como está no datasheet do pic, pra cada registrador do ITCON. E se o meu programa não faz isso, eu começo por onde ? porque não começa a explicar daí? e sim é pra cada apertada no botão o motor de passo dar o passo desejado.
  6. @Isadora Ferraz void parar(){ // 1 passo do motor de passo portd.f0=1; portd.f1=0; portd.f2=0; portd.f3=0; }//fim função parar segue a função dos bits do motor acima, independente de ser TMR0IF ou TMR0, ele ainda da erro, já tentei das duas maneiras, e sim, era pra ser um bit só, acabei esquecendo de apagar a linha T0PS0. (mb), pois tentei de outra forma também.
  7. #define S_1 RB0_bit void interrupt(){ // houve interrupção externa TMR0IF=0; // reinicia a flag if(!S_1) { delay_ms(50); parar(); } } //fim interrupt void parar(){ // 1 passo do motor de passo portd.f0=1; portd.f1=0; portd.f2=0; portd.f3=0; }//fim função parar void main() { cmcon=7; GIE_bit=1; PEIE_bit=1; T0PS0:0x6; // ciclo de instrução 1:128 8bits TMR0IE=1; //habilita a interrupção no tmr0 TMR0IF=0x06; // inicia tmr0 ciclo de 250 TRISB=1; PORTB=1; while (1){ }//fim se }//fim while }//fim void Galera, esse é o código que estou testando, quero saber se há algo de errado com ele, pois segui passo a passo uma aula, e sim, já tentei os codigos pra led e tudo mais, estou tentando acionar um motor de passo há mais de 1 mês, e não consigo aciona-lo apenas por um momento,( dar um passo e parar a execução mesmo com o botão estando pressionado, o botão simula um sensor)- e estudei interrupções pra isso, segue em anexo o erro que está dando no mikroc, estou criando o tópico, porque cansei de tentar resolver sozinho, e visto que, já assisti varias aulas, li muitos artigos, até aqui vi alguns artigos, mas não responderam minha dúvida. enfim é isso.
  8. Bom dia galera, resolvi compartilhar a solução do problema, e a solução foi dada pela dica da Isadora, consiste em aplicar uma frequência coerente ao microcontrolador, e também vai depender da diferença da taxa de variação da variável ligada ao pino do conversor AD. Segue o código, e o circuito do seguidor de linha está logo acima no primeiro post. valeu. /* POR MARCOS VINICIUS SILVA BENTO 6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES PROJETO DO CARRO COM ATUADOR HIDRÁULICO */ unsigned duty=50, duty1=50; // variável de velocidade de pwm inicada em 10 unsigned adc=0; // variável para taxa de variação sensor1 unsigned adc1=0; //variável para taxa de variação do sensor2 void main() { CMCON=0x07; //desativa comparador analógico ADCON0=0X01; // ativa conversor AD e entrada analógica ADCON1=0X0E; // configura entrada analógica pwm1_start(); // habilita pwm pwm1_init(5000); // configuranção frequência 10kHhz pwm1_set_duty((duty*255)/100); //configuração pwm pwm2_start(); pwm2_init(5000); pwm2_set_duty((duty1*255)/100); while (1) { adc=ADC_READ(0);//lê o conversor AD adc1=ADC_READ(0); pwm1_set_duty((duty*255)/100);//Lê a percentagame da velocidade do pwm pwm2_set_duty((duty1*255)/100); if ((adc<100) && (adc1<100)) { adc=ADC_READ(0); adc1=ADC_READ(0); pwm1_set_duty((duty*255)/100); pwm2_set_duty((duty1*255)/100); } // fim se1 if ((adc>500) && (adc1>500)) { pwm1_stop(); pwm2_stop(); }// fim se2 }// fim while }//fim void main
  9. aah, suave, eu pensei que por compilar o < ((adc && adc1)>250)> estaria de boa
  10. beleza, alterei o programa, já que não preciso controlar realmente a velocidade, só preciso dizer quanto eu quero que seja a velocidade e parar ela quando os sensores não corresponderem, eu não sei se o proteus está dando bug, mas quando eu alterei com a nova lógica, ele funciona, mas, não consigo ficar alterando tipo (ativar o sensor os motores funcionam, altero o estado do sensor os motores param), mas quando tento voltar e ativar o sensor de novo, os motores não rodam. /* POR MARCOS VINICIUS SILVA BENTO 6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES PROJETO DO CARRO COM ATUADOR HIDRÁULICO */ unsigned duty=50; // variável de velocidade de pwm iniciada em 50 unsigned adc=0; // variável para taxa de variação sensor1 unsigned adc1=0; //variável para taxa de variação do sensor2 void main() { CMCON=0x07; //desativa comparador analógico ADCON0=0X01; // ativa conversor AD e entrada analógica ADCON1=0X0E; // configura entrada analógica pwm1_start(); // habilita pwm pwm1_init(10000); // configuranção frequência 10kHhz pwm1_set_duty((duty*255)/100); //configuração pwm pwm2_start(); pwm2_init(10000); pwm2_set_duty((duty*255)/100); while (1) { adc=ADC_READ(0);//lê o conversor AD adc1=ADC_READ(0); pwm1_set_duty(duty);//Lê a percentagame da velocidade do pwm pwm2_set_duty(duty); if ((adc && adc1)<200) { adc=ADC_READ(0); pwm1_set_duty(adc); adc1=ADC_READ(1); pwm2_set_duty(adc1); } // fim se1 if ((adc && adc1)>250) { pwm1_stop(); pwm2_stop(); }// fim se2 }// fim while }//fim void main
  11. Boa tarde pessoal, sou novo aqui, é meu primeiro post, e como iniciante na área de programação, principalmente por microcontroladores preciso de ajuda, espero que me ajudem o mais rápido que puder, tenho menos de um mês pra entregar esse projeto. O projeto tem como ideal um carro que segue linha através da variação da resistencia de um LDR, e esse acionamento só só será possivel se o outro sensor estiver acionado, ou seja, o carro só irá andar quando o outro sensor localizado no atuador hidráulico estiver acionado (estabilizado para certificar de que há algo no atuador), e o atuador só irá funcionar depois que esse sensor for acionado, acionando a válvula solenoide. Primeiramente para iniciar a programação, como nunca tinha programado pic antes, resolvi fazer por partes, e comecei primeiro pelo acionamento dos motores do carro, e já estou preso nessa situação, eu não sei se minha lógica está errada, ou se minha lógica de eletrônica está errada, já vi vários vídeos, estudei muito sobre controle de motores, por ponte h, ou por transistores, enfim. estou postando, mas continuo a estudar eletrônica analógica principalmente, já que identifiquei uma deficiência minha. Segue imagem do proteus onde simulo o código e segue também o código que até agora desenvolvi. Obrigado desde já /* POR MARCOS VINICIUS SILVA BENTO 6º ENGENHARIA MECATRÔNICA- UNIVERSIDADE TIRADENTES PROJETO DO CARRO COM ATUADOR HIDRÁULICO */ unsigned duty=10; // variável de velocidade de pwm inicada em 10 unsigned adc=0; // variável para taxa de variação sensor1 unsigned adc1=0; //variável para taxa de variação do sensor2 void main() { CMCON=0x07; //desativa comparador analógico ADCON0=0X01; // ativa conversor AD e entrada analógica ADCON1=0X0E; // configura entrada analógica pwm1_start(); // habilita pwm pwm1_init(1000); // configuranção frequencia 1MHhz pwm1_set_duty((duty*255)/100); //configuração pwm pwm2_start(); pwm2_init(1000); pwm2_set_duty((duty*255)/100); while (1) { adc=ADC_READ(0);//lê o conversor AD adc1=ADC_READ(0); pwm1_set_duty((duty*255)/100);//Lê a percentagame da velocidade do pwm pwm2_set_duty((duty*255)/100); if ((adc && adc1)<200) { duty++; delay_us(20); if (duty>40) duty==40; }//fim se if ((adc && adc1)>200) { duty--; delay_us(20); if (duty==0) duty ==0; }//fim se 2 }//fim while }//fim void main

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...