programaccs/proteus pic16f628a chaveamento/input

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

programaccs/proteus pic16f628a chaveamento/input

Mensagempor alex1000 » 30 Set 2008 23:37

Senhores, testei o programa abaixo no proteus e foi muito bem porem instalado no PIC :( :( :( >
Acredito que o problema seja algum erro de definição no input( sou novo na programação de PIC com CCS) e consequentemente não funciona o chaveamento dos pinos a,b,e,f,g nos respectivos comandos if.
Visto que só vejo em programas if(input(pin_b0) e não if(a==0) //(onde a=input(pin_b0) // talvez este seja o erro .
Poderiam me confirmar?
PS. é um programa para servomotor

Código: Selecionar todos
#include<16f628a.h>
#fuses NOWDT,NOPROTECT,PUT,NOLVP,MCLR,INTRC_IO
#use delay(clock=4000000)
#use fast_io(b)

long int valor;
long int i;

/*  *************************************   */
// neutro 1.5 ms
void neutro() //fun��o neutro ok
{
output_high(pin_b7);
delay_us(500);        //t_high=1.5 ms
delay_ms(1);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,1 ms
{
delay_us(100);
}
}

/*  *************************************   */

// aumento de pulsos


int aumenta(int valor)//fun��o para aumentar o ciclo
{

if(valor>=20)          //ok
{
output_high(pin_b7);       //t_high=2ms
delay_ms(2);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,1 ms
{
delay_us(100);
}
}

else                     //ok
{
output_high(pin_b7);
for(i=0;i<valor;i++)   //crescente
{
delay_us(100);
}
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20.1 ms
{
delay_us(100);
}
}
return valor;
}

/*  *************************************   */
//Diminui ospulsos

int  diminui(valor)
 {
if(valor<=10)
{
output_high(pin_b7);  // t_high=1ms
delay_ms(1);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20.1 ms
{
delay_us(100);
}
}
else
{
output_high(pin_b7);
for(i=0;i<valor;i++)
{
delay_us(100);
}
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,5 ms
{
delay_us(100);
}
return valor;
}
}

/*  *************************************   */
 // Escrita em eprom

 int write_eprom()
 {
 write_eeprom(0,valor);
 }


/*  *************************************   */

// Leitura em eprom

int read_eprom()
{
int eprom;
eprom=read_eeprom(0);
if(eprom==15)
{
neutro();
}
else if(eprom>15)
{
valor=eprom;
aumenta(valor);
}
else if(eprom<15)
{
valor=eprom;
diminui(valor);
}
}

 /*  *************************************   */
 // Fun��o principal

void main()
{
int a,b,c,d,e,f,g;
set_tris_b(0x7F);
port_b_pullups(true);
valor=15;

a=input(pin_b0); //esquerda
b=input(pin_b1); //direita
c=input(pin_b2); //up - ainda não funcional
d=input(pin_b3); //down  -ainda não funcional
e=input(pin_b4); //neutro
f=input(pin_b5); //write_eprom
g=input(pin_b6); //read_eprom
output_low(pin_b7);

while(true)
{
if(a==0 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1)
{
aumenta(valor);
valor=valor+1;
}
else if(a==1 && b==0 && c==1 && d==1 && e==1 && f==1 && g==1)
{
diminui(valor);
valor=valor-1;
}
else if(a==1 && b==1 && c==1 && d==1 && e==0 && f==1 && g==1)
neutro();
else if(a==1 && b==1 && c==1 && d==1 && e==1 && f==0 && g==1)
write_eprom();
else if(a==1 && b==1 && c==1 && d==1 && e==1 && f==1 && g==0)
read_eprom();
else if(a==1 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1)
{
delay_us(1);
output_low(pin_b7);
}
}
}
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor fabim » 01 Out 2008 08:23

maninho..
Referenciar um byte para um bit ?
delayuS(1) ??

nossa refaça o programa, ta muito doido!!

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 01 Out 2008 08:42

2 dias no jardim da infância e já é doutor. rs

as leituras de entrada num devem estar dentro do loop não??? verif ou desabilite o pino de reset. quanto ao delay(1uS) só pra ir e voltar na função leva + que isso (@ 4Mhz). ah, e o writeprom dentro do loop vai detonar ela rapidinho se aquela cond for + verdadeira de todas.
uma sugestão: com "switch(PORTB) ...case xxx:..." num ficaria + inteligível, não?? num se preocupe. a introdução do pic no c é assim mêmo...
bons estudos....
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 01 Out 2008 09:10

linda amiga, óia.rs
Né issu não LELLIS.
"Pelo amor de deus what your name ?"

lógica é lógica, independente da linguagem..

Amigo.

a=input(pin_b0); //esquerda
b=input(pin_b1); //direita
c=input(pin_b2); //up - ainda não funcional
d=input(pin_b3); //down -ainda não funcional
e=input(pin_b4); //neutro
f=input(pin_b5); //write_eprom
g=input(pin_b6); //read_eprom
output_low(pin_b7);

while(true)
{
if(a==0 && b==1 && c==1 && d==1 && e==1 && f==1 && g==1)

Este while(true)..
Observe que ele esta prendendo apenas nos processos a baixo, e você não esta fazendo o scan novamente Àcima do while.
Pelo menos é o que deu pra entender nessa salada de caracteres..rs

Abraços e veja aí o que eu disse se confere!!

Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 01 Out 2008 09:34

my name is nobody. conta pra ninguém não, mas sou de outro plano ou planeta, como queira. e como já disse, ninguém.
ninguém confirma sua análise. e meu amigo spoky diz que sua lógica tá certa. traduziu diretin prumininin
uai, cê num tava largano o forum não, siô?? =eu? rs.
abs.......
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor alex1000 » 01 Out 2008 11:52

Agradeço aos amigos pelas sugestões e gostaria de comenta-las
1) pelo que eu entendi a associação das variaveis devem estar dentro do loop, para que cada passagem do if possa fazer a leitura dos pinos, correto?
2) As variaveis podem ser usadas dentro do if para comparação?

Antes que me matem, calma que eu sou meio devagar :D :D
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor fabim » 01 Out 2008 12:01

então amiguinho lesmatico. kkk como diria o lindo lellis.

quando você diz.
While (1)/(true).
vocÊ diz, enquanto verdade... mais o que ? verdade do que ?
como não informou isto é um erro,e então substitui-se, por, linguagem humana como sendo.

Faça_infinitamente{



}

observe que colocou o scan aqui ó.

void main(void)
{
// scan de lógica do sistema
// deve ser lido toda hora
// em loop infinito
Faça_infinitamente{
// Seu sistema!!

}
}

observe que isto foi uma caquinha simples..
Basta jogar esse scan dentro do
While(true){

e Zé fini
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor joao » 01 Out 2008 12:06

ola Alex1000,

1) Sim, para cada loop do while você precisa reler os pinos, porque senão, você não saberá que o valor mudou, já que não está passando este valor para a variável.

2) Sim, você pode usar as variáveis para comparação. Mas você poderia ver sobre como usar unions e structs para fazer isso. Se você quiser aprender mais, procura no search sobre este assunto e você vai ver que é possível ter algo mais "entendivel" usando struct. Se mesmo depois de ler o que é vc não entendeu, pergunta novamente para a gente que a gente tenta explicar de outra maneira para ti! :D

3) Vc fez como o teste no proteus que lá está funcionando e no pic não? Pq com este erro, vc não conseguiria fazer funcionar no proteus. Tente verificar como é os testes que vocês está fazendo no proteus, porque aparentemente o seu teste também pode estar errado.

[]'s
Avatar do usuário
joao
Byte
 
Mensagens: 463
Registrado em: 17 Out 2006 08:21

Mensagempor fabim » 01 Out 2008 12:42

tenta fazer assim.!!
Código: Selecionar todos
#include<16f628a.h>
#fuses NOWDT,NOPROTECT,PUT,NOLVP,MCLR,INTRC_IO
#use delay(clock=4000000)
#use fast_io(b)

long int valor;
long int i;


/*  *************************************   */
// neutro 1.5 ms
void neutro() //fun��o neutro ok
{
output_high(pin_b7);
delay_us(500);        //t_high=1.5 ms
delay_ms(1);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,1 ms
{
delay_us(100);
}
}

/*  *************************************   */

// aumento de pulsos


int aumenta(int valor)//fun��o para aumentar o ciclo
{

if(valor>=20)          //ok
{
output_high(pin_b7);       //t_high=2ms
delay_ms(2);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,1 ms
{
delay_us(100);
}
}

else                     //ok
{
output_high(pin_b7);
for(i=0;i<valor;i++)   //crescente
{
delay_us(100);
}
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20.1 ms
{
delay_us(100);
}
}
return valor;
}

/*  *************************************   */
//Diminui ospulsos

int  diminui(valor)
 {
if(valor<=10)
{
output_high(pin_b7);  // t_high=1ms
delay_ms(1);
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20.1 ms
{
delay_us(100);
}
}
else
{
output_high(pin_b7);
for(i=0;i<valor;i++)
{
delay_us(100);
}
output_low(pin_b7);
for(i=0;i<180;i++)    // t_low=20,5 ms
{
delay_us(100);
}
return valor;
}
}

/*  *************************************   */
 // Escrita em eprom

 int write_eprom()
 {
 write_eeprom(0,valor);
 }


/*  *************************************   */

// Leitura em eprom

int read_eprom()
{
int eprom;
eprom=read_eeprom(0);
if(eprom==15)
{
neutro();
}
else if(eprom>15)
{
valor=eprom;
aumenta(valor);
}
else if(eprom<15)
{
valor=eprom;
diminui(valor);
}
}

 /*  *************************************   */
 // Fun��o principal

void main()
{
unsigned char porta; // não precisa ser 16 bits pode ser 8
//int a,b,c,d,e,f,g;  32 bytes a menos
set_tris_b(0x7F); 
cmcon = 0x07 ; // num sei se esta usando mais...
                       // não custa desligar comparadores analogicos

port_b_pullups(true); // pull ups são apenas RB4..7
                               // tu colocou nos 0...3 ?
valor=15;

//a=input(pin_b0); //esquerda
//b=input(pin_b1); //direita
//c=input(pin_b2); //up - ainda não funcional
//d=input(pin_b3); //down  -ainda não funcional
//e=input(pin_b4); //neutro
//f=input(pin_b5); //write_eprom
//g=input(pin_b6); //read_eprom
output_low(pin_b7);

while(true)
{
porta = portb;
porta = porta & 0X7F; // mascara PB7 para 0 para garantir
 
if(porta== 0B01111110)
{
aumenta(valor);
valor=valor+1;
}
else if(porta==0B01111101)
{
diminui(valor);
valor=valor-1;
}
ese if(porta== 0B01101111)
neutro();
else if(porta==0B01011111)
write_eprom();
else if(porta==0B00111111)
read_eprom();
else if(porta==0B01111111)
{
delay_us(1);
output_low(pin_b7);
}
}
}


Atestanha aí, qualquer coisa tamos aí.. Fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor ze » 01 Out 2008 13:42

com isso tudo de professor amanhã já vai dominar o planeta.
tamém mostrar meus Conhecimentos Hipotéticos Universais Técnicos ExplicativoS...uai...

if (inputpin()) iéca!!! 1 das odiáveis cagadas do ccs!!
veja o que meu querido hitech c faria e seria =zin o asm!!
(só a parte de ler bit tá)
...
...
for (; ; )
{
...
if (!RA0) função0();
if (!RA1) função1();
if (!RA2) função2();
...
if (!RAx) funçãox();
...
}
ah. 1 detalhe: dentro (no começo) da funçãox() coloque while(!RAx); pra esperar soltar a tecla e não executar + de 1 vez (debounce)
função1()
{
while(!RA1);//tira o dedão do meu botão siô!!
...
}
mas no fundo é a lesma lerda. struct & union são boas dicas. mas vá com calma. creia-me: quando chegar lá vai querer voltar. alguns compiladores (exceto hitech c) tendem a permitir que ocupem muita memória. (apesar de union objetivar o contrário). já que estou falando nisso: "if (...) funçao()" ocupa menos memória que "switch (...) {case x:...;break;}". desculpe comentário pobre, mas trabalho com pobres também. (pic10f, pic12f & cia) e 100% C.

logo, logo vai você vai ser um bom garoto de programa. (dif. d´eu .rs)
Ah e peça pro Padre Marcelo (vulgo joão) que ele faz tudim pru c, viu?. rs.


abs
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor fabim » 01 Out 2008 14:07

óia... tendi nadegas

LA onde eu coloquei uma variavel com nome de "porta", vai dar erro na compilação, coloca outro nome.
unsigned char comparador; por exemplo

fabim
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

x