Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.

diego.maga

Membros Plenos
  • Total de itens

    146
  • Registro em

  • Última visita

  • Qualificações

    0%

Reputação

0

Sobre diego.maga

  • Data de Nascimento 29-05-1984 (34 anos)

Informações gerais

  • Cidade e Estado
    sorocaba
  1. Fiz essa programação porém não esta 100%. Gostaria que quando o sistema estivesse em manual o led vermelho permanecesse acesso e o verde desligado e quando o sistema estiver em automatico o led vermelho esteja apagado e o verde acesso //****************************************************************************//// Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo. ////****************************************************************************////****************************************************************************//// Vamos considerar que o CLK da CPU = 4 MHz.// O clock interno será (4MHz/4) = 1 MHz // Frequencia(F) = 1 / Periodo -----------> Periodo(T) = 1/Frequencia// Logo T = 1/1MHz = 1us. Logo a cada 1us TMR0 avança uma unidade.//// Como queremos gerar interrupções a cada 1 segundo, a freqüência de geração // dessas interrupções deverá ser de 1 Hz.//// Entretanto o clock interno funciona em uma freqüência 1.000.000 maior que 1Hz.// Usar o TMR0 sem o recurso do PRESCALER, necessitaria contar // 1.000.000 / 256 = 3906,25 interrupções.Isto se torna inviavel.//// Para resolver esse problema configuraremos o divisor de frequencia (PRESCALER)// Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK interno é de 1 MHz.// Se o PRESCALER estiver programado em 1:64, a freqüência de entrada no TMR0 // será de 1 MHz : 64 = 15625 Hz.//// setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64); configuração do PRESCALER//// Se programarmos o TMR0 para dividir esse sinal 15625 por 125,// teremos um sinal de saída de 125 Hz, para isso, basta carregá-lo// a cada estouro de contagem com o valor:// 256– 125 = 131.// set_timer0 (131); Inicialização do TMR0////Dessa forma após 125 interrupções,1s terá passado.//****************************************************************************////============================================================================//#include <16F876A.h> //inclusão das configurações do pic utilizado#use delay(clock=4000000) //clock interno#fuses HS,NOWDT,PUT,NOLVP //configurações dos fusiveis//=======================DEFINIÇÃO DAS VARIAVEIS==============================// byte const horario[5]={0x00,0x01,0x02,0x04,0x08};// sequencia horária byte const anti_horario[5]={0X00,0x08,0x04,0x02,0x1}; //sequencia antihoráriaint i=0; //variavel utilizada para a contagem do loopint alarme=0;int contador=0;int status=0;//============================================================================////=======================DEFINIÇÃO DAS ENTRADAS DIGITAIS======================//#define sensor pin_A0 //sinal do sensor de filme#define bt_horario pin_A1 //botão para giro horario em manual#define bt_antihorario pin_A2 //botão para giro antihorario em manual#define bt_aut_manual pin_A3 //botão processo automatico//============================================================================////=======================DEFINIÇÃO DAS SAIDAS DIGITAIS========================//#define led_vermelho pin_C1 //define pino C1 como saida (led alarme)#define led_verde pin_C2 //define pino C2 como saida (led verde)#define led_laranja pin_C3 //define pino C3 como saida (led laranja)#define rele_alarme pin_C4 //define pino C4 como saida ( relé do alarme)#define led_verde2 pin_C5 //define pino C4 como saida ( relé do alarme)//============================================================================////=====================DEFINIÇÃO DOS PROTÓTIPOS DE FUNÇÃO=====================//void sentido_horario(); //protótipo de função chamado sentido_horáriovoid sentido_antihorario(); //protótipo de função chamado sentido_antihoráriovoid manual(); // protótipo de função chamada manualvoid automatico(); // protótipo de função chamada automaticovoid manual_sentido_horario(); //protótipo de função manual sentido horariovoid manual_sentido_antihorario(); //protótipo de função manual sentido antihorario//============================================================================////===============================FUNÇÃO INICIO================================//void inicio(){ output_B(0x00); // Coloca todo o portB em nivel 0. delay_ms(500); // aguarda 100mS //output_high(rele_alarme); //Liga relé //output_high(led_vermelho); //Liga led vermelho //delay_ms(500); // aguarda 100mS}//============================================================================////============================================================================////=========================FUNÇÃO MANUAL SENTIDO HORÁRIO======================//void manual_sentido_horario(){ set_timer0(131 + get_timer0()); //Inicializa o TMR0 com o valor 131 contador++; //Incrementa a variavel contador a cada estouro de TMR0 if(contador == 125) //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador { contador = 0; i++; output_B(horario[i]); // PortB assume o valor conforme valor de i if(i==4) { i=0; } }}//============================================================================////=====================FUNÇÃO MANUAL SENTIDO ANTI HORARIO=====================//void manual_sentido_antihorario(){ set_timer0(131 + get_timer0()); //Inicializa o TMR0 com o valor 131 contador++; //Incrementa a variavel contador a cada estouro de TMR0 output_low(led_verde); //Liga relé if(contador == 125) //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador { contador = 0; i++; output_B(anti_horario[i]); if(i==4) { i=0; } }}//============================================================================////=========================FUNÇÃO SENTIDO HORÁRIO=============================//void sentido_horario(){ set_timer0(131 + get_timer0()); //Inicializa o TMR0 com o valor 131 contador++; //Incrementa a variavel contador a cada estouro de TMR0 output_high(led_verde); //Liga relé if(contador == 125) //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador { contador = 0; i++; output_B(horario[i]); // PortB assume o valor conforme valor de i if(i==4) { i=0; } }}//============================================================================////=====================FUNÇÃO SENTIDO ANTI HORARIO============================//void sentido_antihorario(){ set_timer0(131 + get_timer0()); //Inicializa o TMR0 com o valor 131 contador++; //Incrementa a variavel contador a cada estouro de TMR0 output_low(led_verde); //Liga relé if(contador == 125) //Após imcrementrar 125 vezes o TMR0, reseta a variavel contador { contador = 0; i++; output_B(anti_horario[i]); if(i==4) { i=0; } }}//============================================================================////==============================FUNÇÃO MANUAL=================================//void manual() { if(input(bt_antihorario) && !input(bt_horario)) // Se botão A.H =1 e botão H=0 //chama a função sentido anti_horario { manual_sentido_antihorario(); // Chama a função manual_sentido_antihorario } else if(input(bt_horario) && !input(bt_antihorario)) // Se botão H=1 e botão A.H=0 //chama a função manual_sentido_horario { manual_sentido_horario(); //Chama a função manual_sentido_horário } }//============================================================================////================================FUNÇÃO ALARME===============================//void alarme(){ }//============================================================================////======================FUNÇÃO INTERRUPÇÃO DO TIMER0==========================//#int_TIMER0 //Interrupção do TMR0void TIMER0_isr(void) { if(input(bt_aut_manual)) //se botão aut/manual pressionado { delay_ms(200); //aguarda 200mS status++; // incrementa a variavel status++ if(status==2) //se status =2 { status=0; //status assume valor 0 } } if(status==0) // Sistema em operação manual { manual(); //chama a função manual } else if(status==1) // Sistema em operação automatico { if(input(sensor)) //Se sensor em nivel 1 { sentido_horario(); //Chama a função sentido horário } else //Se sensor em nivel 0 { sentido_antihorario(); //Chama a função sentido antihorário } } } void main(){ inicio(); //chama a função inicio setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64); // configura o TMR0 para clock interno e prescaler dividindo por 64 set_timer0 (131); // inicia o timer 0 em 131 enable_interrupts (global | int_timer0); // habilita interrupções while (true); // espera pela interrupção }
  2. Entendi.... porém quando eu uso o delay ms o programa fica parada aguardando a esse tempo para depois tomar uma ação, correto ? Pois eu preciso de algo que gire o motor e conte o tempo ao mesmo tempo. Não sei se deu para entender muito bem......
  3. Boa noite galera , estou querendo acender leds atraves do rotacionamento de bits, porém não sei como fazer. A ideia é a seguinte: a cada 1 segundo tenho o estouro do timer0, e gostaria que esse estouro rotacionasse a minha saida . No primeiro estouro a saida RB0 vai a nivel 1 e as demais em nivel 0, no proximo estouro a saida RB1 vai a nível 1 e as demais em nível zero e assim por diante, até chegar na saida RB7. Já fiz utilizando a função i++, e a função case e funcionou, porém gostaria de aprender essa nova função. Segue o programa que fica piscando o led a cada 1 segundo utilizando o TMR0. //****************************************************************************//// Configurar o TMR0 (8 bits) para que gere interrupções a cada 1 segundo. ////****************************************************************************////****************************************************************************//// Vamos considerar que o CLK da CPU = 4 MHz.// O clock interno será (4MHz/4) = 1 MHz // Frequencia(F) = 1 / Periodo -----------> Periodo(T) = 1/Frequencia// Logo T = 1/1MHz = 1us. Logo a cada 1us TMR0 avança uma unidade.//// Como queremos gerar interrupções a cada 1 segundo, a freqüência de geração // dessas interrupções deverá ser de 1 Hz.//// Entretanto o clock interno funciona em uma freqüência 1.000.000 maior que 1Hz.// Usar o TMR0 sem o recurso do PRESCALER, necessitaria contar // 1.000.000 / 256 = 3906,25 interrupções.Isto se torna inviavel.//// Para resolver esse problema configuraremos o divisor de frequencia (PRESCALER)// Vamos considerar que o CLK da CPU = 4 MHz. Logo o CLK interno é de 1 MHz.// Se o PRESCALER estiver programado em 1:64, a freqüência de entrada no TMR0 // será de 1 MHz : 64 = 15625 Hz.//// setup_timer0 (RTCC_INTERNAL | RTCC_DIV_64); configuração do PRESCALER//// Se programarmos o TMR0 para dividir esse sinal 15625 por 125,// teremos um sinal de saída de 125 Hz, para isso, basta carregá-lo// a cada estouro de contagem com o valor:// 256– 125 = 131.// set_timer0 (131); Inicialização do TMR0////Dessa forma após 125 interrupções,1s terá passado.//****************************************************************************//#include <16F876A.h> //inclusão das configurações do pic utilizado #use delay(clock=4000000) //clock interno#fuses HS,NOWDT,PUT,NOLVP //configurações dos fusiveis#define led pin_b0 //definição da saida LEDint contador;#int_TIMER0 //Interrupção do TMR0void TIMER0_isr(void) { set_timer0(131 + get_timer0()); //Inicializa o TMR0 com o valor 131 contador++; //Incrementa a variavel contador a cada estouro de TMR0 if(contador == 125) /*Após imcrementrar 125 vezes o TMR0, reseta a variavel contador e inverte a saida através da função output_toggle*/ { contador = 0; output_toggle(led); }}void main(){ setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_64); // configura o TMR0 para clock interno e prescaler dividindo por 64 set_timer0 (131); // inicia o timer 0 em 131 enable_interrupts (global | int_timer0); // habilita interrupções while (true); // espera pela interrupção } Tem a função << que serve para rotacionar os bits, porém não sei como utilizar . Alguem poderia me ajudar ???
  4. Boa noite galera, estou desenvolvendo uma mini bobinadeira de papel. porém estou com duvidas e gostaria da ajuda do pessoal do forum. Segue a minha lógica que quero fazer. Quando o sensor esta em nivel 1 liga um motor de passo para o sentido horario, Quando o sensor esta em nivel 0 liga um motor de passo para o sentido anti -horario, porém este sensor caso detecte o nivel 0 ou 1 por mais de 3 segundos consecutivos, o mesmo deve desligar os motores de passo e acionar um relé. O sistema só volta na condição normal quando o botão reset for pressionado. Qual a melhor maneira de se fazer isso ?
  5. Necessito somente gravar o arquivo hex no pic com esse kit.
  6. Boa noite galera, acabei de adquirir um kit educacional da microgenios PICGENIOS 18F conforme a figura juntamente com um gravador PICKIT3 da microchip. Alguem poderia me ajudar a dar os primeiros passos com esse kit ou com o gravador.
  7. Segue a programação até aonde consegui pensar" rsrs. Qualquer ajuda será bem vinda. O hardware eu post depois pois o mesmo não esta pronto no proteus. Eu irei utilizar um ULN2003 para o acionamento do motor de passo, é um motor de 5v bem simples, não testei na pratica mas vi muitos posts a respeito desse CI com motor de passo. Tem como deixar o código mais "enxuto" na parte de acionamento do motor de passo ? #include <16F628A.h> //Microcontrolador a ser utilizado no projeto #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD) #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #use delay(clock=4000000) #define saida_0 PIN_A1 // pino RA1 aciona entrada 1 do ULN2003 #define saida_1 PIN_A2 // pino RA2 aciona entrada 2 do ULN2003 #define saida_2 PIN_A3 // pino RA3 aciona entrada 3 do ULN2003 #define saida_3 PIN_A4 // pino RA4 aciona entrada 4 do ULN2003 #define led_vermelho PIN_A0 // pino RA0 aciona led vermelho //========================Declarações das entradas do PIC====================== #define bt_controle_automático PIN_B0 //pino RB0 controle do sistema em automatico #define bt_controle_manual PIN_B1 //pino RB1 controle do sistema em manual #define bt_manual_horario PIN_B2 //Pino RB2 botão manual para ligar motor sentido horario #define bt_manual_antihorario PIN_B3 //Pino RB3 botão manual para ligar motor sentido antihorario //===================== Declarações das variaveis globais ====================== //==================== FUNÇÃO MOTOR GIRANDO SENTIDO HORARIO ==================== //Função responsável por girar o motor no sentido horario void motor_girando_sentido_horario() { // sera a mesma função do sentido horario porém com a ordem invertida } //================== FUNÇÃO MOTOR GIRANDO SENTIDO ANTIHORARIO ================== //Função responsável por girar o motor no sentido antihorario. //Sera utilizado o passo completo ( FULL STEP) aonde 2 bobinas são energizadas // a cada passo, pois possui maior torque do que os demais métodos. // NUMERO DO PASSO A3 A2 A1 A0 DECIMAL // PASSO 1 1 1 0 0 12 // PASSO 2 0 1 1 0 6 // PASSO 3 0 0 1 1 3 // PASSO 4 1 0 0 1 9 void motor_girando_sentido_antihorario() { //Passo 1 output_high(saida_3); output_high(saida_2); output_low(saida_1); output_low(saida_0); delay_ms(200); //define velocidade do passo do motor //Passo 2 output_low(saida_3); output_high(saida_2); output_high(saida_1); output_low(saida_0); delay_ms(200); //define velocidade do passo do motor //Passo 3 output_low(saida_3); output_low(saida_2); output_high(saida_1); output_high(saida_0); delay_ms(200); //define velocidade do passo do motor //Passo 4 output_high(saida_3); output_low(saida_2); output_low(saida_1); output_high(saida_0); delay_ms(200); //define velocidade do passo do motor } //================= FUNÇÃO MANUAL CONTROLE DO MOTOR DE PASSO ================== //Controla o sentido de giro do motor de passo em manual void controle_manual() { output_high(led_vermelho); //acende led vermelho if(input(bt_manual_horario)&& input(bt_manual_antihorario==0)) // Se botão manual_horario estiver pressionado e botão manual_antihorario //não estiver pressionado { delay_ms(50); //aguarda 50ms motor_girando_sentido_horario(); //chama a função que gira o motor no //sentido horario. } else if(input(bt_manual_antihorario)&& input(bt_manual_horario==0)) // Se botão manual_ianthorario estiver pressionado e //botão manual_horario não estiver pressionado { delay_ms(50); //aguarda 50ms motor_girando_sentido_antihorario(); //chama a função que gira //o motor no sentido horario. } } //============================================================================= //============================FUNÇÃO PRINCIPAL================================= void main() { while(TRUE) { controle_manual(); //Chama a função que controla sentido de giro //do motor de passo em manual }
  8. Ajudou sim, é que não sabia se tinha alguma outra maneira de fazer; Obrigado pelas dicas foram muito uteis, assim que tiver algo a mais no meu projetinho eu comento com vocês ai . Obrigado.
  9. Galera estou precisando de uma ajuda com a programação de um PIC 16f628A. Vou tentar explicar o que eu quero fazer: Meu hardware possui 4 botões tipo pulsador, 3 leds, e 1 motor de passo. 1 botão controle manual 1 botão controle automático 1 botão manual liga motor sentido horário 1 botão manual - liga motor sentido anti horário 1 led azul - controle automático 1 led amarelo - controle manual 1 led vermelho - alarme A lógica de funcionamento é a seguinte: Ao ligar o circuito devera ocorrer a seguinte ação: -Controle entra em modo MANUAL; -Se eu apertar o botão manual liga motor sentido horario, o motor de passo devera girar no sentido horario; -Se eu apertar o botão manual liga motor sentido antihorario, o motor de passo devera girar no sentido antihorario; -Caso eu não pressione nenhum dos botões acima o motor de passo fica parado. -Liga Led vermelho sempre que estiver em modo MANUAL Caso eu aperte o botão pulsador MODO AUTOMÁTICO devera ocorrer as seguintes ações: -Desabilitar o controle manualmente do motor de passo através dos botões manual liga motor sentido antihorario e manual liga motor sentido horario; -Apaga Led vermelho -Liga led amarelo - motor de passo assume um controle automático conforme programado na função Caso eu aperte o botão modo Manual novamente ele retoma para controle MANUAL conforme explicado acima. Caso eu aperte o botão modo Automatico novamente ele retoma para controle MODO AUTOMATICO conforme explicado acima. Alguem pode me ajudar a implementar essa rotina. Estou usando o CCS COMPILER. A medida que for realizando o código vou postando, porém tenho muitas duvidas. Fico no aguardo e obrigado.
  10. Fala galera, tenho a seguinte duvido. Estou desenvolvendo uma placa para controlar um motor de passo e estou com a seguinte duvida. O microcontrolador PIC aceita no máximo 5Vcc na entrada, porém o sinal que ira para a entrada desse microcontrolador estará vindo de um sensor com alimentação de 12Vcc. Qual a maneira mais segura e correta de estar recebendo esta alimentação sem danificar o pic. Seria o correto utilizar um divisor de tensão ?
  11. Alguem sabe algum drive que suporte essa corrente de 0,68A ?

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×