Ir ao conteúdo
  • Cadastre-se

Apagar e acender um led no mesmo botão dando erro !


Posts recomendados

Estou iniciando um  projeto de comunicação serial em pic com um supervisório em java , mas antes fiz um simples código para apagar e acender um led no mesmo botão , só q não consigo apagá-lo , já tentei de tudo e nada deu certo!

Uso o compilador pic ccs 4.78 , proteus 8 , windows 7 64 bits.

projetopicledbotao.txt

Link para o comentário
Compartilhar em outros sites

Não programo PIC, mas não está configurando o portb.0 como saída ao invés do portb.7 ?

set_tris_b (0b00000001);

 

O PIC é invertido se comparado aos AVR's  :D

 

Testei aqui e funcionou normalmente... A diferença é que a versão do CCS é a 5.046... Você pode postar o arquivo .lst?

 

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   INT a = 0;   set_tris_b (0b00000001);    WHILE (TRUE){         IF (input (pin_B0)) { //IF (input (pin_B0)==1) {         delay_ms (300);         a = a + 1;      }       IF (a == 1) {         delay_ms (50);         output_high (PIN_B7);      }       IF (a == 2) {         delay_ms (50);         output_low (PIN_B7);         a = 0;      }   }}
Link para o comentário
Compartilhar em outros sites

 

O PIC é invertido se comparado aos AVR's  :D

 

Testei aqui e funcionou normalmente... A diferença é que a versão do CCS é a 5.046... Você pode postar o arquivo .lst?

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   INT a = 0;   set_tris_b (0b00000001);    WHILE (TRUE){         IF (input (pin_B0)) { //IF (input (pin_B0)==1) {         delay_ms (300);         a = a + 1;      }       IF (a == 1) {         delay_ms (50);         output_high (PIN_B7);      }       IF (a == 2) {         delay_ms (50);         output_low (PIN_B7);         a = 0;      }   }}

 

CCS PCM C Compiler, Version 3.245, 28193               05-out-15 17:12

               Filename: J:\Arquivos de programas\trabalhos\Nova pasta\ledpiscando.lst

               ROM used: 70 words (3%)

                         Largest free fragment is 1978

               RAM used: 7 (4%) at main() level

                         8 (5%) worst case

               Stack:    1 locations

*

0000:  MOVLW  00

0001:  MOVWF  0A

0002:  GOTO   019

0003:  NOP

.................... # INCLUDE <16f628a.h>

.................... //////// Standard Header file for the PIC16F628A device ////////////////

.................... #device PIC16F628A

.................... #list

....................  

.................... # USE DELAY (CLOCK=4000000)

0004:  MOVLW  23

0005:  MOVWF  04

0006:  MOVF   00,W

0007:  BTFSC  03.2

0008:  GOTO   018

0009:  MOVLW  01

000A:  MOVWF  78

000B:  CLRF   77

000C:  DECFSZ 77,F

000D:  GOTO   00C

000E:  DECFSZ 78,F

000F:  GOTO   00B

0010:  MOVLW  4A

0011:  MOVWF  77

0012:  DECFSZ 77,F

0013:  GOTO   012

0014:  NOP

0015:  NOP

0016:  DECFSZ 00,F

0017:  GOTO   009

0018:  RETLW  00

.................... # FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP

.................... # USE FAST_IO(B)

....................  

....................    VOID MAIN (){

0019:  CLRF   04

001A:  MOVLW  1F

001B:  ANDWF  03,F

001C:  MOVLW  07

001D:  MOVWF  1F

....................    INT a = 0;

001E:  CLRF   21

....................    set_tris_b (0b00000001);

001F:  MOVLW  01

0020:  TRIS   6

....................  

....................    WHILE (TRUE){

....................       IF(a=0){

0021:  CLRF   21

0022:  MOVF   21,F

0023:  BTFSC  03.2

0024:  GOTO   026

....................          output_low (PIN_B7);

0025:  BCF    06.7

....................       }    

....................       IF (input (pin_B0) == 1){

0026:  MOVLW  00

0027:  BTFSC  06.0

0028:  MOVLW  01

0029:  SUBLW  01

002A:  BTFSS  03.2

002B:  GOTO   035

....................          delay_ms (300);

002C:  MOVLW  02

002D:  MOVWF  22

002E:  MOVLW  96

002F:  MOVWF  23

0030:  CALL   004

0031:  DECFSZ 22,F

0032:  GOTO   02E

....................          a = a + 1;

0033:  MOVLW  01

0034:  ADDWF  21,F

....................       }

....................  

....................       IF (a == 1){

0035:  DECFSZ 21,W

0036:  GOTO   03B

....................          delay_ms (50);

0037:  MOVLW  32

0038:  MOVWF  23

0039:  CALL   004

....................          output_high (PIN_B7);

003A:  BSF    06.7

....................       }

....................  

....................       IF (a == 2){

003B:  MOVF   21,W

003C:  SUBLW  02

003D:  BTFSS  03.2

003E:  GOTO   044

....................          delay_ms (50);

003F:  MOVLW  32

0040:  MOVWF  23

0041:  CALL   004

....................          output_low (PIN_B7);

0042:  BCF    06.7

....................          a = 0;

0043:  CLRF   21

....................       }

....................  

....................    }

0044:  GOTO   021

....................    }

....................  

0045:  SLEEP

Configuration Fuses:

   Word  1: 3F61   XT NOWDT PUT NOPROTECT BROWNOUT MCLR NOLVP NOCPD

 

será que o  problema está na versão do ccs que estou usando?

será q tem problema com windows 7 64 bits?

o proteus eu estou usando o 8!

Link para o comentário
Compartilhar em outros sites

Você mudou o código ¬¬
 
Vê se iso resolve... Estou chutando!! =D
Se resolver eu falo o que eu acho que está acontecendo...
# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(                # BYTE TRISB  = 0X86             // <<<--- Adicionado# BIT  TRISB0 = TRISB.0          // <<<--- Adicionado# BIT  TRISB7 = TRISB.7          // <<<--- Adicionado  VOID MAIN (){   INT a = 0;   //set_tris_b (0b00000001);    // <<<--- Retirado   TRISB0 = 1;                   // <<<--- Adicionado PINO B0 COMO ENTRADA   TRISB7 = 0;                   // <<<--- Adicionado PINO B7 COMO SAÍDA      WHILE (TRUE){         IF (input (pin_B0)==1) {         delay_ms (300);         a = a + 1;      }       IF (a == 1) {         delay_ms (50);         output_high (PIN_B7);      }       IF (a == 2) {         delay_ms (50);         output_low (PIN_B7);         a = 0;      }   }}

 

Edit: O # USE FAST_IO( B ) continua, erro meu!

Link para o comentário
Compartilhar em outros sites

 

Você mudou o código ¬¬
 
Vê se iso resolve... Estou chutando!! =D
Se resolver eu falo o que eu acho que está acontecendo...
# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(                # BYTE TRISB  = 0X86             // <<<--- Adicionado# BIT  TRISB0 = TRISB.0          // <<<--- Adicionado# BIT  TRISB7 = TRISB.7          // <<<--- Adicionado  VOID MAIN (){   INT a = 0;   //set_tris_b (0b00000001);    // <<<--- Retirado   TRISB0 = 1;                   // <<<--- Adicionado PINO B0 COMO ENTRADA   TRISB7 = 0;                   // <<<--- Adicionado PINO B7 COMO SAÍDA      WHILE (TRUE){         IF (input (pin_B0)==1) {         delay_ms (300);         a = a + 1;      }       IF (a == 1) {         delay_ms (50);         output_high (PIN_B7);      }       IF (a == 2) {         delay_ms (50);         output_low (PIN_B7);         a = 0;      }   }}

 

Edit: O # USE FAST_IO( B ) continua, erro meu!

 

Infelizmente não funcionou , eu acho meu  ccs bugou ou o proteus!

Link para o comentário
Compartilhar em outros sites

@_xyko_ Isso mesmo... :)  quando eu estava lendo o tutorial do Paulo Aphawk isso deu um nó na minha cabeça HEHE!!!

 

@fabiano aladin coloquei o CCS 4.78 para testar... Apesar de o PROTEUS mostrar um warning o circuito funcionou normalmente. Aparentemente o problema não está no CCS.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

tenho phd em pisca led

Um minimalista "Apagar e acender um led no mesmo botão..." acho que sem erro...

//pullup no circuito ou interno em RB1. Botão pro gnd#include "definições do mc"#define botao RB0#define led RB1void main(void){//setup geral do mc...TRISB=0b00000001;for(;{if (!botao) {while (!botao); led^=1;}}}

no proteus=ok. Na prática, ...debouncing

Link para o comentário
Compartilhar em outros sites

Então o problema está no proteus? estou usando duas versões a 8 e 7.7 e apresentam a mesma coisa!

Como faço para resolver isso?

Isso é bug de incompatibilidade com 64 bits?

Não sei nem como vou estudar  agora !

:(

@_xyko_ Isso mesmo... :)  quando eu estava lendo o tutorial do Paulo Aphawk isso deu um nó na minha cabeça HEHE!!!

 

@fabiano aladin coloquei o CCS 4.78 para testar... Apesar de o PROTEUS mostrar um warning o circuito funcionou normalmente. Aparentemente o problema não está no CCS.

Link para o comentário
Compartilhar em outros sites

tenho phd em pisca led

Um minimalista "Apagar e acender um led no mesmo botão..." acho que sem erro...

//pullup no circuito ou interno em RB1. Botão pro gnd#include "definições do mc"#define botao RB0#define led RB1void main(void){//setup geral do mc...TRISB=0b00000001;for(;{if (!botao) {while (!botao); led^=1;}}}

no proteus=ok. Na prática, ...debouncing

 

# INCLUDE<16F877.h>

# USE DELAY (CLOCK=4000000)

# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP

# USE FAST_IO( B)

# define TRISB set_tris_b

# define botao PIN_B1

# define led PIN_B5

 VOID MAIN (){

 

   TRISB(0b00000010);

 

   

   

   

   WHILE (TRUE){

   

      IF (!BOTAO) {

         

      

        while (!BOTAO){

            (LED == 1);

      

        }

      }

   }

}

até coloquei o circuiro para ver se eu dei mole em algo.Mas nada funciona !Não consigo apagar e acender o led pelo mesmo botão ! espero q não seja bug do programa !

Link para o comentário
Compartilhar em outros sites

Tenta aí:

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   INT a = 0;   set_tris_b (0b00000001);    WHILE (TRUE){         IF (input (pin_B0)) { //IF (input (pin_B0)==1) {         delay_ms (300);         a = a + 1;	while(input (pin_B0));      }       IF (a == 1) {         delay_ms (50);         output_high (PIN_B7);      }   else       IF (a == 2) {         delay_ms (50);         output_low (PIN_B7);         a = 0;      }   }}

Se for apenas para alternar a saída,tente assim;

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   INT a = 0;   set_tris_b (0b00000001);    WHILE (TRUE){         IF (input (pin_B0))      {         delay_ms (300);         output_toggle(PIN_B7);   while(input (pin_B0));      }   }}
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Na boa, eu já teria montado este circuitinho mesmo é na prática.

Com meia dúzia de linhas está em dúvidas com um simulador, imagina quando fizer um programa com centenas ou milhares de linhas.

Sou do tempo em que simular era somente imaginar o funcionamento antes de montar.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Defina melhor "nada funciona". Publique o circuito. você pode estar fazendo alguma cagadinha na "montagem". p.ex. deixando o pino reset aberto (se for isso.. puxão de orelha virtual). Rode passo a passo. Faça o led piscar com 0 libs externas. Algo como

void delay (unsigned int dl) //Se mc a 4Mhz...{while(dl--);//cada iteração deve dar alguns uS}  for(;{led^=1;delay(50000);}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Na boa, eu já teria montado este circuitinho mesmo é na prática.

Com meia dúzia de linhas está em dúvidas com um simulador, imagina quando fizer um programa com centenas ou milhares de linhas.

Sou do tempo em que simular era somente imaginar o funcionamento antes de montar.

o problema é que estou montando ainda um gravador serial , por alguns problemas não posso comprar um no devido momento!

 Já alterei até posição do resistor  do botão  e do led! e mesmo  assim nada de funcionar!

Será q algum problema por meu so ser 64 bits?talvez incompatibilidade do proteus ou ccs?

11v5kd4.png

 

 

#INCLUDE <16f628a.h>

#USE DELAY (CLOCK=4000000)

#FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP

#USE FAST_IO(A)

#USE FAST_IO( B)

#define bt PIN_A0

#define led PIN_B7

 VOID MAIN (){

   INT a = 0;

   set_tris_a (0b00000001);

   set_tris_b (0b00000000);

   output_B(0b00000000);

   

   WHILE (TRUE){

   

    if(input(bt)==1){

    

   output_D(led =~led);//apresenta erro aqui mas seu fizer led=~led; também dá erro

    }

   }

}

 

Defina melhor "nada funciona". Publique o circuito. você pode estar fazendo alguma cagadinha na "montagem". p.ex. deixando o pino reset aberto (se for isso.. puxão de orelha virtual). Rode passo a passo. Faça o led piscar com 0 libs externas. Algo como

void delay (unsigned int dl) //Se mc a 4Mhz...{while(dl--);//cada iteração deve dar alguns uS}  for(;{led^=1;delay(50000);}
Link para o comentário
Compartilhar em outros sites

@fabiano aladin

Piscar um Led não tem segredo.

O Compilador CCS,faz muita coisa 'sozinho' para o programador,e não era para voce ter dificuldade.

Segue um Link funcionando,com simulador.

http://www.4shared.com/rar/Gy-40-Tvba/CCS_LED.html

 

O código é esse;

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   set_tris_b (0b00000000);   set_tris_a (0b00000001);   setup_comparator(NC_NC_NC_NC); //DESABILITA OS COMPARADORES ANALOGICO DESTE PIC    WHILE (TRUE){         IF (input(pin_A0))      {        output_toggle(PIN_B7);        while(input(pin_A0)); //ENQUANTO A TECLA ESTIVER PRESSIONADA,NADA FAZ      }         }}
Link para o comentário
Compartilhar em outros sites

 

@fabiano aladin

Piscar um Led não tem segredo.

O Compilador CCS,faz muita coisa 'sozinho' para o programador,e não era para voce ter dificuldade.

Segue um Link funcionando,com simulador.

http://www.4shared.com/rar/Gy-40-Tvba/CCS_LED.html

 

O código é esse;

# INCLUDE <16f628a.h># USE DELAY (CLOCK=4000000)# FUSES XT ,NOWDT , PUT , BROWNOUT , NOLVP# USE FAST_IO(  VOID MAIN (){   set_tris_b (0b00000000);   set_tris_a (0b00000001);   setup_comparator(NC_NC_NC_NC); //DESABILITA OS COMPARADORES ANALOGICO DESTE PIC    WHILE (TRUE){         IF (input(pin_A0))      {        output_toggle(PIN_B7);        while(input(pin_A0)); //ENQUANTO A TECLA ESTIVER PRESSIONADA,NADA FAZ      }         }}

Obrigado  pelo jeito errei feio a lógica mas vou continuar estudando!

Agradeço a ajuda de todos!!!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

você que pediu...

Simulador não é pra "vida" inteira. É só um pontapé inicial - aliás muitíssimo bem dado - num projeto eletro-eletrônico. Agiliza demais da conta o projeto de um pisca led.

E te digo mais... até mesmo projetos relativamente (na verdade extremamente) complexos e profissionais (de utilidade real). Vá por mim... experiência própria

 

Um ponto de vista pra te dar um pouco de razão é que um simulador pode custar milhares de dólares. Muito mais que um simples arduíno. Só por este motivo lhe dou o braço a torcer

A propósito, não gosto de arduíno, assemby e ccs (mudou sua vida placar alho kk)


ops! @_xyko_

achei que tinha dito que não gostava de simulador neste tópico. Perdão. Tudo bem se eu manter o que escrevei acima? (pode apagar se quiser!)


(confusão... está na pagina anterior. é que não gosto de clicar em "citar"...)

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Falei que não gosto e não confiiiiiiiiio!

Entende!


 

Tipo:
 
CCS: Excelente para aprender pois te da tudo na mão, ele faz tudo por você e mostra tudo certinho durante o debug (não existe versão free), você pode até usar ele dentro do MPLAB...
 
MikroC: Existe versão free, porém não mostra as variáveis corretamente durante o debug no MPLAB (pelo menos até hoje eu não consegui fazer ele mostrar)...
 
XC: Existe versão free mas além de não otimizar ele piora o código (versão free) adicionando vários GOTO que não fazem sentido algum...
 
Se o MikroC mostrasse as variáveis de forma correta durante o debug ele seria o mais interessante... Dei uma olhada no forum da MikroE e várias pessoas têm esse problema... O bacana seria o MikroC com o MikroProg, como não tenho o MikroProg prefiro o CCS mesmo (PIC16/18 dsPIC e PIC24) e o XC (PIC32)!
 
Meu ponto de vista (hobby)!

 

AINDA BEM QUE NÃO  FALOU DO BASCOM.

 

Tudo o que você falo conheco um pouco.

Mas será que tem algum doutorado pra falar sobre...

CARA... eu sempre te admiro , @test man*~

Pensa!!!!!

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!