Ir ao conteúdo

Posts recomendados

Postado

Eu criei um programa aparentemente simples. Fiz simulações no Isis Proteus e funciona, mas quando gravo no PIC 16f84A não funciona do mesmo jeito.

No circuito há 2 chaves:

Chave  (1). Tem 3 posições, no qual tem 3 terminais + um comum 
Chave (2). Tem duas posições, no qual tem 2 terminais + um comum

o que fiz foi usar if e else.

1 passo: Quando chave (1) está na posição 1 e chave  (2) está recebendo nível lógico 0v
   PORTB = 0b11000111;
2 passo: Quando chave (1) está na posição 1 e chave  (2) está recebendo nível lógico 5v
   PORTB = 0b11000111;
 
Ou seja, Tanto faz se Chave (2) receber nível lógico 0v ou 5v os Port's não mudará.

3 passo: Quando chave (1) está na posição 2 e chave (2) está no nível logico 0v
 PORTB = 0b00111111;
4 passo: Quando chave (1) está na posição 2 e chace (2) está no nível lógico 5v
PORTB = 0b00111011;

5 passo: Quando chave (1) está na posição 3 e chave (2) está no nível lógico 0v
PORTB = 0b00111000;

6 passo. Quando chave (1) está na posição 3 e chave (2) está no nível lógico 5v
PORTB = 0b00111100;

Estou usando o Copilador Mikro C e PIC 16F84A

iniciei o programa: 
 

 #define CLN RA0_bit
             #define ORG RA1_bit
             #define RED RA2_bit                // Botões
             #define NRM RA3_bit

void main()
{

                    TRISA = 0xFF;           //PORT's "A" são entradas
                    TRISB = 0x00;            // PORT's "B" são saídas

                     PORTA = 0xFF;      //PORTA's iniciam em nível lógico 1
                     PORTB = 0x00;      //PORTB's iniciam em nível lógico 0

adicionado 5 minutos depois

while (1)
{
                  if (ORG == 0x00 && NRM == 0x00)            // Se PORTA1 e PORTA3 estiverem nível lógico 0
                  {
                  PORTB = 0b00111111;
                  delay_ms(100);
                  }
                  else if (ORG == 0x00 && NRM == 0x01)          // Se PORTA1 estiver em nível lógico em 0 e e PORTA3  nível lógico 1
                  {
                  PORTB = 0b00111011;
                  delay_ms(100);
                  }

                  if (CLN == 0x00 && NRM == 0x00)                // Se PORTA0 e PORTA3 estiverem nível lógico 0
                  {
                  PORTB = 0b11000111;
                  delay_ms(100);
                  }
                  else if (CLN == 0x00 && NRM == 0x01)          // Se PORTA0 estiver no nível lógico 0 e PORTA3 estiver nível lógico 1
                  {
                  PORTB = 0b11000111;
                  delay_ms(100);
                  }

                   if (RED == 0x00 && NRM == 0x00)               // Se PORTA2 e PORTA3 estiverem nível lógico 0
                  {
                  PORTB = 0b00111000;
                  delay_ms(100);
                  }
                  else if (RED == 0x00 && NRM == 0x01)            // Se PORTA2 estiver no nível lógico 0 e PORTA3 estiver ível lógico 0
                  {
                  PORTB = 0b00111100;
                  delay_ms(100);
                  }

}
}

adicionado 20 minutos depois

no Isis funciona que é uma beleza. Mas na protoboard os relés ficam abrindo e fechando. Pensei q era problema com o microcontrolador, mas fiz uma programação acendendo LEDs nos port's e estão funcionando normal.

Acho que como estou usando a variável NRM. Mas estou tendo dificuldade pra solucionar.

Postado

Eu já testei sem os relés pra verificar as saídas, ou seja, apenas liguei o PIC com os Osciladores e chaves e os sinais estão variando. Apenas um PORT está em 5v fixo na saída. Fiz isso comutando a chave e mentindo com o multimetro. Só ficam fixo os 5v nos PORT's corretamente quando está: 

 

1 passo: Quando chave (1) está na posição 1 e chave  (2) está recebendo nível lógico 0v
   PORTB = 0b11000111;
2 passo: Quando chave (1) está na posição 1 e chave  (2) está recebendo nível lógico 5v
   PORTB = 0b11000111;
 
Ou seja, Tanto faz se Chave (2) receber nível lógico 0v ou 5v os Port's não mudará.

Que está assim:     

                  if (CLN == 0x00 && NRM == 0x00)                // Se PORTA0 e PORTA3 estiverem nível lógico 0
                  {
                  PORTB = 0b11000111;
                  delay_ms(100);
                  }
                  else if (CLN == 0x00 && NRM == 0x01)          // Se PORTA0 estiver no nível lógico 0 e PORTA3 estiver nível lógico 1
                  {
                  PORTB = 0b11000111;
                  delay_ms(100);

adicionado 6 minutos depois

Acho que como estou usando a variável NRM em todos os comandos ele está entrando em conflito. Acho que quando mudo a chave pra uma determina posição, invés de ler só a determinada posição ele está lendo as outras e por isso fica variando. Percebi que quando aumento o delay o Relé fica abrindo e fechando mais lento de acordo com o tempo que coloquei.
Mas não sei como resolver isso.

adicionado 39 minutos depois

Eu criei as variáveis:

          #define CLN RA0_bit
             #define ORG RA1_bit
             #define RED RA2_bit                // Botões
             #define NRM RA3_bit

E as usei. 
combinando exemplo:
 if (ORG == 0x00 && NRM == 0x00)            // Significa que quando ORG chave (1) posição 1 receber 0v e chaves                                                                                                     (2) também receber 0v o PORTB da um resultado.
  {
   PORTB = 0b00111111;                           
   delay_ms(100);
   }
  else if (ORG == 0x00 && NRM == 0x01) Significa que quando ORG chave (1) for receber 0v e chaves (2) 5v o PORTB da outro      PORTB = 0b00111000;                                                                                                                                                            resultado    delay_ms(100);                                                                                                                                                                                      

adicionado 41 minutos depois

E fiz assim para outras duas posições da chave (1), mas ao invés do programa ler aquele q for selecionado, lé tudo ai. No Isis Proteus funciona certinho, na Protoboard não.

adicionado 50 minutos depois

Teria que ter um comando que desligasse os if e else que não fossem selecionados 

  • Membro VIP
Postado

Ligou corretamente o ...

1 hora atrás, Isadora Ferraz disse:

reset

.. do mc?

Dica:

Pode fazer operações lógicas mais diretas com as variáveis tipo bit. Tipo:

if (!ORG && !NRM) PORTB=0x55;
if (ORG || RED) PORTB=0xaa;
if (!ORG || RED) PORTB=0xaf;
if (ORG ^ !RED) PORTB=0xfa;

 

1 hora atrás, Jemec disse:

Teria que ter um comando que desligasse os if e else que não fossem selecionados 

Um 'switch case break' faz isso. Mas melhor com o PORTA todo. Algo como:

switch (PORTA)
{
case 0b11111110: PORTB=0x55; break;
case 0b11111101: PORTB=0xaa; break;
case 0b11111011: PORTB=0xfa; break;
case 0b11110110: PORTB=0xaf; break; //possível você combinar 2 bits ou 2 teclas pressionadas juntas
default: PORTB=0x00;// se tudo acima falhar
}

O break pode atrapalhar a leitura das condições todas... melhor pensar... melhor...

  • Curtir 1
Postado
33 minutos atrás, Isadora Ferraz disse:

Ligou corretamente o ...

2 horas atrás, Isadora Ferraz disse:

reset

.. do mc?

Sim liguei. O que estou imaginando é que como o Loop: While (1) ele faz a leitura sequencialmente e quando chega no final ele retorna para o inicio esteja dando conflito.

adicionado 5 minutos depois

ocorre conflito, porque sempre está lendo o NRM RA3_bit 🙄

  • Membro VIP
Postado

Ok... Vá por partes... algo como

for(;;)

{

if (!ORG) PORTB|=0b00000001;

if (!RED) PORTB|=0b00000010;

if (!NRM) PORTB|=0b00000100;

if (!ORG && !RED) PORTB|=0b00001000;

delayms(1000);

PORTB&=0b10000000;//zera

PORTB^=0b10000000; //pisca led

}

Simule. E depois grave. É pra ver se sua montagem está correta. Seu esquema tá sinistro. Confirme que não está ligando

+12---[R15]---led->|-PORTB

Pelamôr né...

if (!(Foto && video) || (esquema==real)) mais_ajuda=0b00000000;

 

  • Curtir 1
Postado

Para mim :

 

1 - Faltam os diodos nas bobinas dos relés

2 - Falta o famoso circuito RC ( eu ainda uso um diodo também ! )  no pino do Reset do Pic.

3 - Se a alimentação de +5V é derivada da mesma fonte de 12V onde estão os relés .... tem de melhorar e muito a filtragem.

4 - Se montou em protoboard, tem de colocar um capacitor eletrolitico de 10 uF em paralelo com um cerâmico de 100nF diretamente nas trilhas dos pinos 5 e 14 do Pic.

 

Se funciona na simulação do Proteus, a grande chance é de que o problema é na montagem.

 

Paulo

  • Curtir 1
Postado
7 minutos atrás, Isadora Ferraz disse:

+12---[R15]---led->|-PORTB

Pelamôr né...

if (!(Foto && video) || (esquema==real)) mais_ajuda=0b00000000;

o R15 apenas está diminuindo a tensão para alimentar o LEDs que mostra qual posição que está da chave. O certo seria colocar 520R em cada Anodo.

Como a chave envia nível 0v para o PORT selecionado. Coloquei no catodo e apenas liguei o anodo no positivo 12v que alimenta os relés

adicionado 5 minutos depois

@aphawk 1 - Faltam os diodos nas bobinas dos relés. Sim, falta diodo pra proteção. "Colocarei"

Na imagem do circuito está faltando por 5v no MCLR, porque na hora de dar o print screen eu tirei a parte do oscilador e que não precisa pra simular no Isis e acabei tirando a polarização do MCLR.

adicionado 10 minutos depois

@aphawk 3 - Se a alimentação de +5V é derivada da mesma fonte de 12V onde estão os relés .... tem de melhorar e muito a filtragem.

Os 5v do PIC não é preciso colocar no Isis, o que precisam no caso do MCRL e Pull Down está com o a Seta pra cima que indica que está sendo colocado um sinal de 5v.

adicionado 13 minutos depois

Fiz na Protoboard usando um fonte de PC, no qual tem 12 e 5v. Mas para o projeto que é um chaveamento de amplificador. Vou usar um fonte de 12v regulada para os relés e com regulador pra 5v para alimentar o PIC

  • Membro VIP
Postado
7 minutos atrás, Jemec disse:

Coloquei no catodo e apenas liguei o anodo no positivo 12v que alimenta os relés

Por isso que eu disse pelamôr... não pode amigo. Os 12V podem pifar seu mc. Esqueça por enquanto os 12V, deixe só 5 e coloque leds nos pinos. E no mínimo te pedi o esquema REAL ou fotos ou video e te propus aquele programinha simplinho pra você testar sua montagem. Por favor teça algo com o que te passei.

 

E o amigo Paulão te informou de forma mais direta o que já tinha te dito subliminarmente. sobre os diodos, reset e etc. E também achou sinistro o esquema, afinal foi toda a informação técnica que ele achou. Por isso há importância em informar com desenhos, fotos, video e etc tudo certin, bunitin. Mas tudo bem, respeitamos alguma limitação.

 

Sim tenho o proteus mas não lembro se tenho em casa. Se quiser publicar o trem, tudo bem.

14 minutos atrás, Jemec disse:

MCRL e Pull Down está com o a Seta pra cima que indica que está sendo colocado um sinal de 5v. 

pullup por gentileza... sim... tem ambos no proteus.

  • Curtir 1
Postado

@Isadora Ferraz

for(;;)

{

if (!ORG) PORTB|=0b00000001;

if (!RED) PORTB|=0b00000010;

if (!NRM) PORTB|=0b00000100;

if (!ORG && !RED) PORTB|=0b00001000;

delayms(1000);

PORTB&=0b10000000;//zera

PORTB^=0b10000000; //pisca led

}

Esse código está dando erro na primeira linha. E não entendi. Achei o Switch case legal. Mais estou vendo ainda. Quanto aos 12v já desliguei e deixei 5v. Mas está mesma coisa. 

Postado

mtg.jpg.188a0b5fe56d1cd315e53b02048f2e79.jpg

adicionado 1 minuto depois

Cheguei usar o mesmo código, apenas do jeito que está na imagem pra medir as saídas e está do mesmo jeito. Vou ver se consigo fazer por Switch case.

  • Curtir 1
  • Membro VIP
Postado

Switch case fica mais elegante mas só isso. Ele ocupa um pouco + de memória. Mas claro, de nada vai te servir se você não souber a origem do problema. P.ex. cristal ou capacitor ruim, ou cagadinha na montagem ou a correta interpretação do erro do compilador e etc.

...

  • Curtir 2
Postado

@Isadora Ferraz Então cometi um erro ao colocar seu código, mas arrumei e não deu erro no copilador. Mas o funcionamento está estranho. Quando coloco posição da chave (1) o PORTB7 fica ligando e desligando e os outro PORTB's estão 0v.

adicionado 5 minutos depois

Chave (1) posição 2 o PORTB0 liga e o PORTB7 e o resto dos PORTB's estão 0v  e posição 3 o PORTB1 esta 5v e PORTB7 piscando e o resto dos PORTB's estão em 0v

adicionado 9 minutos depois

Isa.rar Dual.rar

adicionado 12 minutos depois

Eu coloquei o circuito e o programa. Esse funcionamento é o funcionamento perfeito. Que na prática não está dando certo. Estou quase colocando esse programa no PIC16F877A que tenho aqui.

adicionado 15 minutos depois

Vou fazer gravar no PIC16F877A  e se der certo algo está errado com 16f84A. "Apesar que fiz o teste de "HelloWord" com todos PORTB's. Mas se for o PIC como @Isadora Ferraz disse: - nada vai te servir se você não souber a origem do problema.

adicionado 53 minutos depois

Fiz o mesmo programa com PIC16F877A e simulei no Isis e ficou doido as saídas, igual  quando monto na protoboard com 16F84A. Ou seja, o problema está realmente no código.

  • Membro VIP
Postado

Amigo o estranho está no fato de quando você

3 horas atrás, Jemec disse:

coloco posição da chave (1) o PORTB7 fica ligando e desligando e os outro PORTB's estão 0v.

pois de fato o RB7 deve piscar o tempo todo

5 horas atrás, Isadora Ferraz disse:

PORTB^=0b10000000; //pisca led

e os outros RB's reagir com a mudança dos RA's

5 horas atrás, Isadora Ferraz disse:

if (!ORG) PORTB|=0b00000001;

por um segundo

4 horas atrás, Jemec disse:

delayms(1000);

ou 0,1

8 horas atrás, Jemec disse:

delay_ms(100);

 

Confira se seu mc tem comparador analógico e desabilite-o com algo como

CMCON=0xff;

Desabilite também as entradas analógicas. Veja no datasheet a seção do conversor ad do seu mc. Pode ser o registro ADCON0 ou ADCON1 ...programe para dddddddd

Verifique se programou corretamente os fuses wdog, xtal e etc. E o MCLR merece um capacitor pro gnd. Bem como um de desacoplamento. Re-leia o post do Paulão @aphawk

 

Não baixei os arquivos...publique o seu fonte direto aqui...

Postado

Ví que agora colocou um resistor de 10K no Reset do Pic. Mas ....  cadê o capacitor que deveria gerar o pulso de Reset no Power On ???????

 

Olha, no Proteus tudo roda mesmo faltando um monte de coisas, mas no protoboard a coisa é bruta, tem de seguir tudo o que o datasheet manda, ou teu circuito fica doido.

 

Pegue um capacitor de 1 uF e coloque entre o Reset e o GND para garantir.

 

E coloque os dois capacitores de desacoplamento que falei lá acima ou teu circuito de clock pode ficar doidão, fazendo funcionar intermitente ou com temporização errada.

 

Mantenha apenas os Leds no teu circuito até tudo funcionar direitinho, e só depois coloque a parte dos relés.

 

Paulo

  • Curtir 1
Postado

@aphawk Então, fiz a mesma programação no Isis usando o 16F877A e ficou do mesmo jeito quando monto na protoboard. Acho que deu algum Bug no Isis usando o 16F84A que funcionou.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!