Ir ao conteúdo
  • Cadastre-se

Ajuda com algorítimo relativamente simples


Posts recomendados

Meus caros, preciso de ajuda para montar o código para o seguinte algorítimo para PIC em "C" ou Assembly (só a rotina principal) o mais simplificado possível:

Ao pressionar e soltar o botão BOTÃO1 uma vez, o LED1 liga.

Ao pressionar e soltar o botão BOTÃO1 segunda vez, o LED1 desliga.

Ao pressionar e soltar o botão BOTÃO1 terceira vez, o LED2 liga.

Ao pressionar e soltar o botão BOTÃO1 quarta vez, o LED2 desliga.

Ao pressionar e soltar o botão BOTÃO1 quinta vez, volta para o início.

Abraço

Link para o comentário
Compartilhar em outros sites

Segue exemplo de programa:


;VERSÃO 1.0
;DESENVOLVIDO POR: MULDER_FOX
;DATA DE CONCLUSÃO: 08/06/2013


#INCLUDE <P16F628A.INC> ;ARQUIVO padrão MICROCHIP PARA O PIC16F628A

;BITS DE CONFIGURAÇÃO

__CONFIG _INTOSC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _BOREN_OFF & _LVP_OFF & _CP_OFF & DATA_CP_OFF

;PAGINACAO DE MEMORIA

#DEFINE BANCO_0 BCF STATUS,RP0 ;SETA BANCO 0 DE MEMORIA
#DEFINE BANCO_1 BSF STATUS,RP0 ;SETA BANCO 1 DE MEMORIA

;VARIÁVEIS

CBLOCK 0X20 ;ENDERECO INICIAL DA MEMORIA DO USUARIO

DB1_BTA ;PRIMEIRO REGISTRADOR DO DE-BOUNCING DO BOTÃO
DB1_BTB ;SEGUNDO REGISTRADOR DO DE-BOUNCING DO BOTÃO
FLAGS ;REGISTRADOR DE FLAGS

ENDC ;FIM DO BLOCO DE MEMORIA

;CONSTANTES

INI_DB1_BTA EQU .255 ;VALOR QUE DB1_BTA INICIA
INI_DB1_BTB EQU .20 ;VALOR QUE DB1_BTB INICIA


;SAÍDAS

#DEFINE LED_1 PORTB,0 ;SE = 1, O LED 1 ESTÁ ACESO
#DEFINE LED_2 PORTB,1 ;SE = 1, O LED 2 ESTÁ ACESO

;ENTRADA

#DEFINE BOTAO PORTB,2 ;BOTAO LIGADO EM RB2


;FLAGS

#DEFINE SOLTAR_BOTAO FLAGS,0 ;SE = 1 AGUARDA SOLTAR O BOTÃO
#DEFINE LED_1_OU_2 FLAGS,1 ;SE = 0, ACENDER O LED 1, SE = 1, ACENDER O LED 2

;VETOR DE RESET

ORG 0X00 ;ENDERECO INICIAL DE PROCESSAMENTO
GOTO INICIO ;DESVIA PARA INICIO

;ROTINA DE INTERRUPÇÃO

ORG 0X04
RETFIE

;configuração DOS REGISTRADORES DE USO ESPECÍFICO


INICIO
BANCO_1 ;SELECIONA BANCO 1 DE MEMORIA
MOVLW B'11111100'
MOVWF TRISB ;CONFIGURA O PINO RB0 E RB1 COMO SAIDAS E DEMAIS COMO ENTRADAS
BANCO_0 ;SELECIONA BANCO 0 DE MEMORIA


;INICIALIZACAO DAS VARIAVEIS

MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BCF LED_1 ;APAGA LED 1
BCF LED_2 ;APAGA LED 2


PRINCIPAL

CLRWDT ;LIMPA O WDT
BTFSS SOLTAR_BOTAO ;AGUARDA SOLTAR O BOTAO?
GOTO TESTA_BOTAO ;NAO, DESVIA
BTFSS BOTAO ;SIM, O BOTÃO ESTÁ SOLTO?
GOTO PRINCIPAL ;NAO
BCF SOLTAR_BOTAO ;SIM, APAGA FLAG
TESTA_BOTAO
BTFSC BOTAO ;O BOTÃO ESTÁ PRESSIONADO?
GOTO REINC_CONT_DEB ;NÃO, DESVIA
DECFSZ DB1_BTA,F ;SIM, DECREMENTA DB1_BTA. DB1_BTA = 0?
GOTO PRINCIPAL ;NAO
MOVLW INI_DB1_BTA ;SIM, W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
DECFSZ DB1_BTB,F ;DECREMENTA DB1_BTB. DB1_BTB = 0?
GOTO PRINCIPAL ;NAO
MOVLW INI_DB1_BTB ;SIM, W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
BSF SOLTAR_BOTAO ;SETA FLAG PARA AGUARDAR SOLTAR O BOTÃO
BTFSS LED_1 ;O LED 1 ESTÁ ACESO?
GOTO TESTA_LED_2 ;NAO
BCF LED_1 ;SIM, APAGA O LED 1
BSF LED_1_OU_2 ;SETA O FLAG
GOTO PRINCIPAL
TESTA_LED_2
BTFSS LED_2 ;O LED 2 ESTÁ ACESO?
GOTO ACENDER_LED_1_OU_LED_2 ;NAO
BCF LED_2 ;SIM, APAGA LED 2
BCF LED_1_OU_2 ;APAGA O FLAG
GOTO PRINCIPAL
ACENDER_LED_1_OU_LED_2
BTFSC LED_1_OU_2 ;ACENDER O LED_1?
GOTO ACENDE_LED_2 ;NÃO
BSF LED_1 ;SIM, ACENDE LED_1
GOTO PRINCIPAL
ACENDE_LED_2
BSF LED_2 ;ACENDE O LED 2
GOTO PRINCIPAL
REINC_CONT_DEB
MOVLW INI_DB1_BTA ;W = INI_DB1_BTA
MOVWF DB1_BTA ;INICIALIZA DB1_BTA
MOVLW INI_DB1_BTB ;W = INI_DB1_BTB
MOVWF DB1_BTB ;INICIALIZA DB1_BTB
GOTO PRINCIPAL

END ;FIM DO PROGRAMA
;PROGRAMA: UM BOTAO COMANDA DOIS LEDS 

Circuito:

BotatildeodePICcontroladoisLEDs2.png

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

Bom pode ser feito de varias maneiras, indico se em aprendizado utilizar apenas ifs. crie uma variável e a cada valor q ele toma, executa uma função. posto o código c para compiler ccs.

#include <16F628a.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)

#define botao PIN_a0
#define led1 PIN_a1
#define led2 PIN_a2
byte x=0; // programa inicia com variavel assumindo zero
void main()
{
output_low(led1); // obriga os pinos de saidas assumirem estado baixo durante a inicializaçao do programa
output_low(led2);

while(true)
{
delay_ms(200); // deboucing
If (input(botao)){x++;} // variavel q encrementa a cada aperto de botao
if (x>3){x=0;} // diz q qd x chegar 4 volte p 0
if (x==0){output_low(led1);output_low(led2);}
if (x==1){output_high(led1);output_low(led2);}
if (x==2){output_low(led1);output_low(led2);}
if (x==3){output_low(led1);output_high(led2);}
}
}

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

  • 1 ano depois...

infelizmente  não   da para postar  aqui  por extenso  pois  fiz no ladder  mas compactei  e postei diretamente o .hex    grave   obs: b0  é  entrada  e b1  saída  b2  também 

"amigo não espere muita coisa  poiz não sou programador mas  apenas tentei ajudar  ok "

teste.rar

post-650643-0-58858700-1406464247_thumb.

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

infelizmente  não   da para postar  aqui  por extenso  pois  fiz no ladder  mas compactei  e postei diretamente o .hex    grave   obs: b0  é  entrada  e b1  saída  b2  também 

"amigo não espere muita coisa  poiz não sou programador mas  apenas tentei ajudar  ok "

Obrigado Circuit, 

Mas ele nao esta funcionando , acontece q ele acende o primeiro led depois de um tempo que o botao foi apertado ja o segundo e o terceiro é imediato, mas eles nao apagam e como você só mandou o hex nao tenho como ver se acerto, no resto esta td bem..

Link para o comentário
Compartilhar em outros sites

 

bom corrigi  o problema do primeiro mas  os leds ainda  ficam acesos  há pois  ter cumprido a operação  !

como usei o ladder  fica ruim  postar   por isso  compactei de novo veja que consegui postar  em formaOk circuit 

Ok circuit, você nao conseke mandar o prog em c???

Link para o comentário
Compartilhar em outros sites

Ok circuit, você nao conseke mandar o prog em c???

 

 

  A logica do programa do Cesarlg esta correta, você esta acionando o botão com 0 ou 1? tenta inverter o sinal de entrada e vê se resolve o seu problema (os led's devem piscar porque você deixou o botão sempre na condição de acionado) se quiser dar uma incrementada no programa, pode colocar todo o código que compara os valores dentro da chave que testa se o botão foi acionado, assim o PIC só fara a analise quando o botão for pressionado... Outra coisa, o Port A do PIC 16f628a tem saídas multiplexadas com os comparadores, desligue os comparadores no registrador CMCON (CMCON = 0x07;) e recompile,  não se esqueça que o port A desse PIC é Dreno aberto... Se não quiser fazer isso, mude os LED's e o botão para o Port B (como no programa do Mulder_Fox) depois disso deve funcionar normalmente.

    Agora falando francamente, esse programa é muito básico (manipular os port's de entrada/saída). isso é uma das primeiras coisas que se aprende no estudos dos PIC's, apesar disso, eu não ví você postar uma duvida se quer, um esboço de programa ou até mesmo seu circuito ( não dá nem para saber se você aciona o botão com 0 ou 1 e pelo que eu vi do seu primeiro Post, você não disse nem com que PIC esta trabalhando), tudo que eu vi foi você pedindo código pronto. Então fica a dica, nós ajude para podermos te ajudar também, bastava postar seu diagrama pelo menos e sua duvida seria resolvida muito mais rápido....

 

  Espero ter ajudado.

Grato Luiz Gustavo.

Link para o comentário
Compartilhar em outros sites

@LuizGBarrio, voce tem toda a razão em seu comentário !

 

Infelizmente este foi mais um tópico em que começamos errado.... deveríamos ter pedido que o requerente postasse o código em C que ele tinha desenvolvido, pois é só assim que se aprende.

 

E como vocês disseram aqui, esse programa é muito, muito simples ...

 

Podemos ajudar, mas precisamos que quem está precisando também se ajude !

 

Paulo

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

2hs3mn8.jpgMe desculpem, mas eu disse o que queria, bom deixa pra lá, mas tentando chequei a isso.

O que eu quero é q aciono botao 1 vez acende o led1, aciono de novo apago o led1 e acende o led2 e assim por diante até chegar ao led9, ai zera tudo, olhem os arquivos abaixo nao consigo sair disso, com 2 leds no site do Filipflop funciona mas com 9 na dá.
Obrigado

 

#include <16F628A.h>
 
//configuração FUSES
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD
 
//Definicoes portas
#define BOTAO PIN_B4
#define PINO_LED1 PIN_A0
#define PINO_LED2 PIN_A1
#define PINO_LED3 PIN_A2
#define PINO_LED4 PIN_A3
#define PINO_LED5 PIN_A4
#define PINO_LED6 PIN_B0
#define PINO_LED7 PIN_B1 
#define PINO_LED8 PIN_B2
#define PINO_LED9 PIN_B3
 
 
//Define clock
#use delay(clock=4000000)
 
void main()
{
unsigned int status=0;
while(1)
    {
    //Verifica se o botao foi pressionado
    if(input_state(BOTAO) ==0)
        {
            //Altera status led1
            output_bit(PINO_LED1, status);
            
            //Altera Status led2
            output_bit(PINO_LED2, status);
            
           //Altera Status led3
            output_bit(PINO_LED3, status);
            
           //Altera Status led4
            output_bit(PINO_LED4, status);
           //Altera Status led5
            output_bit(PINO_LED5, status);
            //Altera Status led6
            output_bit(PINO_LED6, status);
            //Altera Status led7
            output_bit(PINO_LED7, status);
             //Altera Status led8
            output_bit(PINO_LED8, status);
             //Altera Status led9
            output_bit(PINO_LED9, status);
 
            delay_ms(500);
            //Inverte o valor da variável status
            status=!status;
        }
    }
}
Link para o comentário
Compartilhar em outros sites

 

Me desculpem, mas eu disse o que queria, bom deixa pra lá, mas tentando chequei a isso.

O que eu quero é q aciono botao 1 vez acende o led1, aciono de novo apago o led1 e acende o led2 e assim por diante até chegar ao led9, ai zera tudo, olhem os arquivos abaixo nao consigo sair disso, com 2 leds no site do Filipflop funciona mas com 9 na dá.

Obrigado

 

 

 

  Para dois leds funciona pois com duas opção sua variável assume o valor de Zero ou um, note no final do código que não se usa essa logica do contador e sim apenas se inverte o valor da variável de maneira que ela sempre sera zero ou um e se grava esse valor no port, no meu comentário anterior eu disse que a logica do Cesarlg esta correta, você deve tomar o programa dele como base.... Eu particularmente tentaria fazer assim:

void main (){ Byte count=0;setup_comparator(NC_NC_NC_NC);  while(true) {  if(input(BOTAO)==0)  {   if (count==9)count=0;   switch(count)       {        case 0: output_a(0x01);output_b(0x00); break;        case 1: output_a(0x02);output_b(0x00); break;        case 2: output_a(0x04);output_b(0x00); break;        case 3: output_a(0x08);output_b(0x00); break;        case 4: output_a(0x10);output_b(0x00); break;        case 5: output_a(0x00);output_b(0x01); break;        case 6: output_a(0x00);output_b(0x02); break;        case 7: output_a(0x00);output_b(0x04); break;        case 8: output_a(0x00);output_b(0x08); break;       default: count=0; break;       }   count++;  } }}

  Esse programa é só para demostrar a logica, se você tentar compilar ele pode dar alguns erros (não conheço a sintaxe do ccs), mas dá para ter uma noção de como deve ser feito. Acho que o tópico já esta com material suficiente para você alcançar seu Objetivo, agora só depende de você!!

 

  Espero ter ajudado.

Grato Luiz Gustavo.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

  Para dois leds funciona pois com duas opção sua variável assume o valor de Zero ou um, note no final do código que não se usa essa logica do contador e sim apenas se inverte o valor da variável de maneira que ela sempre sera zero ou um e se grava esse valor no port, no meu comentário anterior eu disse que a logica do Cesarlg esta correta, você deve tomar o programa dele como base.... Eu particularmente tentaria fazer assim:

void main (){ Byte count=0;setup_comparator(NC_NC_NC_NC);  while(true) {  if(input(BOTAO)==0)  {   if (count==9)count=0;   switch(count)       {        case 0: output_a(0x01);output_b(0x00); break;        case 1: output_a(0x02);output_b(0x00); break;        case 2: output_a(0x04);output_b(0x00); break;        case 3: output_a(0x08);output_b(0x00); break;        case 4: output_a(0x10);output_b(0x00); break;        case 5: output_a(0x00);output_b(0x01); break;        case 6: output_a(0x00);output_b(0x02); break;        case 7: output_a(0x00);output_b(0x04); break;        case 8: output_a(0x00);output_b(0x08); break;       default: count=0; break;       }   count++;  } }}

  Esse programa é só para demostrar a logica, se você tentar compilar ele pode dar alguns erros (não conheço a sintaxe do ccs), mas dá para ter uma noção de como deve ser feito. Acho que o tópico já esta com material suficiente para você alcançar seu Objetivo, agora só depende de você!!

 

  Espero ter ajudado.

Grato Luiz Gustavo.

Ola, estou agradecido pela ajuda e desculpe só agradecer agora, mas nao consegui nada ainda, rsrsrs, mas chego lá.
Só para vocês entenderem o que se passa, tenho 56 anos e só fazem 3 meses que me interessei por microprocessadores e comecei a estudar, tentando fazer um hobby disso.
Quando eu tinha 22 anos fiz curso de programaçao, Cobol, num computador chamado cobra 400II, chequei a fazer ate implatação de sistema, trabalhei na antiga Telesp, trabalhei com cartoes perfurados, fitas magneticas etc.
A logica até tenho um pouco ainda o que ajuda um pouco.
De novo peço desculpas, mas espero que você tenham entendidos.
Obrigado.
Carlos.
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...