×
Ir ao conteúdo
  • Cadastre-se

PIC ligar e desligar led por botao , 5 conjuntos de led


Posts recomendados

@welton_udi ,

 

Infelizmente eu não posso te ajudar nessa linguagem, se fosse em Basic eu conseguiria com certeza.

 

De qualquer maneira, foram postadas aqui neste tópico informações suficientes para resolver o problema, mas que exigem você re-escrever o loop de seu programa.

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

@Isadora Ferraz @Isadora Ferraz  eu estou querendo fazer com uns 8 leds varios tipos de efeitos diferente, porém quero mudar os efeito usando apenas um botão. eu fizz aqui de um jeito so que as vezes pressiono o botao e nao pula. você poderia me ajudar a resolver esse problema?? 

 

 esse ai e o codigo que fiz mais ou menos so pra você entender melhor o que quero fazer

 

#define botao1 RC0_bit
#define led1 RA4_bit
#define botao2 button(&portc, 1, 1, 1)


void main()
{
unsigned int cont=0;
 bit flagc0,
 
trisb =0b00000000;
portb= 0b00000000;
trisc= 0b00000001;
portc= 0b00000000;
TRISA= 0B00000000;
PORTA= 0B00000000;
  while(1)
  {
      if((botao1 &&  flagc0==1))
      {
       flagc0=0;
       
      }
      if((botao1 &&  flagc0==0))
      {
       flagc0=1;
       cont++;
      }

     if(cont == 1)
        {
         rb0_bit=1;
         delay_ms(80);
         rb1_bit=1;
         delay_ms(80);
         rb2_bit=1;
         delay_ms(80);
         rb3_bit=1;
         delay_ms(80);
         rb4_bit=1;
         delay_ms(80);
         rb5_bit=1;
         delay_ms(80);
        }

        if(cont == 2)
        {
         rb5_bit=1;
         delay_ms(80);
         rb4_bit=1;
         delay_ms(80);
         rb3_bit=1;
         delay_ms(80);
         rb2_bit=1;
         delay_ms(80);
         rb1_bit=1;
         delay_ms(80);
         rb0_bit=1;
         delay_ms(80);
        }else{portb=0;}

         if(cont == 3)
        {
         portb=0b00000000;
         delay_ms(80);
         portb=0b00100001;
         delay_ms(80);
         portb=0b00110011;
         delay_ms(80);
         portb=0b00111111;
         delay_ms(80);
         portb=0b00000000;
         delay_ms(80);
        }
  }


}

Link para o comentário
Compartilhar em outros sites

@Ricardov Screenshot_1.png.363241a5610036e54403187e2ceb4d62.png

quero com um botão ou 2 ir mudando os efeitos dos leds, eu fiz aqui mais tenho q pressionar varias vezes o botão para que o pic mude os efeitos dos led. depois de pesquisar na internet descobri que e porque o pic trabalha por pulling, linha por linha... entao pra fazer isso tenho q usar interrupçao ne? que ira tratar p botao com preferência é isso? o que acontece é que nao estou conseguindo usar essa interrupçao do pic 16f886@Isadora Ferraz

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

O seu circuito está como pulldown (eu gosto de colocar com pullup). Então...

while(botao1); // ...basta esperar que a entrada vá pra 0...
delay(50); //...dar um tempo...
while(!botao1); // ...e esperar que ele volte a 1.

...

 

Link para o comentário
Compartilhar em outros sites

Em 12/11/2017 às 19:31, Isadora Ferraz disse:

@aphawk confessa vai.. você tem uma quedinha pelo c (linguagem de programação!)

 

 

em basic me lembro vagamente que era o tal gosub . Sim ja tive queda pelo basic a ponto de ficar a noite no serviço pra concluir trabalhos. O tempo voava. Hormônios à flor da pele.Era um apple alguma coisa. Em casa não tinha computador... .. saudade...

 

Bons tempos .... eu usava um Apple ][ com placa CPM/80, compilava soft em ASM no M80/L80 para usar no hardware de controle de processos, e esse hardware comunicava via serial com uma GUI feita no Basic do Apple ....

 

Paulo

Link para o comentário
Compartilhar em outros sites

@joelTGA , interrupção é uma entrada que provoca uma reação sem que seja necessário ficar fazendo a leitura do pino por softer. O hard faz isso por ti. Os periféricos (timer, ADC, etc) também podem ser setados para geração de interrupção. Cada origem de interrupção te lança a um endereço diferente. Dessa forma se escreve uma rotina para cada interrupção sem que seja necessário pesquisar a origem.

Dependendo do MCU todos os pinos e periféricos ou apenas uns poucos podem ser utilizados como interrupção. No seu modelo apenas o pino 21. Note que ao lado tem as funções possíveis: RB0, AN12, INT, isto é, IO0 da portaB, entrada analógica12 e Interrupção.

O que a interrupção faz é tirar o programa da sua sequência normal, executar as tarefas definidas na subrotina e ao encontrar o comando de fim de interrupção (dependendo do MCU não é um return comum) volta ao ponto onde a rotina se encontrava.

Esse modelo tem apenas 1 entrada de interrupção. Para ter 2 botões basta um diodo.

- botão1 no INT, resistor pull down.

- botão2 num GPIO, resistor pull down. Do botão2 sai um diodo para excitar o INT.

Na rotina de interrupção consulte o GPIO do botão2 para saber qual botão foi pressionado e execute a tarefa apropriada.

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

  • Membro VIP
11 horas atrás, Sérgio Lembo disse:

apenas 1 entrada de interrupção

Alguns (talvez este) permite programar o portb pra detectar mudança de estado e ser interrompido.

11 horas atrás, Sérgio Lembo disse:

apenas 1 entrada de interrupção

Alguns (talvez este) só tem um vetor de interrupção. Ou seja qualquer evento, só vai pra lá. Aí sim...

11 horas atrás, Sérgio Lembo disse:

Na rotina de interrupção consulte o GPIO

... algo como

void interrupt qualquer_uma(void)
{
if (RB4) faça_isso();//botão
if (RB5) faça_aquilo();//botão
if (TMR0IF) agora_isso();//timer
if (RXIF) recebe_dado_da_serial();//serial
//...etc
}

...

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

Grande @Isadora Ferraz , sempre certeira! Ler seus códigos sempre me encanta por conseguir o resultado com pouquíssimas linhas.

Não conheço MCU tanto quanto você, mas no exemplo acima colocaste o timer a ser consultado... os periféricos quando setados para para geração de interrupção não costumam gerar endereços distintos? O LX6 da Tensilica  (vulgo ESP) tem um mapa (ISR) com mais de 100 endereços por conta disso. Foi o que observei nos poucos modelos que me atrevi a estudar. Tenho lido pouco sobre os PICs, talvez nessa série seja diferente.

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

  • Membro VIP

Serjão o timer foi só exemplo pra abranger e mostrar que esta família pic a interrupção seja ela qual for, desvia a cabecinha do mc pra um (01) lugar só. Por isso há necessidade de se avaliar "manualmente" com if qual ocorreu. Ou seja, é hard com um pouco de soft. Rapadura é doce mas num é mole não. Dentre elas os exemplos do timer e de algum dado vindo pela serial. No caso do garoto, o foco são os pino RB4 e 5 ou qualquer pino do portb que ele queira.

 

1 hora atrás, Sérgio Lembo disse:

periféricos quando setados para para geração de interrupção não costumam gerar endereços distintos?

Sim pra mc "normal".  Mas os maluco da microchip resolveram meio que economizar e focar as interrups num ponto só, como já disse.

http://www.microcontrollerboard.com/pic_interrupt.html

GIE.jpg

Perceba converjendo pra um ponto só e interrupt no singular. Isso pra esta família "chão de fábrica". Pras d+, que não tenho contato,  provavelmente criaram vergonha na cara e fizeram do jeito tradicional com "cada coisa no seu lugar". Perceba um dado ndv mas curioso: qualquer interrupt acorda ele mas não necessariamente gera interrupção. 

Portanto sim, de fato...

1 hora atrás, Sérgio Lembo disse:

nessa série seja diferente

...

Link para o comentário
Compartilhar em outros sites

2 horas atrás, Isadora Ferraz disse:

Perceba um dado ndv mas curioso: qualquer interrupt acorda ele mas não necessariamente gera interrupção. 

Dá para perceber no mapa o EN nas portas AND e as máscaras verdes.

Tenho visto além da Tensilica (ESP) os baratinhos da Silicon Labs Família EMF8. A subfamília EMF8BB1, a mais econômica, oferece 2 INT e mais 13 origens internas, cada qual com seu endereço particular sendo que em algumas delas (timer, por ex) se tem inúmeras condições que podem ser setadas para o disparo. As limitações de desempenho do core 8051 são bem compensadas pelos 24,5MHz. Para quem gosta de códigos curtos vale a pena o estudo, são timers com comparadores, o manual básico tem 70pg, o completão com descrição dos registros vai para 230pg. O retorno da interrupção é de 2 clocks e a ida 5 para alcançar a função. As origens possuem nível de prioridade caso haja simultaniedade (ordem do scan interno) e uma camada superior de prioridade programável (2 níveis). Caso ocorra um INT high enquanto um INT low é executado a ida vai para 18 clocks, paciência. Caso ocorra um INT de mesma camada ou inferior então fica pendente a execução. Um debug para saber a origem nem quero pesquisar mas até o PIC fazer todos os IFs vai passar de 20 clocks até chegar na rotina apropriada (estou sendo otimista).

Falar de coisa melhor sem olhar para o $$ não vale. O custo/benefício está sempre presente.

Preços da Mouser para apenas 25 peças:

EMF8BB1    US$ 0,34 para 2kB e US$ 0,45 para 8kB, 16 I/O, 24,5MHz

Os ATTINY AVR competem na faixa de preço mas com 6 I/O, menor clock e menos periféricos.

O PIC com 6 I/O, 1,75kB acima de US$ 0,50. Pra mim estudar isso só se for por obrigação.

 

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

  • Membro VIP

Legal este mc. O diferencial quasi-útil que percebo nele é o conversor DA. A qualquer momento analiso se ele tem compilador gratuito. Se você souber, fale agora ou não se cale para sempre.

 

39 minutos atrás, Sérgio Lembo disse:

estudar isso só se for

De fato qualquer mc que seja não é necessariamente necessário estudar todas as funcionalidades a não ser aquelas inerentes ao projeto (óbvio d+?). P.ex. nunca consegui (precisei) fazer um mc conversar com pc via usb. Portanto, caro leitor, nem precisa se assustar com as ...

40 minutos atrás, Sérgio Lembo disse:

230pg

A dica é: num piscar de olhos, leia o básico necessário pra fazer um piscar de led. Pronto. Porta aberta pra dominar o mundo!

 

49 minutos atrás, Sérgio Lembo disse:

Um debug para saber a origem nem quero pesquisar mas até o PIC fazer todos os IFs vai passar de 20 clocks até chegar na rotina apropriada (estou sendo otimista).

Isso não é necessariamente uma limitação. A princípio o projetista do fw estaria ciente disso além do que não é qualquer projeto que deve utilizar todas as interrupts. Eu (eu) p.ex. usei no máximo duas: uma pra varrer displays 7seg e outra pra receber sinal da serial. Algo como apresentar o dado serial de uma balança no display. E de fato foi bem chatinho de fazer. Teve que envolver o lance da prioridade e tudo o +.  Amigos de outro forum me deram dicas preciosíssimas. .. a long time ago...

 

57 minutos atrás, Sérgio Lembo disse:

Dá para perceber no mapa o EN nas portas AND e as máscaras verdes.

nem sei porquê mencionei aquele óbvio ululante. Acho que me confundi com: p.ex. ... ao acordar pelo watch dog, algum mc da microchip não vai pro reset como era de se esperar. Ele continua de onde estava. Função especialmente útil pra sistemas com restrições de consumo.

 

É isso...

Link para o comentário
Compartilhar em outros sites

42 minutos atrás, Isadora Ferraz disse:

Legal este mc. O diferencial quasi-útil que percebo nele é o conversor DA. A qualquer momento analiso se ele tem compilador gratuito. Se você souber, fale agora ou não se cale para sempre

Tá aqui a página dele: https://www.silabs.com/products/development-tools/software/simplicity-studio

Di grátis (saudades do Mussum, grande humorista).

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

  • Membro VIP
1 hora atrás, Sérgio Lembo disse:

Di grátis

Não consegui ter certeza. Por trás daquela belezura toda de IDE parece que ele chama o Keil C e este quase certeza não é de graça. Talvez uma versão demo ou algo do gênero. Não vi a fundo e pode ser que tenha o dele opcional gratuito mesmo...

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Isadora Ferraz disse:

Não vi a fundo e pode ser que tenha o dele opcional gratuito mesmo...

Isso me deixou preocupado.Baixei o IDE Studio, 223MB. No final da instalação me perguntou as coisinhas que eu desejava instalar. Eram tantas opções de pacotes e afins que selecionei global, só não desceu o que necessitava de requisição. Agora estou armado pois até os ARM vieram.

 

Resultado: a pasta SiliconLabs ficou com 10GB. No funcionamento (ainda estou cru nisso) não pareceu ter restrições de funcionalidade.

adicionado 4 minutos depois

No canal deles de Youtube tem uns vídeos (curtíssimos) de tutorial e apresentação. Assistir talvez te anime... ou não! kkk

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
10 horas atrás, Sérgio Lembo disse:

com 10GB

Bem irônico isso. Isso tudo pra gerar um décimo da milésima da milésima parte disso num mísero .hex.

 

Quanto às restrições, só 'o tempo vai dizer'. Ou seja, ...alguns têm limitação de tempo, de tamanho e/ou otimização de código, etc... apesar de que o correto era que isso estivesse explícito. Só procure não ganhar milhões com ele pois algum advogado pode ver letrinhas miúdas no contrato - algum pdf que você não leu -  e tentar estragar seu dia. Mas existe a hipótese de o preço do compilador já estar sendo diluído no do mc, algo como um contrato entre as partes. Aí sim o Mussum tem razão.

 

Quando aos 233MB é uma perfumaria interessante. Sua missão principal é facilitar sua vida ao evitar que você compile seu programa pela linha de comando ao transfromar tudo em clique em campos de opções. P.ex. olha um comando do hitech-c pra compilar um simples pic16f677

picc.exe" -oarquivo.cof -marquivo.map --summary=default,-psect,-class,+mem,-hex --output=default,-inhx032 arquivo.p1 --chip=16F677 -P --runtime=default,+clear,+init,-keep,+osccal,-download,-resetbits,-stackcall,+clib --opt=default,+asm,-debug,-speed,+space,9 --warn=0 --double=24 --float=24 --addrqual=ignore -g --asmlist "--errformat=Error   [%n] %f; %l.%c %s" "--msgformat=Advisory[%n] %s" "--warnformat=Warning [%n] %f; %l.%c %s"

Fala sério... quem em sã consciência haveria de destrinchar o manual pra saber disso?!

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

@Isadora Ferraz , 233MB é a IDE com deguger, visualizador gráfico que mais parece um scope e outras coisinhas. A Silabs tem vários itens, inclusive Iot. Quando escolhi tudo isso incluiu além dos diversos MCUs (8 e 32bits), chips de RF, os pacotes de IOT, sensores, exemplos de código e mais um monte de outras coisas que ainda nem sei para que serve. Fazendo uma carga mais criteriosa provavelmente a pasta terá menos de 1GB.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Legal. Estas coisinhas provavelmente em algum momento vão ter seu valor sim mas certamente este não vai ser o "momento venda" do produto o que a grosso modo é o que efetivamente importa. kk.

De fato me lembro que certa feita usei um logic analyzer que me quebrou 1 galhinho.

Aí... assim que fizer um led piscar com este mc, não te acanhes em compartilhar conosco. Que seja algo como

#include <necessários.h>

#define led PB0_0 //ou que o seu compilador definir como pino de porta

delay(unsigned int dl)
{
while (dl--);
}

main()
{
//inicializa periféricos preferencialmente nenhum
for(;;)
	{
	led^=1
	delay(65535); //o máximo
	}
}

Mundo, se prepare pra se prostrar aos nossos pés!!

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

  • 2 anos depois...
  • Membro VIP

Claro amigo...

#include <necessários.h>

#define leds PORTB //ou que o seu compilador definir como porta
#define botao RA0 //ou o que seu compilador definir como pino de porta
  
main()
{
//inicializa periféricos 
leds=1;  //1 led aceso
for(;;)
	{
	while(botao);//espera pressionar
	leds<<=1; //próximo led
  	if (leds>4) leds=1; //depois do 3 volta pro 1
	}
}

 

1 hora atrás, Kellwin disse:

uma linha de código utilizado três leds e um botão, e todas vez q Clico no botão um LED acende e o outro apaga e assim por diante

 

Link para o comentário
Compartilhar em outros sites

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

GRÁTIS: ebook Redes Wi-Fi

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!