Ir ao conteúdo
  • Cadastre-se

Vinicius Cintra

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

Reputação

0
  1. Boa noite advtec, Eu havia resolvido o problema, decobri que, como você mencionou, ocorre que a int_RB quando acionada não pára de ser executada, enquanto não fizer uma leitura da porta B dentro da interrupção(nem que seja um pino, mais deve ser lido dentro da interrupção) ou zerar a flag bit RBIF, li isso no datasheet do micro. Para resolver meu problema eu criei uma variável aleatória que le o pino B5, sómente para sair da interrupção e depois eu leio as portas B4 e B5. Isso porque quando pressionamos um botão ele gera várias interrupçoes no intervalo de transição dos níveis lógicos, e uma leitura durante esse intervalo de transição poderia ser erronêa. Portanto eu seto o timer pra interromper após um intervalo, que eu considero que o botão já tenha estabilizado e seja possivel ler em que nível está esse botão. Obrigado
  2. Olá, estou com com dificuldade para solucionar um problema: Estou tentando fazer a leitura de dois botões através de interrupção, e a única forma que eu achei possivel foi através da interrupção RB (#int_RB), estou usando o PIC16F887, entretanto não consigo fazer funcionar, aparentemente o micro nem entra na interrupção. Estou usando o compilador ccs, antes estava usando a versão 4.078 do compilador e achei que poderia ser erro do próprio compilador, então baixei a versão demo 5.026, mesmo assim sem sucesso. O programa é o seguinte: #include <16F887.h> #FUSES NOWDT #FUSES INTRC_IO #FUSES PUT #FUSES NOPROTECT #FUSES NOBROWNOUT #FUSES NOMCLR #FUSES NOLVP #FUSES NOCPD #use delay(internal=8000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,stream=PORT1) int1 imprimir=0; float temperatura=0; #int_RB void RB_isr(void) { imprimir=1; clear_interrupt(INT_TIMER0); set_timer0(0); enable_interrupts(INT_TIMER0); } #INT_TIMER0 void TIMER0 (void) { if(input(PIN_B4)==1){ temperatura=temperatura+1; } if(input(PIN_B5==1)){ temperatura=temperatura-1; } clear_interrupt(int_timer0); disable_Interrupts(INT_TIMER0); } void main() { setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8); enable_interrupts(INT_RB4|INT_RB5|INT_RB6|INT_RB7); enable_interrupts(GLOBAL); while(1){ if(imprimir==1){ fprintf(PORT1, "Temperatura %f\n\r", temperatura); imprimir=0; } } }
  3. @MatheusLPS Fiz as modificações que você sugeriu, entretanto não mudou o resultado. Mais consegui fazer funcionar, o erro estava nas linhas onde eu colocava "set_adc_channel(__);" Mudei e ficou funcionando assim: set_adc_channel(8); delay_ms(10); leitura = read_adc(); delay_ms(100); set_adc_channel(9); delay_ms(10); leitura2=read_adc(); delay_ms(100); set_adc_channel(10); delay_ms(10); leitura3=read_adc(); delay_ms(100); Também modifiquei a conversão da forma com que você sugeriu, acredito que fica melhor mesmo. Obrigado!
  4. Sim está setado com 8MHz no proteus também, tentei também dividir o clock mesmo assim nao muda o resultado. as ligaçoes estão na imagem.
  5. Boa tarde Estou tentando fazer uma leitura analógica de um potenciômetro através do microcontrolador PIC16F886, entretanto o resultado que ele responde é apenas 0. Quero usar as portas B1,B2 e B3 como sendo estas entradas. Código: #include <16F886.h> #device adc=10 #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPUT //No Power Up Timer #FUSES MCLR //Master Clear pin enabled #FUSES NOPROTECT //Code not protected from reading #FUSES NOCPD //No EE protection #FUSES NOBROWNOUT //No brownout reset #FUSES IESO //Internal External Switch Over mode enabled #FUSES FCMEN //Fail-safe clock monitor enabled #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NODEBUG //No Debug mode for ICD #FUSES NOWRT //Program memory not write protected #FUSES BORV40 //Brownout reset at 4.0V #use delay(clock=8000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) float leitura,leitura2,leitura3; void main() { setup_adc_ports(ALL_ANALOG | VSS_VDD); setup_adc(ADC_CLOCK_INTERNAL); setup_spi(SPI_SS_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); while(1){ set_adc_channel(sAN8); delay_ms(20); leitura = read_adc(); delay_ms(100); set_adc_channel(sAN9); delay_ms(20); leitura2=read_adc(); delay_ms(100); set_adc_channel(sAN10); delay_ms(20); leitura3=read_adc(); delay_ms(100); leitura = 5*leitura/1023; leitura2 = 5*leitura2/1023; leitura3 = 5*leitura3/1023; printf("\r\nleitura= %f",leitura); delay_ms(1000); printf("\r\nleitura2= %f",leitura2); delay_ms(1000); printf("\r\nleitura3= %f",leitura3); delay_ms(1000); } }

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