Ir ao conteúdo
  • Cadastre-se

Joao Fabri

Membro Pleno
  • Posts

    24
  • Cadastrado em

  • Última visita

Reputação

3
  1. Estou realizando um projeto de conversão AD em que utilizo o RA0 como entrada analogica, porém ao compilar apresenta erro ''unresolved exter 'ADC_Ready'" na linha 0 do codigo fonte... Alguem pode me ajudar ? unsigned int valorad = 0; // variavel para leitura AD unsigned int ADC_Ready (unsigned short ) ; void main() { ADCON0 = 0b01000000; ADCON1 = 0b10000000; ANSELH = 0x00; ANSEL = 0x01; TRISA = 0b00001111; TRISB = 0x00; TRISC = 0x00; PORTB = 0x00; PORTC = 0b00001000; ANSELH = 0xFF; ADC_Init () ; while (1) { Delay_ms(5); ADC_Get_Sample(0); ADC_Ready (0); valorad = ADC_Ready (0) ; PORTB = valorad; } }
  2. Boa Noite, desenvolvi um código para quando determinado botão for acionado os LEDS ligados ao PORTB serão acionados de uma sequencia diferente.. o codigo compila e funciona quando gravado no PIC, porém ao desligar a alimentação e ligar novamente o programa foi apagado e não funciona mais nada... Só resolve regravando e assim vai... O que poderia ser ? Segue programa comentado.. #define B1 RA3_bit #define B2 RA4_bit #define B3 RA5_bit #define B4 RE3_bit #define LED1 RB0_bit #define LED2 RB1_bit #define LED3 RB2_bit #define LED4 RB3_bit #define LED5 RB4_bit #define LED6 RB5_bit #define LED7 RB6_bit #define LED8 RB7_bit void interrupt () // função de interrupção { if (T0IF_bit) // Testa Flag estouro TMR0 { T0IF_bit = 0x00; // Limpa flag TMR0 = 0x69; // Reenicia TMR0 if (B1 == 0) // Se B1 for pressionado segue a sequencia de funcionamento { // dos leds Delay_us (40); LED8 = 1; Delay_ms(100); LED7 = 1; Delay_ms(100); LED6 = 1; Delay_ms(100); LED5 = 1; Delay_ms(100); LED4 = 1; Delay_ms(100); LED3 = 1; Delay_ms(100); LED2 = 1; Delay_ms(100); LED1 = 1; Delay_ms(100); PORTB = 0x00; } if (B2 == 0) // Se B2 foi pressionado segue sequencia { // de funcionamento dos leds Delay_us (40); LED1 = 1; Delay_ms(100); LED2 = 1; Delay_ms(100); LED3 = 1; Delay_ms(100); LED4 = 1; Delay_ms(100); LED5 = 1; Delay_ms(100); LED6 = 1; Delay_ms(100); LED7 = 1; Delay_ms(100); LED8 = 1; Delay_ms(100); PORTB = 0x00; } if (B3 == 0) // Se B3 foi pressionado segue a sequencia { // de funcionamento dos leds Delay_us (40); LED5 = 1; Delay_ms(100); LED4 = 1; Delay_ms(100); LED6 = 1; Delay_ms(100); LED3 = 1; Delay_ms(100); LED7 = 1; Delay_ms(100); LED2 = 1; Delay_ms(100); LED8 = 1; Delay_ms(100); LED1 = 1; Delay_ms(100); PORTB = 0x00; } if (B4 == 0) // Se B4 foi pressionado segue sequencia { // de funcionamento dos leds PORTB = 0xFF; Delay_ms(500); PORTB = 0x00; Delay_ms(500); } else PORTB = 0x00; } } void main() { OPTION_REG = 0b00001110; // TMR0, Prescaller 1:128 GIE_bit = 0x01; // Habilita interrupção geral PEIE_bit = 0x01; // Habilita interrupção por perifericos internos T0IE_bit = 0x01; // Habilita interrupção por estouro TMR0 TMR0 = 0x69; // Inicia TMR0 para contagem de 150 (tempo de estouro 20ms) ANSEL = 0x00; // todas como pinos digitais ANSELH = 0x00; // todos como pinos digitais TRISB = 0x00; TRISA = 0b00111000; TRISE.RE3 = 0x01; TRISC.RC3 = 0x00; PORTA = 0b00111000; PORTB = 0x00; RC3_bit = 0x01; RE3_bit = 0x01; while (1) { PORTB = 0xFF; // enquanto nada acontece todos os LEDS ficam acesos } } adicionado 1 minuto depois Segue os fusesbits
  3. Boa noite, estou gerando um código com o seguinte funcionamento: Se minhas três entradas (Segurança, Pressostato, Gatilho) estiverem acionados. Quando os três forem acionados, deve ligar relê 1 e relê 2. Ao passar um tempo de no máximo 2 segundos o relê 3 deve entrar também. Qualquer um das três entradas que saírem os relês devem cair. Se segurança estiver despressionado ascende um led indicativo. Se pressostato estiver despressionado ascende um led indicativo. *********************************************************** A logica esta funcionando mas porém estou com muitos atrasos no codigo, os tempos não estão conforme os programados, alguem teria uma dica para melhorar meu código ??? Segue código comentado: #define Gatilho RA0_bit #define segurança RA1_bit #define Pressostato RA2_bit #define rele1 RB0_bit #define rele2 RB1_bit #define rele3 RB2_bit #define led1 RB3_bit #define led2 RB4_bit #define led3 RB5_bit void funcionamento (void); // função que aciona os reles void interrupt () // rotina de interrupção { if (T0IF_bit) // Se houve estouro do TMR0 { T0IF_bit = 0x00; // limpa flag TMR0 = 0x96; // Reinicia TMR0 funcionamento (); // chama função dos relês } } void main() { unsigned char aux = 0; // variavel auxiliar OPTION_REG = 0b10001110; // Desabilita resistor pullup, prescaller 1:128 GIE_bit = 0x01; // Liga interrupção global PEIE_bit = 0x01; // Habilita interrupção por perifericos internos T0IE_bit = 0x01; // Habilita interrupção por estouro do tmr0 TMR0 = 0x96; // Inicia tmr0 ANSEL = 0x00; // todos pinos como digitais ANSELH = 0x00; // todos os pinos como digitais TRISA = 0xFF; TRISB = 0x00; PORTA = 0xFF; PORTB = 0x00; } void funcionamento () // função acionamento dos reles { unsigned char sett = 0; // variavel auxiliar if (Pressostato == 1) // Se pressostato estiver aberto { led1 = 1; // ascende led1 } else { led1 = 0; } if (segurança == 1) // Se segurança estiver aberto { led2 = 1; // ascende led2 } else { led2 = 0; } if (Gatilho == 0 && segurança == 0 && Pressostato == 0) // Se todos estiverem pressionados { rele1 = 1; rele2 = 1; sett = 1; } if (sett == 1 ) { sett = 0; Delay_ms (200); rele3 = 1; } else if (Gatilho == 1 || segurança == 1 || Pressostato == 1) { rele1 = 0; rele2 = 0; rele3 = 0; } }
  4. @Bommu Perneta obrigado mais uma vez, aprendo bastante com você kkkk agora partiu incrementar mais este código
  5. @Bommu Perneta ok assim que testar os btoes por favor de uma luz kkk
  6. cara mesmo inicializando o duty1 não vai... parece q ele não esta lendo o laço de condição
  7. @Bommu Perneta retirei o laço de condição e setei um valor de duty para 50% ai foi, porque sera que meu laço de condição não funciona ?
  8. @Bommu Perneta RE3 é o pino 1 que quando desabilitado o Master clear ele vira um pino de uso geral. O código não foi copiado eu elaborei e quando me refiro a B1 B2 B3 me refiro aos pinos que ja configurei no começo do programa com as diretivas define.
  9. Bom dia, estou elaborando um código com o PIC 16f883, o código consiste em gerar um PWM no pino CCP1 de 5Khz e com duty cicle incrementado através de BOT1 e BOT2, porém na simulação do protheus nada ocorre, estou tendo um problema com esse mic em desabilitar os comparadores internos, mas não sei se isso interfere em algo nesse codigo. Segue código comentado.... #define BOT1 RE3_bit #define BOT2 RA3_bit #define BOT3 RA4_bit #define BOT4 RA5_bit unsigned short duty1; void main() { TRISE.RE3 = 0x01; // RE3 como entrada TRISA = 0b00111000; // RA3,RA4,RA5 como entrada TRISC = 0x00; // Todo PORTC como saida PORTE = 0b00001000; // Inicializa RE3 em 1 PORTA = 0b00111000; // Inicializa os botoem em 1 PORTC = 0x00; PWM1_Init(5000); // Inicializa PWM1 com frequencia de 5Khz PWM1_Start(); // Inicializa PWM1 PWM1_Set_duty (duty1); // Seta o duty cicle com o valor da variavel duty1 while(1) { if (BOT1 == 0) // Testa se B1 foi pressionado { duty1 ++; // Se sim, incrementa duty cicle pwm1 } if (BOT2 == 0) // Testa de B2 foi pressionado { duty1 --; // Se sim, decrementa duty cicle pwm1 } } // and while } // anda main adicionado 2 minutos depois Segue os Fuses bits
  10. @Bommu Perneta nossa é verdade, e no meu hardware sem querer eu estava usando o pino G do display no pino RB7 invés de RB6 por isso não ascendia... Cara agora eu tenho uma outra duvida sobre esse meu mic, eu acompanho wr kits no youtube e la ele sempre desliga os comparadores qundo não vai usar através do comando CMCON = 0x07 mas quando vou tentar colocr isso no meu codigo ele da erro, sera que meu mic em questão usa um registrador diferente para tratar os compardores ?? Obrigado
  11. meu codigo esta assim agora, esta funcionando normalmente no protheus a cada pressionada do botão e incrementa um valor no display, porém o led que esta ligado ao pino RB7 nunca acende, este pino independente do de qualquer coisa so esta ficando em nivel baixo... Segue o codigo #define B1 RE3_bit unsigned char catodo, cont = 0x00; // variaveis auxiliares unsigned char segmento[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; // vetor para display 7seg void interrupt () { if (T0IF_bit) // testa flag de estouro tmr0 { T0IF_bit = 0; // limpa flag TMR0 = 0x00; if (B1 == 0) { cont ++; Delay_ms(250); } // inicia tmr0 em 160 } } void main () { OPTION_REG = 0b10000111; // Desabilitando resistores de puldow, oscilador interno, prescaller 1:256 TMR0 = 0x00; // inicia tmr0 em 0 INTCON.GIE = 1; // habilita interrupçao global INTCON.PEIE = 1; // habilita interrupçao por perifericos internos INTCON.T0IE = 1; // habilita interrupçao por estouro timer 0 TRISE = 0b00001000; TRISB = 0b00000000; PORTB = 0b00000000; PORTE = 0b00001000; ANSELH = 0; while (1) { catodo = segmento [cont]; // atribui o vetor segmento com o parametro cont há variavel catodo PORTB = catodo; if (cont > 9) // limite de contagem ate 9 { cont = 0; } } }
  12. @Bommu Perneta na verdade eu não copiei a parte das diretivas ''B1'' é na verdade RB3_bit, e eu não entendi muito bem o lance sobre ANSELH, este registrador não configura apenas os pinos do PORTA se eles sarão analógicos ou digitais ? adicionado 1 minuto depois @Isadora Ferraz poderia ser mais especifica como eu deveria mudar minha logica ??
  13. Bom dia, estou desenvolvendo um código para incrementar a contagem em um display de 7 segmentos a cada vez que o botão B1 for pressionado, para otimizar meu código eu decidi fazer a varredura dos botões através das interrupções, então em um tempo de aproximadamente 20ms eu testo meu botão B1 através do estouro do TMR0... porém como nunca é do jeito que a gente quer meu código não esta rodando perfeitamente no protheus, alguém sugeri o motivo ? Segue código comentado... unsigned char catodo, cont = 0x00; // variaveis auxiliares unsigned char segmento[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67}; // vetor para display 7seg void interrupt () { if (T0IF_bit) // testa flag de estouro tmr0 { T0IF_bit = 0; // limpa flag TMR0 = 0xA0; // inicia tmr0 em 160 if (B1 == 0) // se b1 pressionado... { cont ++; // cont ++ Delay_ms(150); } } } void main () { OPTION_REG = 0b10000110; // Desabilitando resistores de puldow, oscilador interno, prescaller 1:256 TMR0 = 0xA0; // inicia tmr0 160 INTCON.GIE = 1; // habilita interrupçao global INTCON.PEIE = 1; // habilita interrupçao por perifericos internos INTCON.T0IE = 1; // habilita interrupçao por estouro timer 0 TRISE = 0b00001000; TRISC = 0b00000000; TRISB = 0b00000000; PORTB = 0b00000000; PORTC = 0b00100000; PORTE = 0b00001000; while (1) { catodo = segmento [cont]; // atribui o vetor segmento com o parametro cont há variavel catodo PORTB = catodo; if (cont > 9) // limite de contagem ate 9 { cont = 0; } } }
  14. @Bommu Perneta é esse codigo é da WR Kits, na ocasiao ele usa um 16f628a.. como eu adquiri uma placa para desenvolvimento que contem o 16f883 então preciso me familiarizar com ele... ele tem alguuns fusiveis que ainda n entendi mt bem... essa semana vou gerar mais alguns codigos para treino e se der algo errado de novo voce me socorre kkkkk
  15. @Bommu Perneta caraca cara você salvou meu código !!!! Não foi bem uma cópia kkk eu entendi e compreendi tudo que contem nele... Então você matou a xarada, não era que o timer não estava estourando e sim que bit não estava invertendo.... espero um dia conseguir visualizar os defeitos no código assim tambem... Valeuuu adicionado 1 minuto depois @Bommu Perneta so não entendi porque não inverteu, na linguagem C o ~ inverte o valor do bit correto ?

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