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.

Pesquisar na Comunidade

Mostrando resultados para as tags ''PIC''.



Mais opções de pesquisa

  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo


Categorias

  • Armazenamento
  • Áudio
  • Energia
  • Entrada
  • Feiras e Eventos
  • Gabinetes
  • Memória
  • Museu
  • Placas-mãe
  • Portáteis
  • Processadores
  • Programas
  • Rádio CdH
  • Redes
  • Refrigeração
  • Smartphones
  • Tablets
  • Vídeo
  • Outros

Categorias

  • Blog

Categorias

  • Armazenamento
  • Áudio
  • Câmeras
  • Computadores
  • Consoles
  • Eletrônicos
  • Energia
  • Entrada
  • Gabinetes
  • Impressão
  • Jogos
  • Memória
  • Placas-mãe
  • Portáteis
  • Processadores
  • Programas
  • Redes
  • Refrigeração
  • Smartphones
  • Tablets
  • Vídeo
  • Outros

Categorias

  • Livros disponíveis
  • Livros esgotados

Categorias

  • Cursos

Fóruns

  • Mensagens do Clube do Hardware
    • Regras gerais
    • Boletins do Clube do Hardware
    • Notícias da administração
  • Hardware
    • Recomendações de computadores
    • Placas de vídeo
    • Placas-mãe e chipsets
    • Processadores
    • Problemas de gargalo e desempenho
    • Memórias
    • Armazenamento
    • Refrigeração e superaquecimento
    • Fontes e energia
    • Gabinetes e casemods
    • Placas de som e áudio on-board
    • Periféricos
    • Mac
    • Overclock
    • Hardware - outros
  • Computação móvel
    • Notebooks
    • Tablets
    • Smartphones e apps
  • Redes e Internet
    • Redes e Internet
    • Hospedagem de sites e registro de domínios
  • Segurança da informação
    • Remoção de malware
    • Dúvidas sobre invasões e infecções
    • Programas de proteção
  • Programação e desenvolvimento
    • Java
    • C/C#/C++
    • Pascal/Delphi
    • .NET
    • Bancos de dados
    • Programação web
    • Programação - iniciantes
    • Programação de microcontroladores
    • Programação - outros
  • Software
    • Jogos
    • Pacotes de escritório
    • Computação distribuída (Folding@Home, Bitcoin etc.)
    • Virtualização
    • Design, animação e tratamento de imagens
    • Edição de áudio e vídeo
    • Programas
  • Sistemas Operacionais
    • Recomendação de sistemas operacionais
    • Windows
    • GNU/Linux, BSD, Unix-like e software livre
    • Mac OS
  • Eletrônicos
    • Equipamentos de som, home theaters e gravadores de mesa
    • Televisores e projetores
    • Câmeras e filmadoras
    • Players portáteis
    • Consoles (videogames)
    • GPS
    • Telefonia fixa
    • Eletrônica
    • Retrocomputação
  • Outros
    • Recomendações de serviços e lojas
    • Preços e promoções
    • Notícias
    • Bolsa de empregos, certificações e mercado de trabalho
    • "Causos"
    • Encontros de usuários
    • Feira do Rolo
  • Clube do Hardware
    • Comentários, elogios, críticas, sugestões e questões sobre o Clube do Hardware
    • Comentários de artigos
    • Fórum para testes de funcionalidades

Categorias

  • Hardware
  • Redes
  • Eletrônica
  • Sistemas operacionais

Encontrado 86 registros

  1. Estou aprendendo a usar o i2c, mas ainda não achei uma biblioteca para o mplab x ide, xc8. Alguém teria como me mandar alguma lib, ou um link para ela?
  2. Estou testando comunicar o módulo RF 433Mhz via USART, usando o PIC18F4550. Instalei os arquivos deste módulo no Proteus 8 e simulando no programa funcionou normalmente. Já no físico (protoboard), não funcionou. A função do código é simplesmente enviar um char por serial e recebê-lo no mesmo PIC para ligar ou desligar o LED. No meu caso, o LED permanece sempre desligado. Já no Proteus, ele fica piscando. Utilizo o MPLAB IDE com compilador XC8, e estou utilizando a biblioteca usart.h da PLIB. O baud rate que configurei foi de 4800, tanto no Proteus como no MPLAB. Utilizo cristal de 20Mhz, mas configurei para FOSC de 48Mhz utilizando PLL. Segue abaixo o código para MPLAB e Proteus, e em anexo está os arquivos do Proteus. #include <xc.h> #include <stdio.h> #include <stdlib.h> #include <plib/usart.h> #define _XTAL_FREQ 20000000 // CONFIG1L #pragma config PLLDIV = 5 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly)) #pragma config CPUDIV = OSC1_PLL2// System Clock Postscaler Selection bits ([Primary Oscillator Src: /1][96 MHz PLL Src: /2]) #pragma config USBDIV = 2 // USB Clock Selection bit (used in Full-Speed USB mode only; UCFG:FSEN = 1) (USB clock source comes directly from the primary oscillator block with no postscale) // CONFIG1H #pragma config FOSC = HSPLL_HS // Oscillator Selection bits (HS oscillator (HS)) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled) #pragma config IESO = OFF // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled) // CONFIG2L #pragma config PWRT = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOR = OFF // Brown-out Reset Enable bits (Brown-out Reset disabled in hardware and software) #pragma config BORV = 1 // Brown-out Reset Voltage bits (Setting 2 4.33V) #pragma config VREGEN = OFF // USB Voltage Regulator Enable bit (USB voltage regulator disabled) // CONFIG2H #pragma config WDT = OFF // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit)) #pragma config WDTPS = 32768 // Watchdog Timer Postscale Select bits (1:32768) // CONFIG3H #pragma config CCP2MX = OFF // CCP2 MUX bit (CCP2 input/output is multiplexed with RB3) #pragma config PBADEN = OFF // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset) #pragma config LPT1OSC = OFF // Low-Power Timer 1 Oscillator Enable bit (Timer1 configured for higher power operation) #pragma config MCLRE = OFF // MCLR Pin Enable bit (RE3 input pin enabled; MCLR pin disabled) // CONFIG4L #pragma config STVREN = OFF // Stack Full/Underflow Reset Enable bit (Stack full/underflow will not cause Reset) #pragma config LVP = OFF // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled) #pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming Port (ICPORT) Enable bit (ICPORT disabled) #pragma config XINST = OFF // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode)) // CONFIG5L #pragma config CP0 = OFF // Code Protection bit (Block 0 (000800-001FFFh) is not code-protected) #pragma config CP1 = OFF // Code Protection bit (Block 1 (002000-003FFFh) is not code-protected) #pragma config CP2 = OFF // Code Protection bit (Block 2 (004000-005FFFh) is not code-protected) #pragma config CP3 = OFF // Code Protection bit (Block 3 (006000-007FFFh) is not code-protected) // CONFIG5H #pragma config CPB = OFF // Boot Block Code Protection bit (Boot block (000000-0007FFh) is not code-protected) #pragma config CPD = OFF // Data EEPROM Code Protection bit (Data EEPROM is not code-protected) // CONFIG6L #pragma config WRT0 = OFF // Write Protection bit (Block 0 (000800-001FFFh) is not write-protected) #pragma config WRT1 = OFF // Write Protection bit (Block 1 (002000-003FFFh) is not write-protected) #pragma config WRT2 = OFF // Write Protection bit (Block 2 (004000-005FFFh) is not write-protected) #pragma config WRT3 = OFF // Write Protection bit (Block 3 (006000-007FFFh) is not write-protected) // CONFIG6H #pragma config WRTC = OFF // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) are not write-protected) #pragma config WRTB = OFF // Boot Block Write Protection bit (Boot block (000000-0007FFh) is not write-protected) #pragma config WRTD = OFF // Data EEPROM Write Protection bit (Data EEPROM is not write-protected) // CONFIG7L #pragma config EBTR0 = OFF // Table Read Protection bit (Block 0 (000800-001FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR1 = OFF // Table Read Protection bit (Block 1 (002000-003FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR2 = OFF // Table Read Protection bit (Block 2 (004000-005FFFh) is not protected from table reads executed in other blocks) #pragma config EBTR3 = OFF // Table Read Protection bit (Block 3 (006000-007FFFh) is not protected from table reads executed in other blocks) // CONFIG7H #pragma config EBTRB = OFF // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) is not protected from table reads executed in other blocks) void Mydelay(int tempo) { int i; for (i=0;i<tempo;i++) { __delay_ms(1); } } void main(void) { ADCON1 = 0x0F; TRISD = 0; OpenUSART( USART_TX_INT_OFF & // No tx interrupt. USART_RX_INT_ON & // No rcv interrupt. USART_ASYNCH_MODE & // Asynchronous mode. USART_EIGHT_BIT & // Eight-bit mode. USART_CONT_RX & // Continuous receive. USART_BRGH_LOW, // Use low speed baud rate formula. 155 // Baud 4800 ); Mydelay(100); unsigned char teste = 'a'; unsigned char ch = 'a'; int cont = 0; while(1) { WriteUSART(teste); //Mydelay(5); ch = ReadUSART(); if(ch=='a') LATDbits.LD7 = 1; else LATDbits.LD7 = 0; Mydelay(1000); if(cont == 1) { teste = 'b'; cont = 0; } else { teste = 'a'; cont = 1; } } return; } Agradeço quem puder ajudar! RF Proteus.rar
  3. Olá, gostaria de pedir o auxilio para conversão do programa abaixo para o pessoal que já trabalhou com esses compiladores, na primeira parte se encontra as alterações já realizadas, na se segunda está o programa a ser convertido, caso o programa seja muito grande gostaria de pedir auxilio principalmente nos INTCON, T0CON, RCON, CCP1CON e etc. Convertendo XC8 para CCS: Programa deixa o config.h como comentário por que o mesmo causava erro __Delay_ms(); --> delay_ms(); TRISA(); --> set_tris_a(); #define en1 PORTAbits.RA2 --> en1 PIN_A2 ADC_read(); --> read_adc(); /* Titulo: PID digital * Versão: 1.0 * Autor: * Data: 02/06/2018 * Compilador: XC8 --> CCS * IDE: MplabX 4.10 * Dispositivo: PIC18f4550 * ======================================= Descrição ========================================== * * Este codigo realiza o controle PID de maneira discreta. Através dos dados de entrada * * referência e feedback, ambos medidos pelo conversor A/D em AN0 e AN1, encontra-se o erro, * * que então e usado como parametro para calcular um valor de pwm necessário para corrigi-lo * * isso através da função: PID_set_PF(). O sentido de giro do motor e controlado através das * * saidas digitais RA2, RA3. * * ============================================================================================ * */ // PIC18F4550 Configuration Bit Settings #include <xc.h> // compilador #include <18f4550.h> // dispositivo #include <stdio.h> // para utilizar a funcao sprintf #include <stdarg.h> // para utilizar a funcao sprintf //#include "config.h" // configuracoes do pic //================== defines e mapeamento de hardware =============// #use delay(clock = 48000000) // constante usada pelo delay, clock #define SHIFT 256 // usado para calculos com ponto fixo <<8 #define en1 PIN_A2 // en1 da ponte H, pino 4 do pic #define en2 PIN_A3 // en2 da ponte H, pino 5 do pic #define RS PIN_D1 #define EN PIN_D0 #define D4 PIN_D4 #define D5 PIN_D5 #define D6 PIN_D6 #define D7 PIN_D7 //==================== variaveis globais =========================// long int ref = 0; // guarda o valor do potenciomentro de referencia long int fb = 0; // guarda o valor do potenciomentro de feedback long int pwm = 0; // guarda valor de dutycicle do pwm float kp; // coeficiente da acao proporcional float ki; // coeficiente da acao integral float kd; // coeficiente da acao derivativa float T = 0.005; // periodo de amostragem long int k1; // coeficiente auxiliar, para uso de ponto fixo long int k2; // coeficiente auxiliar, para uso de ponto fixo long int k3; // coeficiente auxiliar, para uso de ponto fixo long int erro0 = 0; // erro da amostra atual e(n) long int erro1 = 0; // erro da amostra anterior e(n-1) long int out0 = 0; // saida da funcao do PID long int integral = 0; // parcela integral long int derivativo = 0; // derivativo //========================= funcoes =============================// void ADC_init() { ADCON1 = 0b00001101; //Somente AN0 e AN1 como entrada analogica, referencia e realimentacao ADCON2 = 0b10001110; //justificado a direita, 64 fosc , 2 Tda }// fim ADC_init unsigned ADC_read(unsigned char canal) { ADCON0 = canal; delay_us(10); // tempo para carregar capacitor interno ADCON0bits.GODONE = 1; // inicia a conversao while (ADCON0bits.GODONE); // espera o fim da conversao AD { } return ((ADRESH << 8) + ADRESL); // retorna um valor convertido de 0 - 1023 }// fim ADC_read unsigned long int PID_set_PF() { erro0 = ref - fb; erro1 = erro0; // atualiza valores // calculo do PID integral = integral + (erro0 * T); derivativo = ((erro0-erro1)/T); out0 = ((k1 * erro0)+ (k2 * integral) + (k3 * derivativo)); out0 = out0 >> 8; // deslocamento devido ao uso de ponto fixo if (out0 < -1) { // caso negativo out0 = out0*(-1); // multiplica por -1 } if(out0>1023) // caso estoure { out0 = 1023; // saturar saida } return out0; }// fim PID_set_PF #ORG 0x1000, 0x3000 void interrupt high_priority interrupcoes(void) { if (INTCONbits.TMR0IF == 1) { INTCONbits.TMR0IF = 0; PORTBbits.RB7 = !PORTBbits.RB7; ref = read_adc(0b00000001); // ler valor potenciomentro de referencia AN0 pino 2 delay_us(10); // tempo para descarregar capacitor interno fb = read_adc(0b00000101); // ler valor potenciomentro de realimentacao AN1 pino 3 pwm = PID_set_PF(); // calcula valor do PID TMR0L = 22 + TMR0L; // interrupcao a cada 0.005 segundos } } void setup() { CMCON = 0x07; // desabilita os comparadores internos // configura saidas e entradas set_tris_a = 0b00000011; // somente RA0,RA1 como entrada analogica, demais pinos saida set_tris_b = 0x00; // todo o PORTB como saida set_tris_c = 0x00; // todo o PORTC como saida, onde pino 17 RC2/CCP1 sera a saida PWM set_tris_d = 0x00; // todo o PORTD como saida, onde se encotra conectado o LCD set_tris_e = 0x00; // todo o PORTE como saida PORTB = 0xFF; // inicia o PORTB todo em alto ADC_init(); // inicia configuracoes do ADC ADCON0bits.ADON = 1; // liga o modulo adc PORTDbits.RD2 = 0; // pino onde se encontra o RW do LCD, para escrita deve estar em nivel logico baixo // configuração PWM T2CON = 0x07; // Liga timer2 e ativa prescaler 16 PR2 = 0x7F; // Carrega PR2 CCP1CON = 0x3C; CCPR1L = 0x00; CCP1CONbits.DC1B0 = 0; CCP1CONbits.DC1B1 = 0; }// fim setup //====================== funcao principal =======================// void main() { // inicio main setup(); // faz set up das configuracoes PORTDbits.RD2 = 0; // pino onde se encontra o RW do LCD, para escrita deve estar em nivel logico baixo en1 = 0; // saida digital RA2 para ponte H en2 = 0; // saida digital RA3 para ponte H // calculo de coeficientes do PID kp = 1; ki = 0; kd = 0; // calculo dos coeficientes para ponto fixo k1 = (kp) * SHIFT; k2 = (ki) * SHIFT; k3 = (kd) * SHIFT; // configuracoes TIMER0 T0CONbits.TMR0ON = 1; T0CONbits.T08BIT = 1; T0CONbits.T0CS = 0; T0CONbits.T0SE = 0; T0CONbits.PSA = 0; T0CONbits.T0PS = 0b111; TMR0L = 22; // configuracoes de interrupcao INTCONbits.TMR0IE = 1; INTCON2bits.TMR0IP = 1; RCONbits.IPEN = 0; INTCONbits.GIE_GIEH = 1; INTCONbits.PEIE_GIEL = 0; while (1) { // inicio loop if (ref > fb) { // verifica sentido de giro necessario para o motor en1 = 0; // pino 4 en2 = 1; // pino 5 } else { en1 = 1; en2 = 0; } // seta o PWM -> 0-1023 CCPR1L:CCPxCON<5:4> CCPR1L = pwm >> 2; // 8 bits mais significativos CCP1CONbits.DC1B1 = pwm >> 1; // segundo bit menos significativo CCP1CONbits.DC1B0 = pwm; // bit menos significativo delay_ms(50); }// fim loop }// fim main Modificação_CCS_2.txt
  4. Quando debugo um código no proteus o resultado não é o esperado, fui fazer o debug no mikroc e deu certo. o que pode ser? o proteus possui algum bug?
  5. Olá venho mais uma vez pedir ajuda aos amigos e forista do Clube do Hardware .Eu consegui emular um teclado USB HID com pic 18f4550 e o Windows reconhece e funciona tudo Ok, porém quando você tenta utiliza-lo na parte da BIOS para configurar ele não funciona, mas se você colocar teclado USB fabricado este funciona normalmente .Alguém sabe algum site ou Explicação que possa me ajudar a entender ??Desde já agradeço a todos .
  6. Ola pessoal Estou fazendo comunicação PIC e nextion RX TX,,mas quando eu aperto o botão do nextion para acender led,ele envia apenas uma vez o caracteres,depois quando eu aperto outro botão ele não envia mais nada. O valor anterior do caracteres fica na tela e não recebe mais nada. Alguem poderia me ajuda onde está o erro: while(true){ char=d; if(kbhit()) { d=getc(); printf(lcd_putc,"\%u",d); delay_ms(200); if(d==10){ output_low(PIN_B1); } }
  7. Então galera, é o seguinte, eu to fazendo um projeto aqui, e uma parte dele, tem o monitoramento de uma bateria 14,91v, eu ja fiz a conversão AD e tudo mais, no proteus, funciona que é uma beleza, (A tensão é visualizada em um lcd 16x02) Só que... kk Quando vou testa na pratica, fica variando muito a tensão da bateria, tipo, no multímetro mesmo, dar uns 14.88, e no multímetro q eu fiz com o pic, fica dando 14.67...14.95....14.55....14,79... e por ai vai, e essa variação é constante, ele não estabiliza em nenhuma, e é muito rápido, eu já tentei por delays para ver se poderia ser isso, mas da na mesma, ja configurei a porta ADC de varias formas diferentes e nada, detalhe, eu uso duas portas adc, a outra é pra ver a temperatura, já essa funciona que é uma beleza. Queria ver se vocês conseguem me ajudar, eu não sei mais o que fazer, se quiserem, eu posto a parte do código responsável por isso, pra vcs darem uma olhada e me dizer o que acham. Alguém Por Favor?? adicionado 16 minutos depois eu uso um divisor de tensão com dois resistor de 20k, em conjunto com um trimpot para abaixar o a tesão da bateria para entrar na porta ADC do pic, ja que não podemos ligar os 14v direto na porta dele
  8. 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; } }
  9. Olá, Pessoal ! Alguém aí teria o LDmicro com suporte ao PIC12F675 para me fornecer ? Estou procurando algum lugar para baixá-lo para poder programar PIC 12F675. Sei que não é o ideal, mas seria uma medida provisória até eu aprender a programar em C. Caso alguém possa me ajudar eu agradeço. Obrigado.
  10. Tenho duas variáveis de um byte cada,VALOR1 e VALOR2: VALOR1 contem 0xA0 (10100000)e valor dois será uma parte de um endereço de 16 bits. Como faço para juntar os dois para formar um endereço de 11bits,sendo que VALOR1 tem os os bits 0,1 e 2 para isso? VALOR1 =((VALOR2 & 0xFF00) << 3)); ? ////////////////////////// O maior valor será 2047 (0000 0111 1111 1111); Seria algo tipo VALOR1 =((VALOR2 & 0xFF00) << 8)); ?
  11. Fui fazer uma simples programação só para teste e está dando erro na expressão "else". Já tentei colocar "{" após e "}" para fechar o comando do else, mas não adiantou. E reparei que em Library Maneger, todas as bibliotecas estão adicionadas. Então não sei por que ta dando esse erro. Aqui segue o programa e logo abaixo os erros de compilação: char i; void main() { trisa=0; trisb=255; portb.rb0= 0; porta.ra0= 0; while (1) { if (portb.rb0==1&&i==0) i++; porta.ra0=1; delay_ms(1000); porta.ra0=0; delay_ms(1000); } else porta.ra0=0; } } ERROS: 18 315 Invalid expression MyProject.c 17 402 ; expected, but 'else' found MyProject.c 19 424 '}' expected ';' found MyProject.c 21 312 Internal error '' MyProject.c 0 102 Finished (with errors): 06 mai 2018, 11:11:02 MyProject.mcppi
  12. Ola, Utilizo PIC 18f4550,e estou fazendo trabalho com no compiler CCS,vi varios locais na net conectando mouse no pinos do PIC e consegue pegar informação do eixo X e Y . Alguem já fez com PIC? segue video do cara fez com arduino: https://www.youtube.com/watch?v=SXQfT7c-9rU&t=21s
  13. olá. estou fazendo uma programação para pic na qual o pic vai receber um sinal de módulo nec de um receptor infravermelho, e vai realizar determinada função. para esse processo, estou utilizando preescaler de 1:16 e timer 1 no modo de temporizador. mas ao fazer essas configurações na programação, está dando erro na parte : "org 0x00 goto inicio" o erro é: overwriting previous address contents (0000) não estou sabendo resolver esse pequeno problema. aqui vão algumas partes da programação relacionadas aos banks do pic e as variáveis criadas: ----- variáveis ----- cblock 0x20 w_temp status_temp temp1 temp2 temp3 tmr1l_temp tmr1h_temp endc inicio bank1 ;altera para o banco 1 movlw b'11111111' movwf trisa ;define porta como entradas movlw b'00000000' movwf trisb ;define portb como saídas movlw b'10000100' movwf option_reg ;define opções de operação prescaler 1:2 no tmr0 ;pull-ups desabilitados ;as demais confg. são irrelevantes movlw b'11000000' movwf intcon ;define opções de interrupções desligadas movlw b'00000101' movwf pie1 bank0 movlw b'11000000' movwf intcon ;retorna para o banco 0 movlw b'00000101' movwf cmcon ;define o modo de operação do comparador analógico movlw b'00000111' movwf ccp1con; define preescaler 1:16 movlw b'00110001' ; talvez b'00110101' movwf t1con ; define o timer1 como contador 1:8 bcf t1con, tmr1on movf tmr1l,w movwf tmr1l_temp movf tmr1h,w movwf tmr1h_temp bsf t1con, tmr1on
  14. Boa tarde, estou fazendo um projeto para faculdade, utilizando um PIC18F4520, estou programando pelo Mikroc pro for pic, preciso fazer uma coisa simples que é saber por quanto tempo segurei um botão para poder resetar um contador, no Arduino usa a função milis, e no mikroc pro achei uma biblioteca que pode fazer tal função porém não consigo entender e quando tento dar include nela no programa da erro, link da biblioteca: https://download.mikroe.com/documents/compilers/mikroc/pic/help/time_library.htm Tem um exemplo no final que eu simplesmente copiei e colei no programa para testar e ver como funciona, porém da erro logo no include. Agradeço desde ja qualquer ajuda.
  15. Estou tentando gravar um valor na eeprom do PIC 12F675 através do programa MikroC. pelo que mostra na ajuda deste compilador os exemplos são para linha 16F e 18F... não tem para 12F Pesquisei no forum da mikroC e em uma duvida semelhante os caras disseram que havia funcionado... mas não disseram como... eis o que estou fazendo (esta em fase de projeto ainda... estou simulando no isis proteus): cont = EEPROM_Read(0x00); //quero ler o valor zero (com a linha pic16F testei e funcionou perfeito) e para escrever: EEPROM_Write(0x00, cont); escrever o valor zero... Obrigado a todos.
  16. Estou pesquisando a compra de uns PICs, e me deparei com dois modelos diferentes para o mesmo produto: PIC12F675 i/so PIC12F675 i/sn Alguém sabe a diferença? pois o preço de um é o dobro do outro... procurei no datasheet mas não encontrei esta informação. Obrigado a todos. adicionado 36 minutos depois Descobri: Device PIC12F6XX: Standard VDD range PIC12F6XXT: (Tape and Reel) Temperature Range I = -40°C to +85°C E = -40°C to +125°C Package P = PDIP SN = SOIC (Gull wing, 150 mil body) MF = MLF-S Pattern 3-Digit Pattern Code for QTP (blank otherwise)
  17. Então pessoal, fiz uma postagem ontem sobre um exercício de um código de PIC18F4550, que necessitava utilizar botões e um tempo específico, criei um código e agora necessito encaixar um TMR0 no lugar dos delays, alguém sabe como fazer isso?? Valeu!!! Código: // PIC18F4550 Configuration Bit Settings #define _XTAL_FREQ 20000000UL #include <p18f4550.h> #include <xc.h> bit b_right, b_left, b_up, b_down, b_emerg = 0; int x = 0; void lcd_ini(); void lcd_cmd(char cmd); void lcd_envia_byte(char nivel, char dado); void main(void) { ADCON1 = 0x0f; lcd_ini(); lcd_envia_byte(0, 0x84); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'Q'); lcd_envia_byte(1, 'U'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'P'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'A'); lcd_envia_byte(0, 0xC4); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, '3'); __delay_ms(5000); while (1) { b_right = TRISBbits.RB0; // b0 b_left = TRISBbits.RB1; // b1 b_up = TRISBbits.RB2; // b2 b_down = TRISBbits.RB3; // b3 b_emerg = TRISBbits.RB4; // b4 inicio: lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'S'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'S'); lcd_envia_byte(1, 'L'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'U'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'N'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'N'); lcd_envia_byte(1, 'S'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, ':'); if (b_right == 1 && b_emerg == 0) { PORTBbits.RB6 = 1; __delay_ms(8000); PORTBbits.RB6 = 0; lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'L'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(1, ' '); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'A'); } if (b_left == 1 && b_emerg == 0) { PORTBbits.RB6 = 1; __delay_ms(8000); PORTBbits.RB6 = 0; lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'L'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(1, ' '); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'S'); lcd_envia_byte(1, 'Q'); lcd_envia_byte(1, 'U'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'A'); } if (b_up == 1 && b_emerg == 0) { PORTBbits.RB6 = 1; __delay_ms(8000); PORTBbits.RB6 = 0; lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'L'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(1, ' '); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'A'); } if (b_down == 1 && b_emerg == 0) { PORTBbits.RB6 = 1; __delay_ms(8000); PORTBbits.RB6 = 0; lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'L'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(1, ' '); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'B'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'X'); lcd_envia_byte(1, 'O'); } if (b_emerg == 1) { PORTBbits.RB5 = 1; __delay_ms(4000); PORTBbits.RB5 = 0; lcd_envia_byte(0, 0x80); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'T'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ' '); lcd_envia_byte(1, 'P'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, 'D'); lcd_envia_byte(1, 'O'); lcd_envia_byte(1, ' '); lcd_envia_byte(1, ':'); lcd_envia_byte(1, ' '); lcd_envia_byte(0, 0xC0); lcd_envia_byte(1, '!'); lcd_envia_byte(1, '!'); lcd_envia_byte(1, '!'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'M'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'R'); lcd_envia_byte(1, 'G'); lcd_envia_byte(1, 'E'); lcd_envia_byte(1, 'N'); lcd_envia_byte(1, 'C'); lcd_envia_byte(1, 'I'); lcd_envia_byte(1, 'A'); lcd_envia_byte(1, '!'); lcd_envia_byte(1, '!'); lcd_envia_byte(1, '!'); __delay_ms(5000); goto inicio; } } } void lcd_ini() { char i; TRISD = 0b00000000; TRISEbits.TRISE0 = 0; TRISEbits.TRISE1 = 0; PORTD = 0b00000000; PORTEbits.RE0 = 0; PORTEbits.RE1 = 0; __delay_ms(15); for (i = 0; i < 3; i++) { lcd_cmd(0x30); __delay_ms(5); } lcd_cmd(0x38); __delay_us(40); lcd_cmd(0x01); __delay_ms(2); lcd_cmd(0x0C); __delay_us(40); lcd_cmd(0x06); __delay_us(40); } void lcd_cmd(char cmd) { PORTD = cmd; PORTEbits.RE1 = 1; PORTEbits.RE1 = 0; } void lcd_envia_byte(char nivel, char dado) { PORTEbits.RE0 = nivel; __delay_us(100); PORTEbits.RE1 = 0; lcd_cmd(dado); }
  18. Galera, eu necessito que alguém saiba montar esse exercício, por que tipo, eu não estou conseguindo, mas necessito entregar isso na faculdade se alguém conseguir resolver o enunciado, joga o código aqui no post que vai ajuda muito. E pessoal, eu necessito pra até quinta de manhã (19/04/2018) Valeu!!! É utilizando o PIC18F4550 ENUNCIADO: O projeto O projeto deve possuir quatro botões de entrada normal (sem interrupção) e um ligado a uma das interrupções externas. Os quatro botões devem indicar ao programa as seguintes orientações (para cima, para baixo, para a direita e para a esquerda) referente ao acionamento de dois motores CC (de uma CNC). O botão ligado a interrupção deve gerar uma parada total do sistema (emergência). Cada botão deve acionar um sentido de movimento de um motor hipotético por um tempo determinado. Dessa forma cada acionamento/botão pressionado deve iniciar a contagem de um tempo, com um Timer, e o movimento do motor. Assim que a contagem do Timer acabar o motor deve parar de girar. Todos as informações/ações devem aparecer no display LCD. Exemplo: • Iniciando movimento do motor par a direita. • Iniciando movimento do motor par cima. • Parada do movimento do motor da direita. • Parada total por emergência. • Etc ... O motor hipotético deve girar por “X” segundos e a cada meio segundo dois LEDs devem piscar intercaladamente indicando o movimento de qualquer um dos motores. O display de 7 segmentos também pode ser usado para indicar qual botão foi pressionado. O display de LCD, ao ser inicializado, deve mostrar por 5 segundo o nome do Grupo (A) Os valores de X são: • Grupo A: 7.5 segundos
  19. Bom Dia, Boa Tarde, Boa Noite. Farei um projeto Traçador de Altura Digital que consta em fazer a contagem de pulsos Analógicos de um sensor(Enconder) assim realizar a contagem transformando esses pulsos em uma contagem em centímetros/milímetros/polegadas. Estou encontrando dificuldade em lidar com os pulsos do enconder, a situação é o seguinte: o enconder mandara pulsos para o PIC 16F887 que por sua vez, mandara para o LCD que mostrará a contagem . Só que durante os testes, eu percebi que o Funcionamento até a parte do enconder está saindo como planejado, só que quando passo os pulsos para o PIC(utilizando o Timer0-Tipo contagem) esses pulsos não são todos lidos, apenas alguns. onde é mostrado no LCD. Tenho duas hipóteses: pode ser a frequencia do Timer 0 ou do PIC ou alguma interferencia externa. Testei com um Clock(imitando um encoder) com uma frequência 10 Hz no Proteus e ele contava, mas quando coloco mais de 10 Hz ele não consegue contar. //----------------------------------LCD---------------------------------------// sbit LCD_RS at RD4_bit; sbit LCD_EN at RD5_bit; sbit LCD_D4 at RD0_bit; sbit LCD_D5 at RD1_bit; sbit LCD_D6 at RD2_bit; sbit LCD_D7 at RD3_bit; sbit LCD_RS_Direction at TRISD4_bit; sbit LCD_EN_Direction at TRISD5_bit; sbit LCD_D4_Direction at TRISD0_bit; sbit LCD_D5_Direction at TRISD1_bit; sbit LCD_D6_Direction at TRISD2_bit; sbit LCD_D7_Direction at TRISD3_bit; //--------------------------------VARIAVEIS-----------------------------------// float clk; float Milimetros; float MM; float timer; float timer1; int a=0; int af=0; float valor; char txt[15]; void main() { ANSEL= 0x02; // Configuração AN2 pin as analog ANSELH = 0; // Configuração de outros AN pinos as digital I/O C1ON_bit = 0; // Disabilita comparadores C2ON_bit = 0; //------------------------Habilitando a porta Analógica-----------------------// Adc_Init(); // Inicia porta analógica //---------------------------Saidas e Entradas--------------------------------// TRISA = 255; // PORTA is input TRISC = 0; // PORTC is output TRISB = 255; // PORTB is input TRISD = 0; // PORTD is output INTCON = 0; //-----------------------------Configuração do TMR0---------------------------// OPTION_REG=0b0101000; //modo contador TMR0=0; //Inicializa o registro TMR0 com o valor 0. //-----------------------------Saida do LCD-----------------------------------// Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Clear display Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Out(1,2,"TRACADOR"); Lcd_Out(1,12,"DE"); Lcd_Out(2,2,"ALTURA"); Lcd_Out(2,10,"DIGITAL"); //------------------------------Contador--------------------------------------// while(1) { Delay_ms(100); valor = Adc_Read(0);//Faz a com que a variavel valor seja igual a porta analogica lida que é a RA0 if(TMR0==1&&a==0) { af=1; } if(af==1) { af=2; Lcd_Cmd(_LCD_CLEAR); } if(af==2) { if(INTCON.TMR0IF) { INTCON.TMR0IF=0; //limpa a flag TMR0 = 0; a++; } timer=TMR0+(a*255); timer1=timer/1000; floatToStr(timer1,txt); txt[5] = 0; Lcd_Out(1,2,txt); } //----------------------------PORTA ANALÓGICA "CLOCK"-------------------------// if(valor<614) //Quando valor for menor que 3V { RC0_bit = 0; //Manda zero } else //Se não { RC0_bit = 1; //Manda um } } } //------------------------------Conversão dos valores-------------------------//
  20. Olá amigos Sou iniciante na programação, mas gosto muito desta arte Arte de mestre que e programar. Parece fácil + não e , arte onde o poder da criação e infinita Agradeço a atenção de todo,mas preciso da a juda de vocês Estou tem tando compilar este código em Mikroc e ta dando erro Este e um decodificador DTMF com pic 16f628a baixado da net O código HEX grava normal no pic e roda legal mas o codig asm não compila Segue o código fonte ; DTMFCTRL.ASM ; Current Version: 0.00 ; ; PIC Based software DTMF decoder which controls ; 8 outputs. Command syntax: #ABCD#XY* ; ; - #ABCD# stands for a 4 digit code surrounded bij # ; - X indicates the channel (1..8) ; - Y indicates ON (1) of OFF (0) ; ; Created by Wim de Vree PE1GRL - pe1grl@amsat.org ; ; Brief overview: ; This program decodes DTMF tones using the Goertzel algorithm. ; Heavily based on the code from Radu Constantinescu ; which got the idea from David Hedly. Also thanks to ; Scott Dattalo who wrote a nice decription on the web. ; After the correct sequence is received on of the PORTB ; data lines is set or reset. ; ; Revision History ;---------------------------------------------------------------------- ; 2011-01-25 0.00 Initial creation, Based on the RS232 decoder ; 2011-01-26 0.10 Completed program, removed diagnostic RS232 stuff ; 2011-01-27 0.20 Some optimalisation to fit in a 1K Flash PIC ; now using 1012 out of 1024 program words ; ; SOFTWARE DTMF DECODER ; modified Goertzel algorithm ; timer 2 used to generate interupts at 9765.625hz ; with 1X and 2X frequency bins ; ; FOR 16F88 / 20 Mhz ; F sample = 5000000/512 hz = 9765. 625 hz ; ; RA0 OUT pin 17 Interrupt Indicator ( =1 durring interrupt) ; RA2 Comparator IN pin + DTMF/FSK INPUT (Comparator) ; RA1 Comparator IN pin - Grounded ; RB 8 output channels ; LIST P=PIC16F628A, F=INHX8M __CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF & _PWRTE_ON ; define treshods for the dtmf decoder #define treshold1XL .240/4 ; for 1X frequencies DTMF detector / 240 samples #define treshold1XH .240/5 ; for 1X frequencies DTMF detector / 240 samples #define treshold2XL .113/3 ; for 2X frequencies DTMF detector / 113 samples #define treshold2XH .113/3 ; for 2X frequencies DTMF detector / 113 samples ; 50 40 2 ; 40 40 3 < best OF 126 - GOOD EXCEPT * ; 35 35 3 RADIX DEC #include <p16f628A.inc> XTAL_FREQ EQU 20000000 ; OSC freq in Hz #include <rxtables.asm> ; Only need the decode tables ERRORLEVEL -302 ; disable warnings about not in bank0 CBLOCK 0x20 PCLATH_SAVE: 1 ; Interrupt save vars STATUS_TEMP: 1 FSR_SAVE: 1 TempH: 1 ; Used in the DTMF Detector ISR for Temp Lowtemplate TempL: 1 ; Used in the DTMF Detector ISR for Temp Highemplate ; Freq AddH AddL Error(%) ; 1000 26 55 0.001692772 ; 697 18 69 -0.01042912 ; 770 20 47 -0.007402742 ; 852 22 86 0.005680407 ; 941 24 171 0.000885164 ; 1209 31 177 -0.00569002 ; 1336 35 6 0.002852743 ; 1477 38 184 0.000209718 ; 1633 42 207 0.001117896 ;Frequency 1209 1336 1477 1633 ;697 1 2 3 A ;770 4 5 6 B ;852 7 8 9 C ;941 * 0 # D ;**************************** ; SERIAL ROUTINES VARIABLES ;**************************** Flags:1 ; flags for serial comunincation Temp:1 ; temp byte ONLY to be used locally and no calls ! ;**************************** ; DELAY ROUTINES VARIABLES ;**************************** TIME0: 1 ;DELAY COUNTER LSB TIME1: 1 ;DELAY COUNTER MSB ;**************************** ; DTMF DECODER ROUTINES VARIABLES ;**************************** A697SIN, A697COS:1 ; ACCUMULATOR for 697 Hz sin A770SIN, A770COS:1 ; ACC A852SIN, A852COS:1 ; ACC A941SIN, A941COS:1 ; ACC A1209SIN,A1209COS:1 ; ACC A1336SIN,A1336COS:1 ; ACC A1447SIN,A1447COS:1 ; ACC A1633SIN,A1633COS:1 ; ACC ; double frequency bins A697SIN2, A697COS2:1 ; ACCUMULATOR for 697 Hz sin A770SIN2, A770COS2:1 ; ACC A852SIN2, A852COS2:1 ; ACC A941SIN2, A941COS2:1 ; ACC A1209SIN2,A1209COS2:1 ; ACC A1336SIN2,A1336COS2:1 ; ACC A1447SIN2,A1447COS2:1 ; ACC A1633SIN2,A1633COS2:1 ; ACC SAMPLEBIT:1 TABLECOUNTER:1 LOWTEMPLATE:1 ; USED BY DTMF DETECTOR ISR - temp val for Lowfreq Table Value HIGHTEMPLATE:1 ; USED BY DTMF DETECTOR ISR - temp val for Highfreq Table Value BYTE_DTMF:1 RESULT1:1 ; DECODED DIGIT OR 0 RESULT:1 ; USED BY DTMF DETECTOR ISR - result bits for 1X BINS RESULT2X:1 ; USED BY DTMF DETECTOR ISR - result bits for 2X BINS FSR_SAVE_DTMF:1 ; DTMF ISR ROUTINE TEMP Variable TEMP_VAL:1 TEMP_TIMES:1 DTMF_RESULT:1 ; LAST detected DTMF digit or '-' Uidx ; Index when hunting the unlock code Expected ; Expected character Channel ; Received channel Action ; ON or OFF ChannelMask ENDC ; ************* Bit variable definitions *************************** #define TIMEOUT Flags,1 ; timeout flag #define DTMF_DONE Flags,4 ; 1 DTMF detector off / 0 - DTMF detector on #define DTMF_DETECTED Flags,5 ; one DTMF digit detected in DTMF_RESULT #define DTMF_RECOVER Flags,6 ; =1 do not send the next digit - just recover (used by the decision alg.) #define Temp_Flag Flags,7 #define ACTION_ON Flags,2 ; =1: Turn on, else turn off ;*********************************************** ;Shared Ram ;*********************************************** CBLOCK 0x78 ; variables for all the RAM pages, skip 70 for ICD W_TEMP: 1 ; int W save/shared Ram ENDC ;**************************** ORG 0x00 clrf PCLATH ; Page 0 clrf STATUS ; BANK 0 goto START INTERRUPT_VECTOR ORG 0x04 ;**************************** ; ; CONTEXT SAVE ; ;**************************** C_SAVE movwf W_TEMP swapf STATUS,W clrf STATUS ;ENSURE BANK0 SAVE movwf STATUS_TEMP bsf PORTA, 0 ; set interrupt indicator movf PCLATH,W ; SAVE PCLATH movwf PCLATH_SAVE movf FSR, W movwf FSR_SAVE btfss PIR1,TMR2IF ; TMR2 Overflow Check ? goto $ ; NO, hang system with led ON ;********************** ;Timer 2 ISR ;********************** btfsc DTMF_DONE goto T2ISR_1 ; Skip Comparator input if dtmf detect is off clrf BYTE_DTMF ; input = 0 btfsc CMCON,C2OUT ; Output of comparator comf BYTE_DTMF, F ; input = 1 T2ISR_1 bcf PIR1,TMR2IF ; RESET TIMER 2 INT FLAG ;********************** ; DTMF DETECTOR ISR ;********************** DTMF_DETECT btfsc DTMF_DONE goto DTMF_ISR_END ; Skip dtmf detect isr if done=1, goto delay ISR ; input value in DTMF_BYTE = 00 or FF ;***************************** ; ;Get the expected Lowband Bits ; ;***************************** movlw low LOWBAND addwf TABLECOUNTER,W ; add low lowband + tablecounter with carry movlw high LOWBAND ; to pclath skpnc addlw 1 movwf PCLATH ; if the table will be alligned to a 256 boundary this will nor be necessary movf TABLECOUNTER,W ; read 1X template call LOWBAND ; read table movwf LOWTEMPLATE movf BYTE_DTMF,W xorwf LOWTEMPLATE, F ; APPLY INPUT OVER MASK ; read 2X template - must use TABLECOUNTER X 2 as pointer movf TABLECOUNTER,W clrc ; Carry=0 rlf TABLECOUNTER,W ; TABLECOUNTER X 2 > W call LOWBAND ; read table movwf TempL movf BYTE_DTMF,W xorwf TempL, F ; APPLY INPUT OVER MASK ;***************************** ; ;Get the expected Highband Bits ; ;***************************** movlw low HIGHBAND addwf TABLECOUNTER,W movlw high HIGHBAND skpnc addlw 1 movwf PCLATH movf TABLECOUNTER,W ; read 1X template call HIGHBAND movwf HIGHTEMPLATE movf BYTE_DTMF,W xorwf HIGHTEMPLATE, F ; APPLY INPUT OVER MASK ; read 2X template - must use TABLECOUNTER X 2 as pointer movf TABLECOUNTER,W clrc rlf TABLECOUNTER,W ; TABLECOUNTER X 2 > W call HIGHBAND ; read table movwf TempH movf BYTE_DTMF,W xorwf TempH, F ; APPLY 2X frequencies Mask over the 1X frequencies result clrf PCLATH ; clear pclath before any GOTO....... ;******************************* ; ; LOWTEMPLATE AND HIGHTEMPLATE ; CONTAIN THE EXPECTED VALUES ; FOR THE INCOMING BIT ; ;******************************* ; do it for the 1Xfreq bins movlw low A697SIN movwf FSR ; ACCUMULATOR ADDR in pointer FSR movlw .8 movwf SAMPLEBIT ; samplebit is the number of the bit being tested COMPAREBITL rlf LOWTEMPLATE,F bnc MATCHL decf INDF,F ; decrement accumulator goto CONTINL MATCHL incf INDF,F CONTINL incf FSR,F ; increment pointer - next accumulator decfsz SAMPLEBIT,F ; next bit goto COMPAREBITL ; FINISH THE BYTE ; MOVF TABLECOUNTER,W ; SUBLW .66-1 ; 0-65=66 SAMPLES This is the number of samples to test against (max 127) ; this will go from 0 to 125 and stop at 126, a total of 126 samples ;treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore C is 0 for W > treshold bnc SKIPHI1X movlw LOW A1209SIN movwf FSR ;ACCUMULATOR ADDR movlw 8 movwf SAMPLEBIT COMPAREBITH rlf HIGHTEMPLATE,F bnc MATCHH decf INDF,F goto CONTINH MATCHH incf INDF,F CONTINH incf FSR,F decfsz SAMPLEBIT,F goto COMPAREBITH ;FINISH THE BYTE SKIPHI1X ; do it again for the 2Xfreq bins ; SKIP 2X IF TABLECOUNTER>113 movf TABLECOUNTER,W sublw .113-1 ;This is the number of samples to test against (max 127) ; this will go from 0 to 125 and stop at 126, a total of 126 samples ;treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore C is 0 for W > treshold bnc SKIPHI2X movlw low A697SIN2 movwf FSR ; ACCUMULATOR ADDR in pointer FSR movlw .8 movwf SAMPLEBIT ; samplebit is the number of the bit being tested COMPAREBITL2 rlf TempL,F bnc MATCHL2 decf INDF,F ; decrement accumulator goto CONTINL2 MATCHL2 incf INDF,F CONTINL2 incf FSR,F ; increment pointer - next accumulator decfsz SAMPLEBIT,F ; next bit goto COMPAREBITL2 ; FINISH THE BYTE movlw low A1209SIN2 movwf FSR ;ACCUMULATOR ADDR movlw .8 movwf SAMPLEBIT COMPAREBITH2 rlf TempH,F bnc MATCHH2 decf INDF,F goto CONTINH2 MATCHH2 incf INDF,F CONTINH2 incf FSR,F decfsz SAMPLEBIT,F goto COMPAREBITH2 ;FINISH THE BYTE SKIPHI2X ;******************************** ; ; Increment Tablecounter 0..255 ; ;******************************** incf TABLECOUNTER,F movf TABLECOUNTER,W xorlw .240 ;This is the number of samples to test against (max 127) ; this will go from 0 to 125 and stop at 126, a total of 126 samples skpnz bsf DTMF_DONE DTMF_ISR_END ;********************** ; Delay ISR ;********************** ; TIME1:TIME0 counter will be decremented each Timer2 Tick, ; TIMEOUT flag will be set when counter reaches zero. DELAY_ISR btfsc TIMEOUT ; CHECK IF NOT TIMEOUT goto DELAY_ISR_END decf TIME0, F ; DECREMENT TIMEOUT COUNTER bnz DELAY_ISR_END ; TIME0<>0 decf TIME1, F skpnz bsf TIMEOUT ; TIME1==0, SET TIMEOUT=TRUE DELAY_ISR_END ;********************** ; Context Restore ;********************** INT_EXIT clrf STATUS ; ENSURE BANK0 RESTORE movf FSR_SAVE,W movwf FSR movf PCLATH_SAVE,W movwf PCLATH ; RESTORE PCLATH bcf PORTA, 0 ; reset interrupt indicator swapf STATUS_TEMP,W movwf STATUS swapf W_TEMP,F swapf W_TEMP,W retfie ;********************************************************** ; Main Program ;********************************************************** START INIT ; INIT ROUTINE ;*************** ; setup delay ;*************** bcf TIMEOUT ; KEEP DELAY COUNTER STOPPED clrf TIME0 ; INIT DELAY COUNTER clrf TIME1 ;*************** ; setup Comparator input on AN1/AN2 ;*************** bsf STATUS,RP0 ; Switch to Bank 1 movlw b'11111110' ; PortA: only RA0 output movwf TRISA bcf STATUS,RP0 ; Back to Bank 0 bcf PORTA,0 ; Led OFF movlw b'00000101' ; One comparator used (RA1/RA2) movwf CMCON ;*************** ; setup DTMF DETECTOR ;*************** bsf DTMF_DONE ; STOP DTMF detector movlw '-' movwf TEMP_VAL movlw 1 movwf TEMP_TIMES bcf DTMF_RECOVER ;************************* ; setup timer2 and PWM and PORTB ;************************* clrf PORTB ; CLEAR PORTB bsf STATUS,RP0 ; (bank 1) clrf TRISB ; PortB all outputs movlw B'00111111' ; 78.12Khz PWM with 20Mhz crystal movwf PR2 ; NOTE: PWM module is OFF bcf STATUS,RP0 ; (bank 0) movlw B'00111000' ; set Timer2 prescaler 1/1, post scaler 1/8 movwf T2CON ; Interrupt (sample) rate is 9767Hz ; reset TMR2IF, enable interrupts bcf PIR1, TMR2IF BANKSEL PIE1 ;(bank 1) bsf PIE1, TMR2IE BANKSEL INTCON ;(bank 0) ; Start the interrupts bsf INTCON,GIE ; global int bsf INTCON,PEIE ; Peripherals int bsf T2CON,TMR2ON ; start Timer2, bank0 ;********************************* ; MAIN LOOP ;********************************* MAIN: ; Wait for a hash which starts the scan for the lock code WaitStartHash: clrf Uidx ; Start of unlockcode WaitUnLock: movlw high GetUnLockChar movwf PCLATH movlw low UnlockCode addwf Uidx,W call GetUnLockChar clrf PCLATH andlw 0xFF bz CodeReceived ; Got complete unlockcode movwf Expected ; This is the char we expect call GetDTMFWithTimeOut btfsc TIMEOUT goto WaitStartHash ; TimeOut, restart movfw DTMF_RESULT xorwf Expected,W bnz WaitStartHash ; Unexpected char detected incf Uidx,F goto WaitUnLock ; Do Next char in unlockcode CodeReceived: ; The unlock code was rx'd call GetDTMFWithTimeOut ; Channel Number btfsc TIMEOUT goto WaitStartHash ; TimeOut, restart movfw DTMF_RESULT movwf Channel call GetDTMFWithTimeOut ; Channel Status btfsc TIMEOUT goto WaitStartHash ; TimeOut, restart movfw DTMF_RESULT movwf Action call GetDTMFWithTimeOut ; Terminator btfsc TIMEOUT goto WaitStartHash ; TimeOut, restart movfw DTMF_RESULT xorlw '*' bnz WaitStartHash ; No Match on terminator ; Check if we have a valid CHANNEL (1..8) movlw '1' ; Check if >= 1 subwf Channel,W bnc WaitStartHash ; No: Invalid Channel movlw '9' ; Check if < 8 subwf Channel,W bc WaitStartHash ; No: Invalid Channel movlw '0' subwf Channel,F ; Channel now 1..8 ; Check if we have a valid ACTION (0..1) movlw '0' ; Check if >= 0 subwf Action,W bnc WaitStartHash ; No: Invalid Action movlw '2' ; Check if < 2 subwf Action,W bc WaitStartHash ; No: Invalid Action bcf ACTION_ON movlw '0' xorwf Action,F ; Action now 0 or 1 skpz bsf ACTION_ON ; Get the mask for the channel clrf ChannelMask setc _gm rlf ChannelMask,F decfsz Channel,F goto _gm comf ChannelMask,W andwf PORTB,W ; Channel now 0 btfsc ACTION_ON ; Turn ON ? iorwf ChannelMask,W ; Yep movwf PORTB ; Place DTMF command on I/O port goto WaitStartHash ; Wait for next command ;************************************************************************ ;SUBROUTINES ;************************************************************************ ;Wait until a single DTMF character is received ;GetDTMF: ; call DETECT_DTMF ; START DTMF DETECTOR ; btfss DTMF_DETECTED ; goto GetDTMF ; return ;Wait until a single DTMF character is received ;But return after a timeout GetDTMFWithTimeOut: movlw .113 ; Max 3 seconds wait movwf TIME0 movlw .114 movwf TIME1 bcf TIMEOUT ; start 3 sec delay waitDTMF call DETECT_DTMF ; START DTMF DETECTOR btfsc DTMF_DETECTED return ; Got a DTMF tone btfss TIMEOUT goto waitDTMF ; No time out, try again return ; Timed Out ;************************************************************************ ; TO START DTMF DETECTOR - CALL DETECT_DTMF - this will return in ~130 timer cycles ; if DTMF_DETECTED=1 on return one NEW DTMF digit was detected in DTMF_RESULT or '-' for pause ;************************************************************************ ;START DTMF DECODER DETECT_DTMF ; clear the dtmf detector values movf FSR,W movwf FSR_SAVE_DTMF ; SAVE FSR movlw (Low A697SIN)-1 ; start -1 movwf FSR TEMPXX1 incf FSR,F clrf INDF movf FSR,W xorlw LOW A1633COS2 ; CLEAR RAM FROM A697SIN-A1633COS2!!! bnz TEMPXX1 ; table read pointer clrf TABLECOUNTER clrf RESULT1 ; CLEAR RESULT DIGIT movf FSR_SAVE_DTMF, W movwf FSR ; RESTORE FSR bcf DTMF_DONE ; CLEAR DONE, START DTMF ISR ROUTINE DETECT1 btfss DTMF_DONE ; wait for the ISR part to end goto DETECT1 ; got one dtmf digit or '-' ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DTMF DECISION ALGORITHM ; compute absolute value acc = ABS(acc) STARTTEST movlw low A697SIN movwf FSR TESTFORNEG btfsc INDF,7 goto NEG goto NEXT NEG ; SUBTRACT F FROM 0 movf INDF,W sublw 0 movwf INDF NEXT incf FSR,F movf FSR,W xorlw low A1633COS2+1 ; for 1X and 2X bins the end is A1633COS2 bnz TESTFORNEG ; add acumulator results for sin and cos, results in cos , sin=0 movlw LOW A697SIN movwf FSR MORERESULTS movf INDF,W clrf INDF incf FSR,F addwf INDF,F movf FSR,W incf FSR,F xorlw low A1633COS2 ; for 1X and 2X bins the end is A1633COS2 bnz MORERESULTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; compare acc with treshold1X ; for 1X bins movlw LOW A697COS ; first result movwf FSR TEMPX1L movf INDF,W sublw treshold1XL ; treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore the bit is 0 in RESULT for W > treshold rrf RESULT,F incf FSR,F incf FSR,F movf FSR,W xorlw low A941COS+2 bnz TEMPX1L movlw low A1209COS ; first result movwf FSR TEMPX1H movf INDF,W sublw treshold1XH ; treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore the bit is 0 in RESULT for W > treshold rrf RESULT,F incf FSR,F incf FSR,F movf FSR,W xorlw LOW A1633COS+2 bnz TEMPX1H comf RESULT,F ; complement result>> bit is set if A...COS > TRESHOLD ; RESULT bits are 1633/1477/1336/1209/941/852/770/697 FOR VALUE>Treshold ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; compare acc with treshold2X for 2X bins movlw LOW A697COS2 ; first result movwf FSR TEMPX2L movf INDF,W sublw treshold2XL ; treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore the bit is 0 in RESULT for W > treshold rrf RESULT2X,F incf FSR,F incf FSR,F movf FSR,W xorlw low A941COS2+2 bnz TEMPX2L movlw low A1209COS2 ; first result movwf FSR TEMPX2H movf INDF,W sublw treshold2XH ; treshold-w--> W, carry=0 on borrow, ; W=31 carry=0, W=30 carry=1, W=29 carry=1! ; therefore the bit is 0 in RESULT for W > treshold rrf RESULT2X,F incf FSR,F incf FSR,F movf FSR,W xorlw LOW A1633COS2+2 bnz TEMPX2H movf RESULT2X, W ; 2X frequencies mask is 0 for 2X freq bin > treshold andwf RESULT, F ; apply 2X frequencies mask over 1X RESULT ; RESULT2 bits are for 2X frequencies 1633/1477/1336/1209/941/852/770/697 FOR VALUE>Treshold ; translate to ASCII ;********************************************** ; GOT ONE CHARACTER, CONVERT IT TO ASCII.... ;********************************************** movf RESULT,W xorlw B'00010001' bz GOTCHA1 movf RESULT,W xorlw D'33' bz GOTCHA2 movf RESULT,W xorlw D'65' bz GOTCHA3 movf RESULT,W xorlw D'18' bz GOTCHA4 movf RESULT,W xorlw D'34' bz GOTCHA5 movf RESULT,W xorlw D'66' bz GOTCHA6 movf RESULT,W xorlw D'20' bz GOTCHA7 movf RESULT,W xorlw D'36' bz GOTCHA8 movf RESULT,W xorlw D'68' bz GOTCHA9 movf RESULT,W xorlw D'40' bz GOTCHA0 movf RESULT,W xorlw D'72' bz GOTCHAPOUND movf RESULT,W xorlw D'24' bz GOTCHASTAR movf RESULT,W xorlw B'10000001' bz GOTCHAA movf RESULT,W xorlw B'10000010' bz GOTCHAB movf RESULT,W xorlw B'10000100' bz GOTCHAC movf RESULT,W xorlw B'10001000' bz GOTCHAD movlw '-' ; GOT ONLY TRASH... goto SENDIT ; CONVERT ASCII GOTCHAPOUND MOVLW H'23' GOTO SENDIT GOTCHASTAR MOVLW H'2A' GOTO SENDIT GOTCHA1 MOVLW H'31' GOTO SENDIT GOTCHA2 MOVLW H'32' GOTO SENDIT GOTCHA3 MOVLW H'33' GOTO SENDIT GOTCHA4 MOVLW H'34' GOTO SENDIT GOTCHA5 MOVLW H'35' GOTO SENDIT GOTCHA6 MOVLW H'36' GOTO SENDIT GOTCHA7 MOVLW H'37' GOTO SENDIT GOTCHA8 MOVLW H'38' GOTO SENDIT GOTCHA9 MOVLW H'39' GOTO SENDIT GOTCHA0 MOVLW H'30' GOTO SENDIT GOTCHAA MOVLW 'A' GOTO SENDIT GOTCHAB MOVLW 'B' GOTO SENDIT GOTCHAC MOVLW 'C' GOTO SENDIT GOTCHAD MOVLW 'D' GOTO SENDIT SENDIT movwf RESULT1 ; PLACE RECEIVED CHAR IN RESULT1 ;newline ; debug print: result of every decode ; movf RESULT1, W ; result of ONE decode ; call SendChar ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; DECISION ALGORITHM : A VALUE MUST BE DETECTED AT LEAST 2 TIMES ; BEFORE IS CONSIDERED VALID ; a missing value is accepted if it was detected at lest 2 times before ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; movf RESULT1, W ; use RESULT1 ASCII result xorwf TEMP_VAL,W ; COMPARE RESULT WITH TEMP_VAL bz DECI1 ; == ; RESULT1<>TEMP_VAL decf TEMP_TIMES, F bnz keepvalue ;<>0 ; reset value goto resetvalue keepvalue ; keep old RESULT1 value, but temp_times=1 - this will allow 1 missing value ; reset temp times to 1 movlw 1 movwf TEMP_TIMES bsf DTMF_RECOVER ; signal recover ; exception when temp_val='-' ==> reset to RESULT1 movlw '-' xorwf TEMP_VAL, W ; compare '-' with result1 bnz keepvalue1 ; <>0 ; reset value resetvalue movlw 1 movwf TEMP_TIMES movf RESULT1, W movwf TEMP_VAL bcf DTMF_RECOVER ; no recover keepvalue1 ; no new digit detected bcf DTMF_DETECTED return ; RESULT1==TEMP_VAL DECI1 incf TEMP_TIMES, F ; INC TEMP_TIMES skpnz decf TEMP_TIMES, F ; if temp_times=0 decrement to 255 ; check if TEMP_VAL='-' movlw '-' xorwf RESULT1, W ; compare '-' with result1 - if so temp_times=1 and return bnz DECI3 ; <>0 movlw 1 movwf TEMP_TIMES goto keepvalue1 DECI3 movlw .2 ; NUMBER OF TIMES DETECTED BEFORE DECIDE FOR A DIGIT! xorwf TEMP_TIMES,W bnz keepvalue1 ; <> no new digit ; GOT ONE VALUE MORE TIMES !!!!!!!!!!! btfss DTMF_RECOVER ; test for recover goto DECI2 ; no recover bcf DTMF_RECOVER ; reset recover bit and return with no new digit goto keepvalue1 ; no new digit DECI2 ; exit with new digit ; return result movf RESULT1, W movwf DTMF_RESULT bsf DTMF_DETECTED return GetUnLockChar movwf PCL UnlockCode: dt "#3479#",0 ; DTMF ACCESS CODE UnLockCodeEnd: IF ( (GetUnLockChar & 0x0FF) >= (UnLockCodeEnd & 0x0FF) ) MESSG "Warning - User Definded: UNLOCK CODE crosses page boundary" ENDIF END Pofavor se poderem me ajudar Soqueria mudar esta senha Segue a pagina onde tirei o projeto ( http://pe1grl.khds.nl/dtmf/dtmf.htm )
  21. Oi galera tudo bem, me desculpe se estou postando no lugar errado sou novo no fórum, já busquei aqui uma solução mas não encontrei nada parecido com quero fazer, estou iniciando em PIC e escrevi um programa para piscar um led que posteriormente usarei para acionar reles, o problema é o seguinte, quando pressiono o botão o LED acende aguarda um tempo e desliga e fica aguardando o botão ser pressionado novamente, mas quando mantenho o botão pressionado o LED fica acesso o tempo todo, eu preciso que o led só volte a acender quando eu soltar o botão e pressionar novamente, ou seja pressiono o botão (mantenho ele pressionado) o led acende aguarda um tempo e desliga e só volte a fazer esse ciclo quando soltar o botão e pressionar novamente. estou usando o microcontrolador pic12f675, e ccs para programar abaixo esta o programa ate aonde consegui fazer. deste já agradeço a atenção de todos. #include<12f675.h> #fuses INTRC_IO,NOWDT,PUT,NOBROWNOUT,NOMCLR #use delay(clock=4000000) void main() { while(TRUE) { if(input(pin_a1)==1){ //aguarda o botão ser pressionado output_high(pin_a0); //liga o led delay_ms(3000); //aguarda um tempo output_low(pin_a0);//desliga o led } } }
  22. questão.docx AJUDA Analise o programa e a figura com o diagrama esquemático abaixo. O programa é basicamente um pisca-pisca, acionado por botões (B1 a B4). Cada saída (P1 a P4) tem uma frequência quando o botão correspondente é acionado. O outro conjunto de saídas (L1 a L8) é acionada pelo potenciômetro, que está conectado na entrada analógica AN0. Arquivo: Questao.h ============================================================================ #include #device ADC=8 #use delay(crystal=4MHz) #use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B5,PIN_B4 ) #use FIXED_IO( C_outputs=PIN_C7,PIN_C6,PIN_C5,PIN_C4,PIN_C3,PIN_C2,PIN_C1,PIN_C0 ) #define EA1 PIN_A0 #define B1 PIN_B0 #define B2 PIN_B1 #define B3 PIN_B2 #define B4 PIN_B3 #define P1 PIN_B4 #define P2 PIN_B5 #define P3 PIN_B6 #define P4 PIN_B7 #define L1 PIN_C0 #define L2 PIN_C1 #define L3 PIN_C2 #define L4 PIN_C3 #define L5 PIN_C4 #define L6 PIN_C5 #define L7 PIN_C6 #define L8 PIN_C7 ============================================================================ Arquivo: Questao.c ============================================================================ #include short pisca_1, pisca_2, pisca_3, pisca_4; int ciclo_1, ciclo_2, ciclo_3, ciclo_4; short le_adc; long aux_valor, valor_adc, saida; #define valor_1 25 #define valor_2 75 #define valor_3 125 #define valor_4 225 #define ajuste 131 #INT_RTCC void RTCC_isr(void) { set_timer0(get_timer0() + ajuste); if (pisca_1) { ciclo_1--; if (ciclo_1 == 0) { output_toggle(P1); ciclo_1 = valor_1; } } if (pisca_2) { ciclo_2--; if (ciclo_2 == 0) { output_toggle(P2); ciclo_2 = valor_2; } } if (pisca_3) { ciclo_3--; if (ciclo_3 == 0) { output_toggle(P3); ciclo_3 = valor_3; } } if (pisca_4) { ciclo_4--; if (ciclo_4 == 0) { output_toggle(P4); ciclo_4 = valor_4; } } le_adc = 1; } void main() { port_B_pullups(0xFF); setup_adc_ports(AN0); setup_adc(ADC_CLOCK_INTERNAL); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8|RTCC_8_bit); output_low(P1); output_low(P2); output_low(P3); output_low(P4); output_c(0); ciclo_1 = valor_1; ciclo_2 = valor_2; ciclo_3 = valor_3; ciclo_4 = valor_4; enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); while(TRUE) { if (input(B1) == 0) { pisca_1 = 1; } else { pisca_1 = 0; } if (input(B2) == 0) { pisca_2 = 1; } else { pisca_2 = 0; } if (input(B3) == 0) { pisca_3 = 1; } else { pisca_3 = 0; } if (input(B4) == 0) { pisca_4 = 1; } else { pisca_4 = 0; } if (le_adc) { le_adc = 0; valor_adc = read_adc() / 29; aux_valor = valor_adc; saida = 1; while (aux_valor > 0) { saida = saida * 2; aux_valor--; } if (valor_adc > 0) { saida = saida - 1; } else { saida = 0; } output_c(saida); } } } ============================================================================ Pede-se: a) A frequência de acionamento dos LED P1 e P2. O intervalo de interrupção do TIMER0. c) Indicar os LEDS que estarão acesos se o potenciômetro estiver fornecendo 3,5 V na entrada analógica, cuja faixa vai de 0 a 5 V. d) O menor degrau de tensão detectado pelo conversor analógico do PIC.
  23. sou meio leigo com programação e queria uma ajuda para controla 2 display de 7 segmento independente e um através de dois um botão para cada display sendo que cada botão controla um display e cada fez que aperta o botão conta um ou seja incrementa um usando Arduíno ou um pic 16f877a pic 18f452 são o que eu tenho. alguém pode me ajuda com a programação para eu ter um caminho para eu começa .
  24. Comprei um gravador K 150 e não consigo gravar nada . Estou desistindo. Preciso de ajuda com a presença fisica. Alguem de região do ABC pode me ajudar? No passado, distante..... Aprendi a programar em assemble e gravar, estou reaprendendo, mas travei na etapa de gravação Estou com um equipamento mecanico pronto e preciso automatizar e entregar. Tem 2 solenoides, botão de partida , 2 reed switch e um circuito com display 7seg para indicar o timer
  25. Ola amigos do forum estou precisando de ajuda para dar inicio a elaborar um codigo basico de preferência usando copilador micko c para se comunicar com chip kt0803 Obrigado KT0803M_V1.1.pdf

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

×