Ir ao conteúdo
  • Cadastre-se

Interrupção 18f4550- não consigo configurar os registradores


Posts recomendados

#define S_1 RB0_bit
void interrupt(){

 // houve interrupção externa
TMR0IF=0; // reinicia a flag



if(!S_1) {
delay_ms(50);
parar();
}




}        //fim interrupt
void parar(){ // 1 passo do motor de passo

portd.f0=1;
portd.f1=0;
portd.f2=0;
portd.f3=0;

}//fim função parar

void main() {

cmcon=7;

GIE_bit=1;
PEIE_bit=1;
T0PS0:0x6;   // ciclo de instrução 1:128 8bits
TMR0IE=1;		//habilita a interrupção no tmr0
TMR0IF=0x06; // inicia tmr0 ciclo de 250

TRISB=1;
PORTB=1;

 while (1){



}//fim se



}//fim while

}//fim void

Galera, esse é o código que estou testando, quero saber se há algo de errado com ele, pois segui passo a passo uma aula, e sim, já tentei os codigos pra led e tudo mais, estou tentando acionar um motor de passo há mais de 1 mês, e não consigo aciona-lo apenas por um momento,( dar um passo e parar a execução mesmo com o botão estando pressionado, o botão simula um sensor)- e estudei interrupções pra isso, segue em anexo o erro que está dando no mikroc, estou criando o tópico, porque cansei de tentar resolver sozinho, e visto que, já assisti varias aulas, li muitos artigos, até aqui vi alguns artigos, mas não responderam minha dúvida. enfim é isso.

erro no código.png

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Estás no lugar certo... Vejamos...

 

41 minutos atrás, marcmec disse:

TMR0IF=0x06; // inicia tmr0 ciclo de 250

tem algo estranho aí. TMR0IF é um bit só. Penso que você confundiu. O certo seria TMR0=0x06, não?

Outra, não consigo ver "movimento" no seu sw. Tá "estático".  Cadê o movimento dos bits do motor de passo?

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz

void parar(){ // 1 passo do motor de passo

portd.f0=1;
portd.f1=0;
portd.f2=0;
portd.f3=0;

}//fim função parar

segue a função dos bits do motor acima, independente de ser TMR0IF  ou TMR0, ele ainda da erro, já tentei das duas maneiras, e sim, era pra ser um bit só, acabei esquecendo de apagar a linha T0PS0. (mb), pois tentei de outra forma também.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
29 minutos atrás, marcmec disse:

independente de ser TMR0IF  ou TMR0

por gentileza não os confunda. São registros conectados mas totalmente diferentes ok?

 

De fato (pra mim) ainda continua estático e sem movimento. Só a função parar()? Que "erro" que dá? você quer dar um passo a cada apertada do botão é isso? Se sim, não vejo isso no seu programa... Desculpe minha ignorância...

A pergunta tradicional... Já fez um pisca led?

Link para o comentário
Compartilhar em outros sites

já fiz um pisca led, já fiz sequencial, já fiz sinal de transito, já fiz controle por pwm, comparador a/d.

fiz como está no datasheet do pic, pra cada registrador do ITCON. E se o meu programa não faz isso, eu começo por onde ? porque não começa a explicar daí? e sim é pra cada apertada no botão o motor de passo dar o passo desejado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Que bom...

 

tudo bem... vejamos...

Tenta ver se a interrupt ocorre com algo como

portd.f3=^1;

você deve deslocar bits numa variável e aplicá-la no PORTD. Tenta algo como
 

unsigned char d=1;
//...

e na interrupt...(De fato, pra esta façanha nem precisa de interrupt, só do loop mesmo)

//...
PORTD=d;
d<<=1;
if (d>8) d=1;
//...

 

Dando certo, tenta entender.

Dica0: nunca deixe a bobina acionada por muito tempo

Tarefa/desafio: faça operar a meio passo.

Dica1: duas bobinas ligadas ao mesmo tempo. Dica2: também nunca deixe acionado por muito tempo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

estou pra desistir, eu não aguento mais namoral, eu tô tentando funcionar pela terceira forma, não sei se estou saturado, ou estou deixando passar algo, mas não funciona nada que tento, nem no proteus roda. e sim, eu já entendi que se eu colocar o bit pra rodar [1,0,0,0] caracteriza 1/4 de volta, e se eu colocar [1,1,0,0] caracteriza 1/2 volta.  mas nem com essa dica que você deu, eu consigo fazer isso. Algo que esqueci de mencionar, não sei se muda muita coisa, eu tô utilizando o driver l293d para este motor, que é bipolar de 4 fios. enquanto você não responde vou tentando aqui.

#define S_1 rb0_bit

#pragma orgall 0x1000
void main() org 0x1000 {
  unsigned char d=1;
cmcon=7;


TRISB=0;

portd=d;
 while (1){


if(!S_1){

d<<=1;
delay_ms(50);
if(d>8) d=1;

}

}//while

}//void

 o codigo que consegui fazer com que ao menos quando aperto o botão o motor funciona é este.

#pragma orgall 0x1000
#define S_1 Rb1_bit
#define S_2 Rb2_bit
//--------------------------------rodar direita---------------------------
void rodar_direita()
{
portd.f1 = 1;
portd.f2 = 1;
portd.f3 = 0;
portd.f4 = 0;
delay_ms(100);
portd.f1 = 0;
portd.f2 = 1;
portd.f3 = 1;
portd.f4 = 0;
delay_ms(100);
}
void rodar_esquerda(){
portd.f1 = 0;
portd.f2 = 0;
portd.f3 = 1;
portd.f4 = 1;
delay_ms(100);
portd.f1=0;
portd.f2=1;
portd.f3=0;
portd.f4=1;
delay_ms(100);
}

//----------------------------------main--------------------------------------
void main  ()org 0x1000
{
trisd= (0xf0); //metade das portas como entrada
CMCON=0x07;
while (1)
{
   if (S_1)
   {

   do{
rodar_direita();

   delay_ms(50);}
   while(S_1);

if (!S_1)
   {

   do{
   rodar_esquerda();}
   while(!S_1);

   }
           }
}
}

e mesmo assim ele gira quando aperto o botão, mas ele não executa o passo por cada aperto no botão, fica girando e girando, até soltar o botão. obrigado desde já, mas estou muito cansado a parte de programar o projeto ficou comigo, e não consigo fazer ao menos isso.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Desistir de algo fácil??! Difícil viu!! Seus limites estão pequenos. Trate de pensar grande.

Achar algo prontinho e personalizado para @marcmec deve ser 1 pouco difícil mas com quase menos de 1 clique no google e  achei isso

E lá dentro, isso

 

Bem, mas isso...

14 horas atrás, marcmec disse:

fica girando e girando, até soltar o botão.

...é exatamente o que você programou uai.

14 horas atrás, marcmec disse:

do{ rodar_esquerda();} while(!S_1);

são suas próprias "palavras"

pra o que você quer seria algo como:

for(;;){rodar_esquerda(); while(!S_1);while(S_1);}

Hás de ser apresentado ao debouncing (google it)

 

Me lembrei do site rogercom que falava sobre motor de passo. Nem sei se existe mais. Era bem legal. O google me retornou isso

https://sites.google.com/site/suportearhte/controle-motor-de-passo

 

Link para o comentário
Compartilhar em outros sites

Em 2017-5-25 às 08:03, Isadora Ferraz disse:

Desistir de algo fácil??! Difícil viu!! Seus limites estão pequenos. Trate de pensar grande.

Achar algo prontinho e personalizado para @marcmec deve ser 1 pouco difícil mas com quase menos de 1 clique no google e  achei isso

E lá dentro, isso

 

Bem, mas isso...

...é exatamente o que você programou uai.

são suas próprias "palavras"

pra o que você quer seria algo como:


for(;;){rodar_esquerda(); while(!S_1);while(S_1);}

Hás de ser apresentado ao debouncing (google it)

 

Me lembrei do site rogercom que falava sobre motor de passo. Nem sei se existe mais. Era bem legal. O google me retornou isso

https://sites.google.com/site/suportearhte/controle-motor-de-passo

 

Eu já tinha visto e estudado todos esses links que voce passou, não é algo personalizado, estou tentando programar com o que aprendi, e quando fui pesquisar sobre funções de botão ou varredura de botão, foi indicado o estudo de interrupção, e por isso desisti dos outros métodos, e comecei a estudar interrupção, quando tiro o (while(!s_1); ou mudo para while(S_1);) não faz nenhuma ação. Pra mim é difícil, comecei a ver pic esse ano...então...consegui configurar os registradores, mas ainda assim não atende o que quero, vou tentar fazer o que voce disse, mas até domingo vou fechar o tópico, esse projeto é pra hoje, ou era pra ser apresentado hoje, enfim. obg.

Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz

 

consegui!!!!! lembrei que  Unsigned char  varia de  0-255. coloquei uma variável de tempo e ficou assim o código.



//----------------------------função do sensor seguidor de linha------------------------------------------------------------------

//----------------------------------main--------------------------------------




#pragma orgall 0x1000
unsigned char tempo=50;
void main  ()org 0x1000
{
//intcon=0b11100100;

//setup_vref (false);
trisd= 0; //metade das portas como entrada
portd=0;

CMCON=0x07;
portb.f0=1;
while (tempo<100)
{
if(!portb.f1){
tempo++;
delay_ms(100);
portd.f0 = 1;
portd.f1 = 1;
portd.f2 = 0;
portd.f3 = 0;
delay_ms(100);
portd.f0=0;
portd.f1=1;
portd.f2=1;
portd.f3=0;
delay_ms(100);
portd.f0 = 0;
portd.f1 = 0;
portd.f2 = 1;
portd.f3 = 1;
delay_ms(100);
portd.f0 = 1;
portd.f1 = 0;
portd.f2 = 0;
portd.f3 = 1;
delay_ms(100);
}
}//fim if
}

assim ele vai funcionar até atingir a variável tempo. obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

bacana mano. Viu só? Nem doeu. Pena que o propósito deste projeto tem vida um pouco ...curta

1 hora atrás, marcmec disse:

esse projeto é pra hoje

 

Se continuasse neste caminho, num futuro qualquer você descobriria que algo como:

unsigned char const roda[]= {0b1100,0b0110,0b0011,0b1001};
unsigned char i;
while (tempo<100)
{
	if(!portb.f1)
		{
		tempo++;
		delay_ms(100);
		PORTD=roda[i++];
		if (i>3) i=0;
		}
}

faria o efeito da sua função. Mas enfim... fim... Sucessos!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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