Boa tarde, estou utilizando um PIC 16F877A para fazer um velocímetro digital, a entrada é algum sensor que irei colocar na roda da bicicleta, a saída será em dois displays de 7 segmentos, mas por enquanto estou usando uma saída binária mesmo, o problema é que o código parece funcionar mas simulando no proteus não funciona.

Compilado no mikroC, e segue também em anexo o arquivo do código.

Conto com suas colaborações

Exibições: 2212

Anexos

Responder esta

Respostas a este tópico

cara se fosse me assembler eu ate poderia te ajudar mais de c não manjo nada

Olá Amigos, Estou precisando de uma ajuda para um projeto da faculdade para colocar um velocímetro em um Rover desenvolvendo em assembly, não tenho a minima ideia de como fazer, algum de vocês poderiam me ajudar?

Tem que ser com PIC ? E assembly ?

Ou pode ser com Arduino?

Bom dia, Obrigado pela resposta

Tem que ser com PIC e assembly.

eu recomecei o código... agora só preciso de um dado.. está funcionando, mas com valores errados. O tempo de estouro do timer0 é o  1 / [CLOCK / (4 x Prescaler)]?

olha vc tem que ver como vc ajusto o prescaler tipo?

1x1

1x2

1x4

1x8

e tambem como vc configurou o tmr0 atraves do bit T1SINC este bit e responsavel pelo tipo de incremento

espero que te ajude estas informações

mas o interessante seria vc ter o datasheet deste pic

 

já li este datasheet até de cabeça pra baixo...  configurando o option_reg coloquei tudo em 0 apenas o PS2, PS1 e PS0 em 1 para o prescaler ser 1:256. intão teria que estourar 3906 vezes para dar 1 segundo. Eu só consigo 1 segundo com 11 estouros.
ata ja entendi ou acho que entendi vamos la
vc esta incrementado o tmr0 por estimulus externo certo
esta usando prescaler de 1x256 certo
so que é o seguinte pelo que eu vi voce não configurou o option_reg corretamente veja so
tocs =0 ;tmr0 sera incrementado pelo clock de maquina
=1 ;tmr0 sera incrementado pela mudança de estado no pino ra4
entam vc tem que colocar o bit TOCS do OPTION_REG EM 1 OK
e tem mais vc tem que configurar como sera o incremento se sera na borda de subida no pino rb4 ou na borda de descida atraves do bit?
TOSE=0 ;o incremento sera na borda de subida
=1 ;o incremento sera na borda de descida
ai vc tem que levar em consideração a logica do sensor que vc esta usansdo
unsigned int ciclo; // está multiplicado por 100
unsigned int diam; // diametro em polegadas
unsigned int tempo; // contagem * ciclo
unsigned int estado;
unsigned int contagem; // contador de estouros
unsigned int vel_ang; // voltas/seg
unsigned int vel; // metros/seg
unsigned int raio_m; // raio em metros

conta_tempo(){
contagem = 0; // zera o contador
while(estado == 1){
if(INTCON.T0IF == 0b1){ // estourado o contador do timer0

contagem = contagem + 1; // soma 1 ao contador
INTCON.T0IF = 0; // limpa o flag do timer0
tempo = (ciclo/100)*contagem; // cálculo do tempo da volta
}
}
}
calcula_vel(){
vel_ang = 1/tempo;
vel = vel_ang*raio_m; // cálculo da velocidade linear
}


void interrupt() {
if(INTCON.INTF == 0b1 & estado == 0){ //detectada a primeira interrupção externa

INTCON.INTF = 0b0; //limpla o flag da interupção externa
estado = 1;
conta_tempo(); //função de cálculo do tempo de volta
}
if(INTCON.INTF == 0b1 & estado == 1){ //detectada a segunda interrupção externa

INTCON.INTF = 0b0; //limpa da interrupção externa
calcula_vel(); //função de cálculo da velocidade linear
estado = 0;
}
}

void main() {
TRISB = 0b00000001; // B0 é entrada
TRISC = 0b0;
PORTB = 0b0; //PORT B em 0
PORTC = 0b0;
OPTION_REG = 0b00110000; (no meu ponto de vista deveria ficar assim!)
INTCON = 0b10110110;
diam = 26;
raio_m = (diam/2)*(254/10000);
contagem = 0;
estado = 0;
tempo = 0;
vel_ang = 0;
vel = 0;
while(1){
PORTC = vel;
}
}
intendi sua explicação, mas o programa funciona do seguinte modo: o contador fica incrementando em uma variável a cada estouro do timer0... quando houver a interrupção do RB0, a variavel será zerada e começará incrementar novamente, quando ocorrer novamente a interrupção pelo RB0, é parada a contagem e faz se a análise do tempo gasto neste intervalo.. Eu postei errado o option_reg ele está do seguinte modo: option_reg = 0b11000111 e intcon = 0b10110000

tal ves seria mais facil vc incrementar o tmr0 pelo mudança de estado no pino rb4 por que ai vc teria o valor real e preciso da velocidade e a cada estouro vc incrementa a sua variavel

eu nao entendi o porque da interrupção pelo rb0 o que esta ligado a ele?

entra no bate papo que fica mais facil pra gente se falar

 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço