-
Posts
82 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Fabricantes
Livros
Cursos
Análises
Fórum
posts postados por Thiago Felipe Soares Gonçalves
-
-
Opa realmente estava invertido, porém ainda faltava configurar os registradores corretamente, segue o código:
void Interrupt()
{
if (TMR1IF_bit)
{
TMR1IF_bit = 0x00;
TMR1H = 0x0B;
TMR1L = 0xDC;
RC3_bit = ~RC3_bit;
}
}void main()
{
CMCON0 = 0x07;
T1CON = 0x31;
INTCON = 0xC0;
TMR1IF_bit = 0x00;
TMR1H = 0x0B;
TMR1L = 0xDC;
TMR1IE_bit = 0x01;TRISC = 0x00;
RC3_bit = 0x00;
RC4_bit = 0x00;
while(1)
{
RC4_bit = 0x01;
delay_ms(1000);
RC4_bit = 0x00;
delay_ms(1000);
}
}Obrigado pela ajuda.
-
Boa Tarde, estou com o seguinte problema estou tentando fazer uma interrupção por timer1 que conta até 500 ms. O código não funciona, mas não consigo achar o erro. Segue ele:
void interrup()
{
if(TMR1IF_bit)
{
TMR1IF_bit = 0x00;
TMR1L = 0x0B;
TMR1H = 0xDC;
RC4_bit = ~RC4_bit;
}
}void main()
{
CMCON0 = 0x07;
CMCON1 = 0x02;
INTCON = 0xC0;
TMR1IE_bit = 0x00;
TMR1L = 0x0B;
TMR1H = 0xDC;
T1CON = 0b00110001;
TRISC = 0x00;
RC3_bit = 0x00;
RC4_bit = 0x00;
while(1)
{
RC3_bit = 0x01;
delay_ms(1000);
RC3_bit = 0x00;
delay_ms(1000);
}
}Na simulação ele não inverte o estado do pino RC4.
-
Realmente, colocando o valor numérico do canal que quero usar, funcionou o código ficou assim:
#define LED1 PORTC.F2
#define LED2 PORTC.F3
#define LED3 PORTC.F4int AD = 0;
int AD2 = 0;void main()
{CMCON0 = 0x07;
ADCON1 = 0x00;TRISA = 0xFF;
TRISC = 0x00;
ANSEL = 0x03;PORTA = 0x00;
PORTC = 0x00;
while(1)
{
LED3 = 0x00;
delay_ms(500);
ADCON0 = 0x01; // Habilita o canal AN0
delay_us(100); // Tempo necessario para set o canal
AD = ADC_Read(0); // Lê a porta analogica AN0ADCON0 = 0x05; // Habilita o canal AN1
delay_us(100); // Tempo necessario para set o canal
AD2 = ADC_Read(1); // Lê a porta analogica AN1if(AD >= 512)
{
LED1 = 0x01;
}
else
{
LED1 = 0x00;
}
if(AD2 >= 512)
{
LED2 = 0x01;
}
else
{
LED2 = 0x00;
}
LED3 = 0x01;
delay_ms(500);
}
} -
Estou tentando ler o sinal de dois sensores cada um em uns dos canais do PIC16F688, usando as entradas analógicas AN0 e AN1, segue o código.
#define POT PORTA.F0
#define SENSOR PORTA.F1
#define LED1 PORTC.F2
#define LED2 PORTC.F3
#define LED3 PORTC.F4int AD = 0;
int AD2 = 0;void main()
{
ANSEL = 0x03;
CMCON0 = 0x07;TRISA = 0xFF;
TRISC = 0x00;PORTA = 0x00;
PORTC = 0x00;
while(1)
{
LED3 = 0x00;
delay_ms(500);
ADCON0 = 0x01;
AD = ADC_Read(POT);
delay_ms(100);ADCON0 = 0x05;
AD2 = ADC_Read(SENSOR);
delay_ms(100);if(AD >= 512)
{
LED1 = 0x01;
}
else
{
LED1 = 0x00;
}
if(AD2 >= 512)
{
LED2 = 0x01;
}
else
{
LED2 = 0x00;
}
LED3 = 0x01;
delay_ms(500);
}
}A ideia é simples, ele deveria ler os dois sensores comparar os valores de AD e AD2 nos ifs e acender o LED referente aquele sensor. O que acontece na simulação o AD do POT acende os dois LEDs e o AD2 do SENSOR não funciona.
-
Depois de ler mais a fundo o datasheet descobri que é necessário configurar as flags do registrado ANSEL para 0x00. O código fica assim:
bit control;
void interrupt()
{
if(INTF_bit)
{
control = ~control;
INTF_bit = 0x00;if(control) RC1_bit = 0x01;
else RC1_bit = 0x00;
}
}void main()
{
CMCON0 = 0x07;
ANSEL = 0x00;GIE_bit = 0x01;
INTE_bit = 0x01;
INTEDG_bit = 0x00;TRISA = 0b00000100;
TRISC = 0b00000000;
PORTA = 0b00000100;
PORTC = 0b00000000;control = 0x00;
while(1)
{
RC0_bit = 0x01;
delay_ms (2000);
RC0_bit = 0x00;
delay_ms (2000);
}
} -
Estou com um problema ao tentar fazer uma interrupção externa no PIC16F688, segue o codigo:
bit control;
void interrupt()
{
if(INTF_bit)
{
control = ~control;
INTF_bit = 0x00;
if(control) RC1_bit = 0x01;
else RC1_bit = 0x00;
}
}void main()
{
CMCON0 = 0x00;
CMCON1 = 0x00;
INTCON = 0b11010000;
INTEDG_bit = 0x00;
TRISA = 0b00000100;
TRISC = 0x00;
PORTA = 0b00000100;
PORTC = 0x00;
control = 0x00;
while(1)
{
RC0_bit = 0x01;
delay_ms (2000);
RC0_bit = 0x00;
delay_ms (2000);
}
}Tentei simular no Proteus mas não funcionou. A ideia é um led acender e apagar com delay de 2 segundos e ao aperta o botão que esta no pino RA2/INT ele deveria acender o segundo led e ao pressionar novamente apagar-lo. porém não funciona o cogido para o PIC16F688, mas para o PIC16F648 funcionou direito.
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
Como transformar uma variável decimal em hexadecimal?
em Microcontroladores
Postado
Boa noite, estou com o seguinte problema eu tenho uma variável tipo float, porém preciso transformar ela para int e depois para hexadecimal com 16 bit separando os 8 bits mais significativos dos 8 bit menos significativos.
O que quero fazer é uma interrupção pelo Timer1 com base num tempo calculado pelo meu programa dentro do main.
float T1 = 0.00; // Variável de tempo
T1 = (rad*8333.33)/3.14; // Calcula o tempo de espera para o chaveamento
Com base no tempo calculado em T1 preciso transformá-lo em um inteiro que seria o tempo em micro segundos arredondado para então transformá-lo em hexadecimal com 16 bits separando os 8 bits mais significativos dos 8 bits menos significativos para então armazená-los em.
TMR1H = 0xEF;
TMR1L = 0xB9;
Espero que possam me ajudar a resolver esse problema, agradeço muito atenção.