Ir ao conteúdo
  • Cadastre-se

diego.maga

Membro Pleno
  • Posts

    146
  • Cadastrado em

  • Última visita

Reputação

0
  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. Saberia me dizer como realizar esse ponteiro ?
  4. 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 ???
  5. 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 ?
  6. Necessito somente gravar o arquivo hex no pic com esse kit.
  7. 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.
  8. Boa tarde Galera, gostaria de uma ajuda, quero montar um display simples com matriz de led 8x8, conforme o video abaixo utilizando o CCS COMPILER, mas não sei a lógica para a mensagem correr nos leds, alguem poderia me ajudar. Segue um video da lógica que gostaria de fazer, o pic utilizado pode ser qualquer um , pois é algo simples. [ame= ] [/ame]
  9. Não montei ainda no protoboard, estou terminando o meu gravador de pic,assim que terminar eu vou montar no protoboard.Até mais.
  10. o erro é o mesmo que postei ai no forum, os valores das horas se alteram do nada com uns valores doidos 355:88:33
  11. Veja o funcionamento na imagem ( simulado no proteus ISIS 7.0 ) Abaixo um código exemplo do uso da biblioteca com PIC 16F877A OBS : esse código usa a biblioteca lcd_flex.c ( fornecida por mim neste tópico ) #include<16f877.h> #use delay(clock=4000000) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7) #fuses XT,NOWDT,PUT,NOBROWNOUT #include<input.c> #include<string.h> #include<stdio.h> #include<libDS1307.c> #define LCD_DB4 PIN_B4 #define LCD_DB5 PIN_B5 #define LCD_DB6 PIN_B6 #define LCD_DB7 PIN_B7 #define LCD_RS PIN_B2 #define LCD_E PIN_B3 #include<lcd_flex.c> #define BT_ajustaHora_e_mais pin_a0 //botao para entrar no ajuste de hora e dado++ #define BT_ajutaData_e_menos pin_a1 //botao para entrar no ajuste de data e dado-- #define BT_desloca_dir pin_a2 //desloca para direita #define BT_desloca_esq pin_a3 //desloca cursor para esquerda // [...] quantos botões a aplicação exigir #define ajuste_hora 1 #define ajuste_data 2 /* VAriaveis globais */ byte _dia,_mes,_ano,_dow,_hora,_min,_seg; //Variaveis que guardam os dados int op=0; // variavel que mostra qual botao foi prescionado /* Protótipo das funções */ void carrega_dados(); boolean debouce(); void trata_botoes(int op); /* Declaração das funções */ void carrega_dados() { ds1307_get_date(&_dia,&_mes,&_ano,&_dow); ds1307_get_time(&_hora,&_min,&_seg); } boolean debounce(void) { disable_interrupts(INT_TIMER1); //desabilita interrupção delay_ms(150); if((!input(BT_ajustaHora_e_mais ))|(!input( BT_ajutaData_e_menos))) { return true; } else return false; } void trata_botoes(int op) { switch(op) { case ajuste_hora: //[...] Aqui o usuario define os comando de ajuste de hora //printf("ajuste de hora\r") // linha para debug break; case ajuste_data: //[...] Aqui o usuario define os comando de ajuste de data //printf("ajuste de data\r") // linha para debug break; default: break; } } #INT_TIMER1 void atualiza_hora() { /******************************************************/ /* A interrupção é chamada a cada 1s e atualiza */ /* os dados adquiridos pelo DS1307 através do TIMER1 */ /******************************************************/ char dia_semana[7][4]={"dom","seg","ter","qua","qui","sex","sab"}; char dia_hoje[4]; set_timer1(3036-get_timer1()); ds1307_get_time(&_hora,&_min,&_seg); ds1307_get_date(&_dia,&_mes,&_ano,&_dow); strcpy(dia_hoje,dia_semana[_dow-1]); lcd_gotoxy(1,1); printf(lcd_putc,"%s - %02d/%02d/%02d",dia_hoje,_dia,_mes,_ano); lcd_gotoxy(5,2); printf(lcd_putc,"%02d:%02d:%02d ",_hora,_min,_seg); } void main() { /***************************************/ /* Configurações dos PORTS e TIMER1 e */ set_tris_b(0); set_tris_c(0b00011000); set_tris_e(1); set_tris_a(1); enable_interrupts(INT_TIMER1); setup_timer_1( T1_INTERNAL|T1_DIV_BY_8); set_timer1(3036); disable_interrupts(INT_TIMER0); enable_interrupts(GLOBAL); /**************************************/ //Inicializa o LCD e o DS1307 lcd_init(); delay_ms(1000); ds1307_init(); while(1) { /**************************************************************************/ /* Tratamento de botões /* Para o tratamento de botões pode usar as seguinte técnicas: /* >> Botoões no PORTB - trata interrupção de mundança de estado /* Vantagens: >Não é necessário scan em loop infinito /* sempre então o evento será tratado independente do tempo de prescionamento /* Desvantagens: /* >É preciso verificar qual botão foi prescionado /* para então trata-lo /* >Ruídos no PORTB podem causar mau funcionamento /* >> Scan dos butões /* Vantagens /* >Maior estabilidade contra ruídos /* >Cada botão pode ter sua própria função() /* Desvantagens /* >Tempo é crítico /* >Debounce necessita ter outras interrupções desativadas /* Neste programa será usado o scan /* Apenas um modelo como a implementação é trabalhosa não foi feita aqui /**************************************************************************/ if((!input(BT_ajustaHora_e_mais ))) { if(debounce()) { op = ajuste_hora; trata_botoes(op); } } else if((!input(BT_ajutaData_e_menos))) { if(debounce()) { op = ajuste_data; trata_botoes(op); } } enable_interrupts(INT_TIMER1); //após tratar os botões habilita interrupção } } Espero ter ajudado! Abraço! Ola alyson tentei montar aqui o circuito e o codigo fonte,porém o mesmo esta dando erro.será que você não poderia postar um codigo fonte sem ajustes das horas, somente para mostrar as horas no display. Ola alyson tentei montar aqui o circuito e o codigo fonte,porém o mesmo esta dando erro.Será que você poderia postar um codigo fonte sem ajustes das horas, somente para mostrar as horas no display. Ola gostaria de saber se você consegui resolver este problema,pois tambem estou enfrentando o mesmo problema que você.Se você consegui resolver,poderia me ajudar.Tambem uso o ccs.Obrigado
  12. Muito obrigado vou fazer os testes aqui depois eu comento aqui.Muito obrigado pela sua disposição em ensinar ao proximo,parabens pra você. AlyssonMachado não abusando da sua boa vontade será que daria pra você fornecer o arquivo do proteus do relogio com ajustes que você fez.obrigado
  13. Abaixo o exemplo de uso do driver DS1307.c: #include <ds1307.c> #include <lcd.c> #define I2C_SCL PIN_C3 #define I2C_SDA PIN_C4 #use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3) int1 flag=1; int a_seg; void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); lcd_init(); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); lcd_init(); ds1307_init(); //Exemplo: 09/07/2010 (data) // 23:20:00 (hora) ds1307_set_date_time(9,7,10,00,23,20,0); a_seg = seg; while(TRUE) { ds1307_get_time(hora,mim,seg); ds1307_get_date(dia,mes,ano,dow); If(a_seg!=seg) { printf(lcd_putc,"\f %02i:%02i:%02i\n %02i/%02i/%02i",hora,mim,seg,dia,mes,ano); a_seg=seg; } } } #include "C:\Program Files (x86)\PICC\Projetos\Projects\PIC 16f877A\Transmissor [Versao A].h" Como podem ver o uso é bem simples, é so utilizar o comando ds1307_set_date_time(), ds1307_get_date(),ds1307_get_time() para obter os valores correspondentes. Mas como eu citei, o driver funciona com alguns erros: - O DS1307 não "memoriza" a hora anterior, mesmo estando ligado a bateria. - Quando o PIC é ligado sem utilizar o comando ds1307_set_date_time o valor exibido é "00:00:00". - E quando é utilizado o comando ds_1307_set_date_time o DS1307 sempre inicia na mesma hora configurada (óbvio), sendo assim interrompendo a contagem anterior. Gostaria de saber se alguém poderia me disponibilizar algum driver do DS1307 que funcione corretamente. Desde já agradeço pela ajuda. Ola eu tambem estou tendo a mesma dificuldade que você estava enfrentando em relação a biblioteca ds1307, gostaria de saber se você chegou a alguma conclusão e se possivel postar o codigo.obrigado Ola alyson, eu vi que você entende e muito de programação e gostaria de saber se você consegue arrumar a biblioteca do ds13o7 que esta dando erro ,no qual o felipezero se refere.Eu utilzei somente no proteus essa biblioteca e de repente as horas se alteram sosinha tipo 315:67:88 uns valores doidos e não sei o que fazer

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...