duvidas interrupções por timer
Página 1 de 1
duvidas interrupções por timer
Pessoal me ajudem por favor, sou técnico em eletrônica, e os microprocessadores pic sem duvida eh uma ferramenta incrivel pessoal adaptei este codigo em mikroc, eh um contador multiplexado com 3 display
tem tres botoes up , down e o botao de tempo, seguinte o programa funciona bem, mas quando chega a ser acionado o botao de tempo, meu deus ele trava, sei que tenho muito que estudar sobre esta ferramenta
mas galera da uma ajuda ai. Pq trava o delay da travamentos em interrupções? como posso resilver isso, ajuda ai pessoal por favor. o codigo que adaptei esta assim
void main(){
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
unsigned char ucMask[] = {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9};
/* Variavel do tipo matriz que armazena os valores correspondentes ao numero
para ser mostrado no display de 7 segmentos */
unsigned char ucStatus_inc; // Variavel de travamento do incremento.
unsigned char ucStatus_dec; // Variavel de travamento do decremento.
unsigned int uiContador; // Variavel de armazenamento do contador.
unsigned int uiValor; // Variavel auxiliar para exibição do contador.
unsigned int uiValor1; // Variavel auxiliar para exibição do contador.
TRISB.RB4=1; // Define o pino RB0 do PORTB como entrada.
TRISB.RB5=1; // Define o pino RB1 Do PORTB como entrada.
TRISA.RA1=0; // Define o pino RA3 do PORTA como saida(Seleção Display 2).
TRISA.RA2=0; // Define o pino RA4 do PORTA como saida(Seleção Display 3).
TRISA.RA3=0; // Define o pino RA5 do PORTA como saida(Seleção Display 4).
TRISB = 0b11110000; // Define todos os pinos Do PORTD como saida.
ucStatus_inc=0; // Inicializa a variavel com o valor 0.
ucStatus_dec=0; // Inicializa a variavel com o valor 0.
uiContador=0; // Inicializa a variavel com o valor 0.
while(1){ // Aqui definimos uma condição sempre verdadeira como parametro, portanto todo o bloco será repetido indefinidamente.
// Le Tecla E Incrementa Contador.
if((PORTB.RB4==0)&&(ucStatus_inc==0)){ // Incrementa somente uma vez quando a tecla for pressionada.
ucStatus_inc=1; // Variavel de travamento do incremento.
uiContador++; // Esse operador aritmetico(++) realiza o mesmo que variavel = variavel + 1.
if(uiContador==21){
/* Essa comparação é feita pois nosso valor máximo é 9999. */
uiContador=20;
}
}
if((PORTB.RB4==1)&&(ucStatus_inc==1)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_inc=0;
}
// Le tecla e decrementa contador.
if((PORTB.RB5==0)&&(ucStatus_dec==0)){ // Decrementa somente uma vez quando a tecla for pressionada.
ucStatus_dec=1; // Variavel de travamento do decremento.
uiContador--; // Esse operador aritmetico(--) realiza o mesmo que variavel = variavel - 1.
if(uiContador>95){
/* Essa comparação é feita pois ao decrementar variaveis sem sinal o
valor irá para o valor máximo da variavel que no caso é 65535. */
uiContador=0;
}
}
if((PORTB.RB5==1)&&(ucStatus_dec==1)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_dec=0;
}
if (uiContador==1)
{
uiValor1=0x2;
}
if (uiContador==2)
{
uiValor1=0x4;
if(portb.RB6=0)
{
portd.rd7=1;
delay_ms(1000);
portd.rd7=0;
}
}
if (uiContador==3)
{
uiValor1=0x6;
}
if (uiContador==4)
{
uiValor1=0x8;
}
if(uiContador<=0){
/* Essa comparação é feita pois nosso valor máximo é 9999. */
uiContador=0;
}
uiValor = uiValor1; // Coloca o conteudo da variavel do contador na varaivel auxiliar.
// Mostra valor da unidade.
PORTB = ucMask[uiValor%10]; // Pega modulo (resto) da divisão por 10 e coloca o valor no PORTD.
PORTA.RA3 = 1; // Liga o transistor associado ao display 1.
Delay_ms(2); // Delay para escrita no display.
PORTA.RA3 = 0; // Desliga o transistor associado ao display 1.
uiValor/=10; // Divide variavel por 10.
// Mostra valor da dezena.
PORTB = ucMask[uiValor%10];
PORTA.RA2 = 1;
Delay_ms(2);
PORTA.RA2 = 0;
uiValor/=10;
PORTB = ucMask[uiValor%10];
PORTA.RA1 = 1;
Delay_ms(2);
PORTA.RA1 = 0;
uiValor/=10;
}
}
tem tres botoes up , down e o botao de tempo, seguinte o programa funciona bem, mas quando chega a ser acionado o botao de tempo, meu deus ele trava, sei que tenho muito que estudar sobre esta ferramenta
mas galera da uma ajuda ai. Pq trava o delay da travamentos em interrupções? como posso resilver isso, ajuda ai pessoal por favor. o codigo que adaptei esta assim
void main(){
// "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"
unsigned char ucMask[] = {0x0,0x1,0x2,0x3,0x4,0x5,0x6,0x7,0x8,0x9};
/* Variavel do tipo matriz que armazena os valores correspondentes ao numero
para ser mostrado no display de 7 segmentos */
unsigned char ucStatus_inc; // Variavel de travamento do incremento.
unsigned char ucStatus_dec; // Variavel de travamento do decremento.
unsigned int uiContador; // Variavel de armazenamento do contador.
unsigned int uiValor; // Variavel auxiliar para exibição do contador.
unsigned int uiValor1; // Variavel auxiliar para exibição do contador.
TRISB.RB4=1; // Define o pino RB0 do PORTB como entrada.
TRISB.RB5=1; // Define o pino RB1 Do PORTB como entrada.
TRISA.RA1=0; // Define o pino RA3 do PORTA como saida(Seleção Display 2).
TRISA.RA2=0; // Define o pino RA4 do PORTA como saida(Seleção Display 3).
TRISA.RA3=0; // Define o pino RA5 do PORTA como saida(Seleção Display 4).
TRISB = 0b11110000; // Define todos os pinos Do PORTD como saida.
ucStatus_inc=0; // Inicializa a variavel com o valor 0.
ucStatus_dec=0; // Inicializa a variavel com o valor 0.
uiContador=0; // Inicializa a variavel com o valor 0.
while(1){ // Aqui definimos uma condição sempre verdadeira como parametro, portanto todo o bloco será repetido indefinidamente.
// Le Tecla E Incrementa Contador.
if((PORTB.RB4==0)&&(ucStatus_inc==0)){ // Incrementa somente uma vez quando a tecla for pressionada.
ucStatus_inc=1; // Variavel de travamento do incremento.
uiContador++; // Esse operador aritmetico(++) realiza o mesmo que variavel = variavel + 1.
if(uiContador==21){
/* Essa comparação é feita pois nosso valor máximo é 9999. */
uiContador=20;
}
}
if((PORTB.RB4==1)&&(ucStatus_inc==1)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_inc=0;
}
// Le tecla e decrementa contador.
if((PORTB.RB5==0)&&(ucStatus_dec==0)){ // Decrementa somente uma vez quando a tecla for pressionada.
ucStatus_dec=1; // Variavel de travamento do decremento.
uiContador--; // Esse operador aritmetico(--) realiza o mesmo que variavel = variavel - 1.
if(uiContador>95){
/* Essa comparação é feita pois ao decrementar variaveis sem sinal o
valor irá para o valor máximo da variavel que no caso é 65535. */
uiContador=0;
}
}
if((PORTB.RB5==1)&&(ucStatus_dec==1)){ // Volta a disponibilizar a opção de incremento quando a tecla for solta.
ucStatus_dec=0;
}
if (uiContador==1)
{
uiValor1=0x2;
}
if (uiContador==2)
{
uiValor1=0x4;
if(portb.RB6=0)
{
portd.rd7=1;
delay_ms(1000);
portd.rd7=0;
}
}
if (uiContador==3)
{
uiValor1=0x6;
}
if (uiContador==4)
{
uiValor1=0x8;
}
if(uiContador<=0){
/* Essa comparação é feita pois nosso valor máximo é 9999. */
uiContador=0;
}
uiValor = uiValor1; // Coloca o conteudo da variavel do contador na varaivel auxiliar.
// Mostra valor da unidade.
PORTB = ucMask[uiValor%10]; // Pega modulo (resto) da divisão por 10 e coloca o valor no PORTD.
PORTA.RA3 = 1; // Liga o transistor associado ao display 1.
Delay_ms(2); // Delay para escrita no display.
PORTA.RA3 = 0; // Desliga o transistor associado ao display 1.
uiValor/=10; // Divide variavel por 10.
// Mostra valor da dezena.
PORTB = ucMask[uiValor%10];
PORTA.RA2 = 1;
Delay_ms(2);
PORTA.RA2 = 0;
uiValor/=10;
PORTB = ucMask[uiValor%10];
PORTA.RA1 = 1;
Delay_ms(2);
PORTA.RA1 = 0;
uiValor/=10;
}
}
- Anexos
marcuscosta1957- Mensagens : 1
Data de inscrição : 11/08/2014
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos
|
|